我见过许多类似的问题,但实际上没有人回答我的问题。我认为这很简单,但我想这不是因为JS是单线程的。
基本上,我想从一个html元素中提取信息,该元素通过eventlistener插入,等待点击特定的html元素。使用jQuery看起来像这样:
chrome.runtime.onMessage.addListener(
function(request, sender, sendBack) {
$(".clickme").click(); // Invoke
var result = $("#main-text").attr("src"); // Exists only when ".clickme" was clicked
sendBack(result);
});
上述代码存在的问题是#main-text
仅在.clickme
s click
的特定事件监听器后才存在。登记/>
并且在我为其分配result
值之前,不会执行eventlisteners
我如何等待事件监听器完成?
答案 0 :(得分:2)
如果不知道要更改属性需要多长时间,我会使用MutationObserver:
chrome.runtime.onMessage.addListener(function(request, sender, sendBack) {
$(".clickme").click();
var target = $("#main-text")[0];
new MutationObserver(function(mutations, observer) {
if (target.src) {
sendBack(target.src);
observer.disconnect();
}
}).observe(target, {
attributes: true,
attributeFilter: ['src'],
});
// keep the message channel open while waiting
return true;
});
否则一个简单的setTimeout就可以解决这个问题
只是不要忘记return true
以保持频道畅通。