рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЖрдУ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рди рдЯрд╛рдЗрдо рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рд╕рднреА рддреАрди рдмрд╛рд░ рдЪрд▓рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд -- рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ document_start
ред
рдореЗрд░реЗ рдЕрдм рддрдХ рдХреЗ рд╢реЛрдз рдХреЗ рд▓рд┐рдП https://github.com/arantius/greasemonkey/tree/8a255bde1aa6312715740fd0157d582a2d6cb183 рджреЗрдЦреЗрдВ, рдЬрд╣рд╛рдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ:
tabs.executeScript()
рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВредрдпрд╣ "рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЛрдИ рднреА рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреАрдиреЛрдВ рд░рди рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ webNavigation
рдХрд╛ onBeforeNavigate
рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрдж рд╣реИ , рдпрд╣ (рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ) рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЧ рд▓рдЧрддреА рд╣реИ, рдЬрдм рд╡рд░реНрддрдорд╛рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд▓рд╛ рдмрд┐рдВрджреБ onCommitted
, рдФрд░ рдЙрд╕ рд╕рдордп рд╢реБрд░реВ рд╣реЛрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рдЗрдирд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИрдВред
рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд░рдирд╛:
webRequest
рдХреЗ рдмрдЬрд╛рдп webNavigation
ред рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд▓ рджреЗрддрд╛ рд╣реИ?рдкреБрди: https://bugzilla.mozilla.org/show_bug.cgi?id=1332273#c8
рдореИрдВ рдПрдХ рдмреНрд▓реЙрдм (рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ) рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдмрд╛рдж рдореЗрдВ (рдХреЗрд╡рд▓) рдЙрд╕рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕ рдпреВрдЖрд░рдПрд▓ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ) рдХреЛ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдкреГрд╖реНрда рдЗрдВрдбреЗрдХреНрд╕рдб рдбреАрдмреА рдореЗрдВ рдмреНрд▓реЙрдмреНрд╕ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдкрд░ URL.createObjectURL() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдкреАрдЖрдИ рдореЗрдВ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░
Firefox рдкрд░ рдирд┐рдЬреА рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдореЛрдб рдЕрдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ?
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ?
рдпрд╣ document_start
рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИ: (рд╕рдВрднрд╡рддрдГ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдЯреИрдм рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
// execute `document_start` scripts here...
document.addEventListener("DOMContentLoaded", event => {
// execute `document_end` scripts here...
});
window.addEventListener("load", event => {
// execute `document_idle` scripts here...
});
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ: (рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
let run = [false, false, false];
document_start();
if (document.readyState === "complete") {
document_idle();
} else if (document.readyState === "interactive") {
document_end();
}
document.onreadystatechange = () => {
switch (document.readyState) {
case "loading": break;
case "interactive": document_end();
case "complete": document_idle();
}
};
function document_start() {
if (run[0]) return;
run[0] = true;
// execute `document_start` scripts here...
}
function document_end() {
if (!run[0]) document_start();
if (run[1]) return;
run[1] = true;
// execute `document_end` scripts here...
}
function document_idle() {
if (!run[1]) document_end();
if (run[2]) return;
run[2] = true;
// execute `document_idle` scripts here...
}
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ рд╕рдордп рдкрд░ рдЪрд▓рддреА рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП manifest.json
рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: (рд╢рд╛рдпрдж рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА (рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ))
"content_scripts": [
{
"matches": ["<all_urls>"],
"run_at": "document_start",
"js": ["document_start_handler.js"]
},
{
"matches": ["<all_urls>"],
"run_at": "document_end",
"js": ["document_end_handler.js"]
},
{
"matches": ["<all_urls>"],
"run_at": "document_idle",
"js": ["document_idle_handler.js"]
}
]
jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: (рдлрд┐рд░ рд╕реЗ, document_start
рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди jQuery рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
function document_start() {
// execute `document_start` scripts here...
}
function document_end() {
// execute `document_end` scripts here...
}
function document_idle() {
// execute `document_idle` scripts here...
}
// Use jQuery to execute all the functions:
document_start();
// `$(document).ready(document_end)` is deprecated since 3.0
$(document_end);
// jQuery used to have a method for this: `$(window).load(document_idle)`
if (document.readyState === "complete") {
document_idle();
} else {
$(window).on("load", document_idle);
}
рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдпрд╣ рдореБрджреНрджрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: