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
答案 0 :(得分:0)
对于Chrome扩展程序,请将脚本设为content script并使用清单中的run_at
选项来控制其运行时间;你可能想要'document_end'
:
在" document_end"的情况下,文件在DOM完成后立即注入,但在加载图像和帧之类的子资源之前。
一般来说,有几种方法:
只需将代码放在标记之后,就可以使用它所依赖的DOM元素。通常情况下,除非您有充分理由做其他事情,否则您的script
代码应位于文档的结束之前,就在结束</body>
代码之前。上面标记定义的所有元素都可以在那时访问。
这当然是run_at: 'document_end'
基本上正在做的事情。
将代码放在元素可用时执行的回调中,例如DOMContentLoaded
事件或({更晚] window.load
事件。如果您正在使用jQuery,它会提供ready
回调,使用DOMContentLoaded
(如果可以)并回退到其他机制(如果它不能)。
检测到您已经回复null
并使用setTimeout
安排代码再次运行。
对我而言,这些是有用的降序。到目前为止,最简单和最通用的解决方案是#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)