Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等待元素存在?_Javascript_Jquery_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 如何等待元素存在?

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

我正在研究Chrome的一个扩展,我想知道:当一个元素出现时,最好的方法是什么?使用纯javascript,间隔检查直到元素存在,或者jQuery有一些简单的方法来实现这一点吗?

您可以这样做

$('#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();