【问题标题】:How to call a function after a div is ready?div准备好后如何调用函数?
【发布时间】:2013-06-12 17:30:53
【问题描述】:

我的 javascript 文件中有以下内容:

var divId = "divIDer";

jQuery(divId).ready(function() {
  createGrid();  //Adds a grid to the html
});

html 看起来像:

<div id="divIDer"><div>

但有时我的 createGrid() 函数会在我的 divIder 实际加载到页面上之前被调用。因此,当我尝试渲染我的网格时,它找不到正确的 div 指向并且永远不会渲染。我的 div 完全可以使用后如何调用函数?

编辑:

我正在使用 Extjs 加载 div:

var tpl = new Ext.XTemplate(
'<div id="{divId}"></div>');

tpl.apply({

});

【问题讨论】:

  • 你是如何加载你的 div 的?使用 ajax 吗?
  • DIV 没有就绪事件
  • 我想jQuery(divId) 永远找不到任何东西,你错过了 ID 选择器#
  • ready 事件仅在 DOM 完全加载时触发...根据 jQuery API 文档
  • @Grammin,检查我的答案。我想它会帮助你。 :)

标签: javascript jquery html


【解决方案1】:

您可以在此处使用递归来执行此操作。例如:

jQuery(document).ready(checkContainer);

function checkContainer () {
  if($('#divIDer').is(':visible'))){ //if the container is visible on the page
    createGrid();  //Adds a grid to the html
  } else {
    setTimeout(checkContainer, 50); //wait 50 ms, then try again
  }
}

基本上,此函数将检查以确保元素存在且可见。如果是,它将运行您的createGrid() 函数。如果没有,它将等待 50 毫秒,然后重试。

注意:理想情况下,您只需使用 AJAX 调用的回调函数来了解容器何时被附加,但这是一种蛮力的独立方法。 :)

【讨论】:

  • 我在 iframe 上加载五个页面,其中一个页面是谷歌地图地理编码,我在窗口加载时调用一个函数来对地址进行地理编码,但是当第一页加载时该函数触发在 iframe 中,我尝试了 document.ready,wind.load,if($(div).is(:visible)) 但一切都在 iframe 上的第一页加载时触发,当我们单击下一步时,googlemap 排在第三位3次然后googlemap转过来!! ——
  • 嘿@Mohit,我认为你最好在一个新问题中真正布置你的代码。在评论上下文中很难理解。如果您在此处链接您的新问题,我会关注它,看看是否可以提供帮助。 :)
【解决方案2】:

到目前为止,“侦听”DOM 事件(例如插入或修改 元素)的唯一方法是使用称为 Mutation Events时间>。比如

document.body.addEventListener('DOMNodeInserted', function( event ) {
    console.log('whoot! a new Element was inserted, see my event object for details!');
}, false);

进一步阅读:MDN

变异事件的问题是(是)由于不一致和其他原因,它们从未真正进入任何官方规范。一段时间后,这个事件在所有现代浏览器中都实现了,但它们被声明为 deprecated,换句话说 你不想使用它们。


变异事件的官方替换MutationObserver()对象。

进一步阅读:MDN

目前的语法是这样的

var observer = new MutationObserver(function( mutations ) {
    mutations.forEach(function( mutation ) {
         console.log( mutation.type );
    }); 
});

var config = { childList: true };

observer.observe( document.body, config );

目前,该 API 已在较新的 Firefox、Chrome 和 Safari 版本中实现。我不确定 IE 和 Opera。所以这里的权衡绝对是你只能针对顶级浏览器。

【讨论】:

  • 我真的觉得应该有更多的人使用它,尤其是涉及到 ajax 调用时
  • 从 2018 年开始,我们是否应该使用 js Promises 来处理这种情况?或者 DOM 节点是不可能的?
【解决方案3】:

在从函数.load() 加载某些 div 之后执行某些操作。 我认为这正是您所需要的:

  $('#divIDer').load(document.URL +  ' #divIDer',function() {

       // call here what you want .....


       //example
       $('#mydata').show();
  });

【讨论】:

    【解决方案4】:

    通过 jQuery.ready 函数,您可以指定在加载 DOM 时执行的函数。 整个 DOM,而不是你想要的任何 div。

    所以,你应该以不同的方式使用 ready

    $.ready(function() {
        createGrid();
    });
    

    这是在您不使用 AJAX 加载 div 时的情况

    【讨论】:

      【解决方案5】:

      &lt;div&gt;&lt;/div&gt; 元素中,您可以调用 $(document).ready(function(){}); 执行命令,例如

      <div id="div1">
          <script>
              $(document).ready(function(){
               //do something
              });
          </script>
      </div>
      

      你可以对你拥有的其他 div 做同样的事情。 如果您通过部分视图加载 div,这很合适

      【讨论】:

      • 这是一个正义的黑客。我认为你取消了保修。我正在使用这个。
      • 据我所知,这将加载 DOM(并使用它加载脚本),但仍然仅在整个页面准备好时才执行,因为您将其放入 $(document).ready()。删除它,它会工作,但我假设这不是 Grammin 可以使用的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2017-12-29
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多