如何使JS执行等待?

时间:2016-02-21 11:45:29

标签: javascript dom google-chrome-extension

This is my content and background.js trying to communicate with each other 我在background.js中收到以下错误:

(未知)事件处理程序出错:TypeError:无法读取未定义的属性“data”     在chrome-extension://ijdejodkcfeliecedikgogpmnkjienlh/background.js:107:67handler @ extensions :: uncaught_exception_handler:8(匿名函数)@ extensions :: uncaught_exception_handler:100EventImpl.dispatch_ @ extensions :: event_bindings:376EventImpl.dispatch @ extensions :: event_bindings :393target。(匿名函数)@ extensions :: SafeBuiltins:19publicClass。(匿名函数)@ extensions :: utils:94dispatchOnDisconnect @ extensions :: messaging:296

3 个答案:

答案 0 :(得分:0)

对于Chrome扩展程序,请将脚本设为content script并使用清单中的run_at选项来控制其运行时间;你可能想要'document_end'

  

在" document_end"的情况下,文件在DOM完成后立即注入,但在加载图像和帧之类的子资源之前。

一般来说,有几种方法:

  1. 只需将代码放在标记之后,就可以使用它所依赖的DOM元素。通常情况下,除非您有充分理由做其他事情,否则您的script代码应位于文档的结束之前,就在结束</body>代码之前。上面标记定义的所有元素都可以在那时访问。

    这当然是run_at: 'document_end'基本上正在做的事情。

  2. 将代码放在元素可用时执行的回调中,例如DOMContentLoaded事件或({更晚] window.load事件。如果您正在使用jQuery,它会提供ready回调,使用DOMContentLoaded(如果可以)并回退到其他机制(如果它不能)。

  3. 检测到您已经回复null并使用setTimeout安排代码再次运行。

  4. 对我而言,这些是有用的降序。到目前为止,最简单和最通用的解决方案是#1。

答案 1 :(得分:0)

您可以创建一个异步JavaScript脚本,每隔50ms检查一次该元素,直到它存在。

但是,这只应该用于等到元素出现时才知道它会,因为它会不断检查元素,这会影响最终用户端的性能。

您可以在脚本结尾处增加或降低循环速度。

parent: true

您应该确保您的内容脚本在 // Sets a timer that loops for the time at the end until the following element is found var checkExist = setInterval(function() { // Define element to look for var elementExists = document.querySelector("div.AGUW54C-d-W a"); // Chcek if element exists if (elementExists !== undefined) { // One the element is found, stop the loop clearInterval(checkExist); // Run following code when element exists } }, 50); // Check every 50ms 运行,以减轻上述脚本的性能损失。

  

在“document_end”的情况下,在DOM完成之后立即注入文件,但是在加载了图像和帧之类的子资源之前。 - Google Chrome Documentation

答案 2 :(得分:-2)

在加载和准备就绪时使用Jquery方法:

LoadReady