Javascript 如何等待元素存在?
我正在研究Chrome的一个扩展,我想知道:当一个元素出现时,最好的方法是什么?使用纯javascript,间隔检查直到元素存在,或者jQuery有一些简单的方法来实现这一点吗?您可以这样做Javascript 如何等待元素存在?,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我正在研究Chrome的一个扩展,我想知道:当一个元素出现时,最好的方法是什么?使用纯javascript,间隔检查直到元素存在,或者jQuery有一些简单的方法来实现这一点吗?您可以这样做 $('#yourelement').ready(function() { }); 请注意,只有当从服务器请求元素时,该元素存在于DOM中,这才有效。如果元素是通过JavaScript动态添加的,它将不起作用,您可能需要查看其他答案。您可以收听DOMNodeInserted或domsubtremodifi
$('#yourelement').ready(function() {
});
请注意,只有当从服务器请求元素时,该元素存在于DOM中,这才有效。如果元素是通过JavaScript动态添加的,它将不起作用,您可能需要查看其他答案。您可以收听
DOMNodeInserted
或domsubtremodified
事件,每当将新元素添加到DOM时,这些事件都会触发
还有一个jQuery插件,可以在创建新元素时进行检测:
$("#future_element").livequery(function(){
//element created
});
我也有同样的问题,所以我继续写了一篇文章
$(选择器).waitUntilExists(函数)代码>
代码:
由于性能问题,DOMNodeInserted
与其他DOM突变事件一起被弃用-推荐的方法是使用监视DOM。不过,它只在较新的浏览器中受支持,因此当MutationObserver
不可用时,您应该回到domandeinserted
let observer=new MutationObserver((突变)=>{
突变。forEach((突变)=>{
如果(!mutation.addedNodes)返回
for(设i=0;i
图书馆怎么样
insertionQuery使用附加到选择器的CSS动画回调,该选择器指定在创建元素时运行回调。此方法允许在创建元素时运行回调,而不仅仅是第一次
来自github:
非dom事件捕获显示的节点的方式。它使用选择器
这不仅仅是为了更广泛的浏览器支持,在某些方面它可能比DOMMutationObserver更好。
为什么?
- 因为DOM事件会降低浏览器的速度,而insertionQuery不会
- 因为DOM Observer的浏览器支持比insertionQuery少
- 因为使用insertionQuery,您可以使用选择器过滤DOM更改,而不会产生性能开销李>
广泛支持!
IE10+以及大部分其他内容(包括移动设备)
下面是一个核心JavaScript函数,用于等待元素的显示(好吧,为了更准确地将其插入DOM中)
此调用将每隔1000毫秒查找其id=“div1”
的HTML标记。如果找到该元素,它将显示一条警报消息Hi。如果在9000毫秒后未找到任何元素,则此函数将停止执行
参数:
selector
:字符串:此函数查找元素${selector}
回调
:函数:如果找到元素,将调用该函数
checkFrequencyInMs
:编号:此函数每隔${checkFrequencyInMs}毫秒检查此元素是否存在
timeoutims
:编号:可选。此函数在${timeoutims}毫秒后停止查找元素
NB:选择器在中进行了解释,这里有一个函数,它充当MutationObserver的薄包装。唯一的要求是浏览器支持MutationObserver;对JQuery没有依赖性。运行下面的代码段以查看工作示例
函数WaitFormation(父节点、isMatchFunc、handlerFunc、observeSubtree、disconnectAfterMatch){
var defaultIfUndefined=函数(val,defaultVal){
返回(typeof val==“未定义”)?默认值:val;
};
observeSubtree=defaultIfUndefined(observeSubtree,false);
disconnectAfterMatch=defaultIfUndefined(disconnectAfterMatch,false);
var观察者=新的突变观察者(功能(突变){
突变。forEach(功能(突变){
if(突变加节点){
对于(var i=0;i;(function ($, window) {
var intervals = {};
var removeListener = function(selector) {
if (intervals[selector]) {
window.clearInterval(intervals[selector]);
intervals[selector] = null;
}
};
var found = 'waitUntilExists.found';
/**
* @function
* @property {object} jQuery plugin which runs handler function once specified
* element is inserted into the DOM
* @param {function|string} handler
* A function to execute at the time when the element is inserted or
* string "remove" to remove the listener from the given selector
* @param {bool} shouldRunHandlerOnce
* Optional: if true, handler is unbound after its first invocation
* @example jQuery(selector).waitUntilExists(function);
*/
$.fn.waitUntilExists = function(handler, shouldRunHandlerOnce, isChild) {
var selector = this.selector;
var $this = $(selector);
var $elements = $this.not(function() { return $(this).data(found); });
if (handler === 'remove') {
// Hijack and remove interval immediately if the code requests
removeListener(selector);
}
else {
// Run the handler on all found elements and mark as found
$elements.each(handler).data(found, true);
if (shouldRunHandlerOnce && $this.length) {
// Element was found, implying the handler already ran for all
// matched elements
removeListener(selector);
}
else if (!isChild) {
// If this is a recurring search or if the target has not yet been
// found, create an interval to continue searching for the target
intervals[selector] = window.setInterval(function () {
$this.waitUntilExists(handler, shouldRunHandlerOnce, true);
}, 500);
}
}
return $this;
};
}(jQuery, window));
// Call the below function
waitForElementToDisplay("#div1",function(){alert("Hi");},1000,9000);
function waitForElementToDisplay(selector, callback, checkFrequencyInMs, timeoutInMs) {
var startTimeInMs = Date.now();
(function loopSearch() {
if (document.querySelector(selector) != null) {
callback();
return;
}
else {
setTimeout(function () {
if (timeoutInMs && Date.now() - startTimeInMs > timeoutInMs)
return;
loopSearch();
}, checkFrequencyInMs);
}
})();
}
var existCondition = setInterval(function() {
if ($('#the_Element_ID').length) {
console.log("Exists!");
clearInterval(existCondition);
doTheRestOfTheStuff(parameters);
}
}, 100); // check every 100ms
/**
* @brief Wait for something to be ready before triggering a timeout
* @param {callback} isready Function which returns true when the thing we're waiting for has happened
* @param {callback} success Function to call when the thing is ready
* @param {callback} error Function to call if we time out before the event becomes ready
* @param {int} count Number of times to retry the timeout (default 300 or 6s)
* @param {int} interval Number of milliseconds to wait between attempts (default 20ms)
*/
function waitUntil(isready, success, error, count, interval){
if (count === undefined) {
count = 300;
}
if (interval === undefined) {
interval = 20;
}
if (isready()) {
success();
return;
}
// The call back isn't ready. We need to wait for it
setTimeout(function(){
if (!count) {
// We have run out of retries
if (error !== undefined) {
error();
}
} else {
// Try again
waitUntil(isready, success, error, count -1, interval);
}
}, interval);
}
waitUntil(function(){
return $('#myelement').length > 0;
}, function(){
alert("myelement now exists");
}, function(){
alert("I'm bored. I give up.");
});
new MutationObserver( mutation => {
if (!mutation.addedNodes) return
mutation.addedNodes.forEach( node => {
// do stuff with node
})
})
// Wait for element to exist.
function elementLoaded(el, cb) {
if ($(el).length) {
// Element is now loaded.
cb($(el));
} else {
// Repeat every 500ms.
setTimeout(function() {
elementLoaded(el, cb)
}, 500);
}
};
elementLoaded('.element-selector', function(el) {
// Element is ready to use.
el.click(function() {
alert("You just clicked a dynamically inserted element");
});
});
function waitFor(selector) {
return new Promise(function (res, rej) {
waitForElementToDisplay(selector, 200);
function waitForElementToDisplay(selector, time) {
if (document.querySelector(selector) != null) {
res(document.querySelector(selector));
}
else {
setTimeout(function () {
waitForElementToDisplay(selector, time);
}, time);
}
}
});
}
"use strict";
function waitUntilElementLoaded(selector) {
var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var start = performance.now();
var now = 0;
return new Promise(function (resolve, reject) {
var interval = setInterval(function () {
var element = document.querySelector(selector);
if (element instanceof Element) {
clearInterval(interval);
resolve();
}
now = performance.now();
if (now - start >= timeout) {
reject("Could not find the element " + selector + " within " + timeout + " ms");
}
}, 100);
});
}
"use strict";
function waitUntilElementsLoaded(selector) {
var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var start = performance.now();
var now = 0;
return new Promise(function (resolve, reject) {
var interval = setInterval(function () {
var elements = document.querySelectorAll(selector);
if (elements instanceof NodeList) {
clearInterval(interval);
resolve(elements);
}
now = performance.now();
if (now - start >= timeout) {
reject("Could not find elements " + selector + " within " + timeout + " ms");
}
}, 100);
});
}
waitUntilElementLoaded('#message', 800).then(function(element) {
// element found and available
element.innerHTML = '...';
}).catch(function() {
// element not found within 800 milliseconds
});
waitUntilElementsLoaded('.message', 10000).then(function(elements) {
for(const element of elements) {
// ....
}
}).catch(function(error) {
// elements not found withing 10 seconds
});
function _waitForElement(selector, delay = 50, tries = 250) {
const element = document.querySelector(selector);
if (!window[`__${selector}`]) {
window[`__${selector}`] = 0;
}
function _search() {
return new Promise((resolve) => {
window[`__${selector}`]++;
console.log(window[`__${selector}`]);
setTimeout(resolve, delay);
});
}
if (element === null) {
if (window[`__${selector}`] >= tries) {
window[`__${selector}`] = 0;
return Promise.reject(null);
}
return _search().then(() => _waitForElement(selector));
} else {
return Promise.resolve(element);
}
}
const start = (async () => {
const $el = await _waitForElement(`.my-selector`);
console.log($el);
})();
const waitUntilElementExists = (selector, callback) => {
const el = document.querySelector(selector);
if (el){
return callback(el);
}
setTimeout(() => waitUntilElementExists(selector, callback), 500);
}
waitUntilElementExists('.wait-for-me', (el) => console.log(el));
// Wait for element to exist.
function imageLoaded(el, cb,time) {
if ($(el).length) {
// Element is now loaded.
cb($(el));
var imageInput = $('input[name=product\\[image_location\\]]');
console.log(imageInput);
} else if(time < 10000) {
// Repeat every 500ms.
setTimeout(function() {
time = time+500;
imageLoaded(el, cb, time)
}, 500);
}
};
var time = 500;
imageLoaded('input[name=product\\[image_location\\]]', function(el) {
//do stuff here
},time);
<script>
(function exists() {
if (!document.querySelector('<selector>')) {
return setTimeout(exists);
}
// code when element exists
})();
</script>
function waitForElm(selector) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
}
waitForElm('.some-class').then(elm => console.log(elm.textContent));
const elm = await waitForElm('.some-classs')
function getElement(selector, i = 5) {
return new Promise(async (resolve, reject) => {
if(i <= 0) return reject(`${selector} not found`);
const elements = document.querySelectorAll(selector);
if(elements.length) return resolve(elements);
return setTimeout(async () => await getElement(selector, i-1), 1000);
})
}
// Now call it with your selector
try {
element = await getElement('.woohoo');
} catch(e) { // catch the e }
//OR
getElement('.woohoo', 5)
.then(element => { // do somthing with the elements })
.catch(e => { // catch the error });
const wait_until_element_appear = setInterval(() => {
if ($(element).length !== 0) {
// some code
clearInterval(wait_until_element_appear);
}
}, 0);
function waitForElement(selector, delay = 1000, tries = 10) {
const element = document.querySelector(selector);
// creates a local variable w/ the name of the selector to keep track of all tries
if (!window[`__${selector}`]) {
window[`__${selector}`] = 0;
}
function _search() {
return new Promise((resolve) => {
window[`__${selector}`]++;
console.log(window[`__${selector}`]);
setTimeout(resolve, delay);
});
}
//element not found, retry
if (element === null) {
if (window[`__${selector}`] >= tries) {
window[`__${selector}`] = 0;
return Promise.reject(null);
}
return _search().then(() => waitForElement(selector));
} else {
return Promise.resolve(element);
}
}
async function wait(){
try{
const $el = await waitForElement(".llama");
console.log($el);
} catch(err){
console.error("Timeout - couldn't find element.")
}
}
wait();