javascript - 如何在运行脚本之前检查元素是否已加载到页面上?

标签 javascript jquery html

所以我在我的公司模板中创建我的页面,它只允许我们访问页面的主体。我们无权访问 head 标签,并且在我们无权访问的页面下部加载了脚本。其中一个脚本将元素动态加载到页面上。我需要在该元素上运行另一个脚本,但是因为在我的脚本运行之后该元素才加载到页面上,所以我无法访问该元素。有没有一种方法可以在运行我的脚本之前检查该元素是否已加载到页面上?

如果我需要更好地解释,请告诉我。

<head>Don't have access</head>


<body>
   <!--Needs to manipulate the element created by the companyScript.js--> 
   <script src="myScript.js"></script>

   <!--Script that runs after mine, which I don't have access too-->
   <script src="companyScript.js">
       /*Dynamically adds <div class="element"></div> to page*/
   </script>
</body>

最佳答案

2022 版本,带有 MutationObserver

重写了 2020 年的代码以使用 MutationObserver而不是轮询。

/**
 * Wait for an element before resolving a promise
 * @param {String} querySelector - Selector of element to wait for
 * @param {Integer} timeout - Milliseconds to wait before timing out, or 0 for no timeout              
 */
function waitForElement(querySelector, timeout){
  return new Promise((resolve, reject)=>{
    var timer = false;
    if(document.querySelectorAll(querySelector).length) return resolve();
    const observer = new MutationObserver(()=>{
      if(document.querySelectorAll(querySelector).length){
        observer.disconnect();
        if(timer !== false) clearTimeout(timer);
        return resolve();
      }
    });
    observer.observe(document.body, {
      childList: true, 
      subtree: true
    });
    if(timeout) timer = setTimeout(()=>{
      observer.disconnect();
      reject();
    }, timeout);
  });
}

waitForElement("#idOfElementToWaitFor", 3000).then(function(){
    alert("element is loaded.. do stuff");
}).catch(()=>{
    alert("element did not load in 3 seconds");
});

2020 版,有 promise

此代码将以 10 次/秒的速度轮询 DOM,并在可选超时之前解决 promise 。

/**
 * Wait for an element before resolving a promise
 * @param {String} querySelector - Selector of element to wait for
 * @param {Integer} timeout - Milliseconds to wait before timing out, or 0 for no timeout              
 */
function waitForElement(querySelector, timeout=0){
    const startTime = new Date().getTime();
    return new Promise((resolve, reject)=>{
        const timer = setInterval(()=>{
            const now = new Date().getTime();
            if(document.querySelector(querySelector)){
                clearInterval(timer);
                resolve();
            }else if(timeout && now - startTime >= timeout){
                clearInterval(timer);
                reject();
            }
        }, 100);
    });
}


waitForElement("#idOfElementToWaitFor", 3000).then(function(){
    alert("element is loaded.. do stuff");
}).catch(()=>{
    alert("element did not load in 3 seconds");
});

原始答案

function waitForElement(id, callback){
    var poops = setInterval(function(){
        if(document.getElementById(id)){
            clearInterval(poops);
            callback();
        }
    }, 100);
}

waitForElement("idOfElementToWaitFor", function(){
    alert("element is loaded.. do stuff");
});

关于javascript - 如何在运行脚本之前检查元素是否已加载到页面上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863788/

相关文章:

javascript - 使用 $_FILES 而不是字段名称的 codeigniter upload->do_upload()

javascript - jquery .hover() 与 else if 语句

javascript - AJAX/jquery 不适用于返回的 PHP 站点

javascript - 实现通用的实时协作编辑器/插件(如 Google Docs)

javascript - 工厂注入(inject)指令不起作用

javascript - JetBrains Webstorm 是否有用于复制当前函数的键盘快捷键?

javascript - 将 JavaScript 变量传递给 jQuery DataTable 中的 razor 函数

javascript - 限制 Web Worker CPU 利用率?

javascript - 如何使使用 replaceWith 添加的 html 的单选按钮的更改事件起作用

javascript - 关于使用 Zurb 的 Foundation+AngularJS 的想法?