如何获得内容脚本加载后,页面的JavaScript执行了?(How to get a content

2019-07-05 14:06发布

我的扩展应该加载内容脚本,searchTopic.js,只有它的注入已经完全载入网页后(是的,我已经设置“run_at”在扩展清单“document_end”),但实际上它是在装货前已创建的所有的DOM对象(关键是那些在页面中通过一些JavaScript创建)。 所以,问题是,我怎么能等到页面的JavaScript执行了? 这里是我的清单:

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

Answer 1:

"run_at": "document_end"是等同于DOMContentLoaded 。 也就是说, 静态的HTML被加载后触发,但在此之前缓慢的图像和缓慢整理的JavaScript。

所以你不能设置内容脚本页面的JS火后,仅仅通过单独设置清单。 您必须在内容脚本本身对这个代码。

对于内容的脚本, "run_at": "document_end"将在之前进行发射onload事件(不同于默认document_idle -可在不可预测的时间开火)。

所以,第一步是要等待load ,像这样在你的内容的脚本(代码事件searchTopic.js ):

window.addEventListener ("load", myMain, false);

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


在你关心的脚本需要一段时间才能完成的情况下,你将不得不轮询根据具体情况逐案一些条件。 例如:

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.
        }
    }
}


Answer 2:

script元素以顺序执行。 浏览器甚至停止,如果有DOM内容加载script中的节点body 。 这是保证工作,否则document.write()将停止工作。

所以,你有两种解决方案:

  1. 使用onload事件加载你的代码。
  2. 添加脚本标记的页面(在最后一件事的最后一个元素body元素)。 所有其它脚本已经完成之后,该脚本会被执行,并且身体已经转换为DOM树后。


Answer 3:

您可以使用window.load方法。

function addLoadEvent(a) {
    var b = window.onload;
    "function" != typeof window.onload ? window.onload = a : window.onload = function () {
        b && b(),
            a()
    }
}
function init() {
    alert('init');
}
addLoadEvent(init);


文章来源: How to get a content script to load AFTER a page's Javascript has executed?