Sunday, June 2, 2024
174
rated 0 times [  180] [ 6]  / answers: 1 / hits: 47873  / 12 Years ago, mon, december 17, 2012, 12:00:00

My extension is supposed to load a content script, searchTopic.js, only after the page it's injected into has already fully loaded (yes, I have set run_at to document_end in the extension manifest), but in fact it's loading before all the DOM objects have been created (the crucial ones are created via some Javascript in the page). So, the question is, how can I wait until the page's Javascript has executed? Here's my manifest:



content_scripts: [
{
run_at: document_end,
matches: [https://groups.google.com/forum/*],
js: [searchTopic.js]
}
],

More From » google-chrome-extension

 Answers
16

run_at: document_end is the equivalent to DOMContentLoaded. That is, it fires after the static HTML is loaded, but before slow images and slow finishing javascript.



So you cannot set a content script to fire after the page's JS, just by setting the manifest alone. You must code for this in the content script itself.



For content scripts, run_at: document_end will fire before the onload event (unlike the default document_idle -- which can fire at unpredictable times).



So, the first step is to wait for the load event with code like this in your content script (searchTopic.js):



window.addEventListener (load, myMain, false);

function myMain (evt) {
// DO YOUR STUFF HERE.
}




In the case where the script you care about takes a while to finish, you will have to poll for some condition on a case-by-case basis. For example:



window.addEventListener (load, myMain, false);

function myMain (evt) {
var jsInitChecktimer = setInterval (checkForJS_Finish, 111);

function checkForJS_Finish () {
if ( typeof SOME_GLOBAL_VAR != undefined
|| document.querySelector (SOME_INDICATOR_NODE_css_SELECTOR)
) {
clearInterval (jsInitChecktimer);
// DO YOUR STUFF HERE.
}
}
}

[#81377] Saturday, December 15, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
julieth

Total Points: 382
Total Questions: 99
Total Answers: 85

Location: Cape Verde
Member since Fri, Nov 27, 2020
4 Years ago
;