检测是否有任何JavaScript函数正在运行

got*_*tqn 12 javascript function

我知道这可能听起来很奇怪,但我需要知道页面中是否有任何活动/正在运行的javascript.

在渲染页面上的所有内容并且所有其他脚本都已完成之后,我必须运行我的javascript/jquery代码.

有可能检测到这个吗?

编辑:

谢谢大家的答案.不幸的是,我无法找到解决方案,因为我无法完全控制页面上的内容.

甚至,我能够将我的javascript放在页面的末尾,我认为它不会再次成为解决方案.原因是当页面呈现时触发了一个函数,它调用其他函数,然后调用其他函数,依此类推.因此,一些数据不正确,这就是为什么我需要运行我的代码来纠正它.

我使用setTimeout 2秒来确保我的代码最后执行,但这很难...

所以,谢谢大家,但这是系统的问题,而不是js.

T.J*_*der 13

Web浏览器上的JavaScript是单线程的(除非使用Web工作者),因此如果您的JavaScript代码正在运行,根据定义,没有其他JavaScript代码在运行.*

为了确保在下载和评估页面上的所有其他JavaScript之后发生脚本,并且在所有渲染发生之后,一些建议:

  • 将代码的脚本标记放在文件的最末尾.
  • 使用deferasync标签上属性(它们会被不支持他们的浏览器被忽略,但我们的目标是让你的最后就像我们可以).
  • window load通过DOM2样式连接挂钩事件(例如,addEventListener在支持标准的浏览器上,或attachEvent在较旧的IE版本上).
  • 在这种情况load下,安排你的代码在setTimeout延迟0ms 之后运行(它实际上不会为零,它会稍长).

所以,script标签:

<script async defer src="yourfile.js"></script>
Run Code Online (Sandbox Code Playgroud)

......和yourfile.js:

(function() {
    if (window.addEventListener) {
        window.addEventListener("load", loadHandler, false);
    }
    else if (window.attachEvent) {
        window.attachEvent("onload", loadHandler);
    }
    else {
        window.onload = loadHandler; // Or you may want to leave this off and just not support REALLY old browsers
    }

    function loadHandler() {
        setTimeout(doMyStuff, 0);
    }

    function doMyStuff() {
        // Your stuff here. All images in the original markup are guaranteed
        // to have been loaded (or failed) by the `load` event, and you know
        // that other handlers for the `load` event have now been fired since
        // we yielded back from our `load` handler
    }
})();
Run Code Online (Sandbox Code Playgroud)

这并不意味着其他代码不会安排自己以后运行(setTimeout例如,就像我们上面做的那样,但是超时时间更长).

所以有一些事情你可以做到最后,但我不相信没有任何方法来实际保证它没有完全控制页面和在其上运行的脚本(我从你不穿的问题"T).


(*有一些边缘情况,线程可以在一个地方暂停,然后允许其他代码在另一个地方运行[例如,当ajax调用在显示alert消息时完成时,某些浏览器会激活ajax处理程序,即使另一个功能正在等待alert被解雇],但它们只是边缘情况,而且一次只有一件事正在积极地完成.)