如何在页面';s的Javascript已经执行了吗?

如何在页面';s的Javascript已经执行了吗?,javascript,google-chrome-extension,content-script,Javascript,Google Chrome Extension,Content Script,我的扩展应该在注入的页面已经完全加载(是的,我在扩展清单中将“run_at”设置为“document_end”)之后才加载内容脚本searchTopic.js,但实际上它是在创建所有DOM对象之前加载的(关键的对象是通过页面中的一些Javascript创建的)。所以,问题是,我如何等待页面的Javascript执行完毕?这是我的舱单: "content_scripts": [ { "run_at": "document_end", "matches": ["https://group

我的扩展应该在注入的页面已经完全加载(是的,我在扩展清单中将“run_at”设置为“document_end”)之后才加载内容脚本searchTopic.js,但实际上它是在创建所有DOM对象之前加载的(关键的对象是通过页面中的一些Javascript创建的)。所以,问题是,我如何等待页面的Javascript执行完毕?这是我的舱单:

"content_scripts": [
  {
  "run_at": "document_end",
  "matches": ["https://groups.google.com/forum/*"],
  "js": ["searchTopic.js"]
  }
],
也就是说,它在加载静态HTML之后启动,但在缓慢的图像和缓慢的javascript完成之前启动

因此,您不能仅通过设置清单就将内容脚本设置为在页面的JS之后启动。您必须在内容脚本本身中为此编写代码

对于内容脚本,
“run\u at”:“document\u end”
将在
onload
事件之前触发(与默认的
document\u idle
不同,它可能在不可预知的时间触发)

因此,第一步是等待
load
事件在您的内容脚本(
searchTopic.js
)中出现这样的代码:


如果您所关心的脚本需要一段时间才能完成,那么您必须根据具体情况轮询某些条件。例如:

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

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

因此,您有两种解决方案:

  • 使用
    onload
    事件加载代码
  • 添加一个脚本标记作为页面的最后一个元素(正文中的最后一个元素)。此脚本将在所有其他脚本完成后执行,并且在主体转换为DOM树后执行

  • 您可以使用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);
    

    你无法预测未来。您找到的任何解决方案都是特定于您编写脚本的情况的。尝试播放
    窗口.onload
    事件,或者通过一种使用计时器的轮询来检测页面何时处于所需状态。您无法知道何时会执行所有javascript。它在解析时只运行一次,但是它的操作(DOM操作、进一步的脚本加载)可能会在以后发生,由任何事件触发——我担心这些对您来说都是有趣的。或者可以动态加载脚本。或者可以加载脚本,但包含的/链接的代码需要一点时间才能完成初始化。
    窗口。onload
    等待
    异步
    /
    延迟
    脚本加载和执行,因此这比在页面底部添加脚本效果更好。(请参阅“
    下载外部脚本必须延迟加载事件。
    ”页上的。)等待异步脚本行为(Ajax,
    设置超时
    ,事件)的一般问题仍然存在,但这无法以一般方式解决。这就是问题:我正在查看的页面()没有任何可预测的条件进行轮询;至少,我找不到。顺便说一句,答案1和答案2到底发生了什么?它确实有这样一个条件,否则你不能说
    searchTopic.js
    加载得太早。您到底想做什么,以及在控制台上收到什么错误消息(如果有的话)。。。“答案1和答案2”是什么意思?这个问题的一个答案被它的海报删除了。这并没有解决你的问题。@Haveagess,是的,它们会起作用(通常),但在实践中往往会变得棘手。一个简单得多的计时器每次都能工作,更健壮,更便携。计时器建议+1。在尝试了突变观察者的方法之后,我可以证明它变得很棘手。
    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);