草庐IT

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

coder 2024-05-11 原文

我知道这听起来很奇怪,但我需要知道页面中是否有任何事件/正在运行的 javascript。

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

这有可能检测到吗?

编辑:

谢谢大家的回答。不幸的是,我无法找到解决方案,因为我无法完全控制页面上发生的事情。

甚至,我能够将我的 javascript 放在页面的末尾,我认为它不会再成为解决方案。原因是当页面渲染一个函数被触发时,它会调用其他函数,它们会调用其他函数等等。结果,一些数据不正确,这就是为什么我需要运行我的代码来更正它。

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

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

最佳答案

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

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

  • 将代码的脚本标记放在文件的最后。
  • 使用defer and async标签上的属性(它们会被不支持它们的浏览器忽略,但我们的目标是尽可能让您的最后)。
  • 通过 DOM2 样式连接挂接 window load 事件(例如,在支持标准的浏览器上使用 addEventListener,或 attachEvent 在较旧的 IE 版本上)。
  • load 事件中,安排您的代码在 setTimeout 之后运行,延迟为 0 毫秒(它不会真的为零,它会稍微长一些).

因此,script 标签:

<script async defer src="yourfile.js"></script>

...和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
    }
})();

但这并不意味着其他代码不会自行安排稍后运行(例如,通过 setTimeout,就像我们在上面所做的那样,但超时时间更长)。

所以你可以做一些事情来尽量做到最后,但我认为如果没有完全控制页面和在其上运行的脚本,没有任何方法可以真正保证它(我从问题中得到你不知道)。


(* 在某些边缘情况下,线程可以在一个地方挂起,然后允许其他代码在另一个地方运行 [例如,当 ajax 调用完成而 alert 消息正在发送时如图所示,一些浏览器会触发 ajax 处理程序,即使另一个函数正在等待 alert 被关闭],但它们是边缘情况,并且一次仍然只有一件事正在积极完成。)

关于javascript - 检测是否有任何 JavaScript 函数正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790099/

有关javascript - 检测是否有任何 JavaScript 函数正在运行的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  10. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

随机推荐