如果您替换整个文档 HTML,@zahanm 答案似乎不起作用,这正是我所需要的。所以我不得不退回到setInterval。基于@shawndumas 的回答,我使用Promise 创建了一种更现代的方法:
function waitUntilSelectorExist(selector, interval = 100, timeout = 20000) {
let intervalId;
let elapsed = 0;
let promise = new Promise(function(resolve, reject) {
intervalId = setInterval(() => {
let element = document.querySelector(selector);
if (element !== null) {
clearInterval(intervalId);
resolve(element);
}
elapsed += interval;
if (elapsed > timeout) {
clearInterval(intervalId);
reject(`The selector ${selector} did not enter within the ${timeout}ms frame!`);
}
}, interval);
});
return promise;
}
我也改用querySelector,所以你可以搜索你喜欢的任何选择器,.class、#id等。
如果函数在文档中找到 querySelector,Promise 将解析,因此您可以将其与新的 await 关键字一起使用。
(async() => {
try {
await waitUntilSelectorExist("#test");
console.log("Do stuff!");
} catch (error) {
console.warn(error); // timeout!
}
})();
当然,如果您真的只是更改文档中的某些元素,您也可以将 MutationObserver 包裹在 Promise 中:
function waitUntilSelectorExist(selector) {
let MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
let promise = new Promise(function(resolve) {
let observer;
observer = new MutationObserver(function(mutations) {
let element = document.querySelector(selector);
if (element !== null) {
observer.disconnect();
resolve();
}
});
observer.observe(document.body, { childList: true, subtree: true });
});
return promise;
}