【问题标题】:Ext.onReady() vs $(document).ready()Ext.onReady() 与 $(document).ready()
【发布时间】:2013-01-30 09:55:05
【问题描述】:

有什么区别?我有 $(document).ready 函数,它应该检查是否加载了 extjs,但主要问题是 extjs 没有按时加载并且 $(document).ready 内部的东西开始执行,extjs 创建函数会产生主要错误'无法在 Ext.create("...", {..}) 上执行 create of undefined';线。如果我像这样仔细检查:

$(document).ready(function() {
    Ext.onReady(function() {
        Ext.create('Ext.Button', {...});
    });
});

事情神奇地起作用。现在我正在使用 ext-all.js,它缩小了 ~1.3MB,这是相当大的恕我直言......当他进行第二次检查时,事情会神奇地加载......但我认为这两个函数与它们不一样定义表明,因为如果我放置另一个 $(document).ready 而不是 Ext.onReady() 行,事情就会再次中断。我认为 Ext.onReady({});函数还有其他一些 $(document).ready() 没有的黑魔法,如果有人知道这种魔法是什么,我很感兴趣?

因为它有效,但我不知道为什么会杀了我。

感谢您阅读这篇文章。 =) 附言。我正在使用 ExtJS 大约一天,所以我对它很陌生。

【问题讨论】:

标签: javascript jquery dom extjs extjs4


【解决方案1】:

Ext.onReady() 和 $(document).ready() 与当前接受的答案所暗示的加载任何一个库无关。

根据文档,两者都是关于正在加载和准备好的 DOM。

文档

对您的案件的答复

您可能在脚本触发后加载 Ext JS 资源,但 jQuery 已经在您的脚本上方加载。因此,使用 jQuery 等待 DOM 加载保证了 DOM 已经加载,因此到那时 Ext JS 也已加载。

如果您尝试反转它们并首先使用 Ext JS,您可能会遇到错误。

根据文档,他们正在做同样的事情,所以你不需要嵌套它们

此场景的修复

如果您像这样加载资源:
  1. jQuery
  2. 你的脚本
  3. Ext JS
最好按此顺序加载它们:
  1. jQuery 和/或 Ext JS
    • 顺序无关紧要,因为它们可以独立存在而无需其中之一
  2. 你的脚本

补充说明

由于 DOM 在读取脚本时是如何加载和解析的,它保证了 jQuery 和 Ext JS 可用。这就是为什么您可以在脚本中引用他们的库的原因;您无需等待它们加载它们已经存在并且可以使用,这就是为什么您可以调用它们并使用它们的就绪调用。

您需要使用其中一个库的 ready 事件来保证所有元素都加载到 DOM 中并且可以访问。在准备好之前,您也不应该尝试向 DOM 添加任何内容,尽管您可以附加到已加载到元素/脚本标签上方的当前元素。最好的做法是在 DOM 完成加载之前不要触摸它。

没有人要求的其他解释?

处理 DOM 准备就绪比这些库更复杂,这就是它们都包含这样一个事件处理程序的原因。

以下链接使用 vanilla JS 解释了如何不仅添加事件侦听器,还需要在添加事件侦听器以准备 DOM 时检查它是否已经触发。这是使用事件处理的常见情况 - 您创建一个竞争条件,在您开始侦听之前可能会触发一个事件 - 如果没有其他方法检查,您将不知道它曾经发生过。

https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded#Checking_whether_loading_is_already_complete

【讨论】:

    【解决方案2】:

    不,它们不一样,第一个将在您的 jQuery 库加载时触发,Ext.onReady(.. 将在您的 ExtJS 库加载时触发。

    如果你想组合它们,你可以这样做:

    var extReady = false;
    var jQueryReady = false;
    
    var librariesReady = function () {
        if (jQueryReady && extReady) {
            //They're both ready
        }
    };
    
    $(document).ready(function () {
        jQueryReady = true;
        librariesReady();    
    });
    Ext.onReady(function () {
        extReady = true;
        librariesReady();
    });
    

    【讨论】:

    • 你比我快 :) 好一个+1(你可能会提到脚本的加载顺序,因为这也可能产生错误)
    • 是的,我完全同意它们与它们的定义所暗示的不太一样。我实际上有很多更复杂的故事,但这是解决方案的本质。但是,我仍然想知道他如何检查他是否已加载?如果他没有加载,Ext.onReady() 函数如果库没有按时加载这个函数,是否也会丢弃错误“未定义”?我对自检的整个过程非常感兴趣(extjs 和 jquery)。因为这两个函数的作用确实不同...编辑:+1 from me to =)
    • 好的,我在这里找到了困扰我的答案 ...developer.mozilla.org/en-US/docs/Mozilla_event_reference/… ...谢谢大家的回答,尤其是约翰。
    • 这是错误的。 jQuery 只包含一个 js 文件,因此 无需 等待 jQuery 加载。 jQuery.ready() 检查 DOM 是否准备就绪。 Ext.onReady() 检查是否加载了 ExtJS 类以及 DOM 是否准备就绪。恕我直言,被否决的可怜的@Mini0n 的答案更正确。
    • @MarcoSulla 是正确的,这个答案是不正确的。根据这两个文档,它们用于 DOM 就绪事件处理。也不是关于正在加载的库。我添加了我自己的答案,该答案更深入地了解了正在加载库的想法以及准备好的事件正在完成什么。
    【解决方案3】:

    它们都检查 DOM 何时准备就绪。 如果你在使用jQuery的时候需要加载Ext,试试把逻辑倒过来(不知道能不能用,没试过)。

    Ext.onReady(function() {
        $(document).ready(function() {
            Ext.create('Ext.Button', {...});
        });
    });
    

    关于此主题的另一个 StackOverflow 问题:Extjs + jQuery together

    【讨论】:

    • -2 是因为你错了。当 DOM 准备好时,jquery 准备加载。当 DOM 和 ext 准备就绪时调用 Ext.onReady。
    • 如果他们是一样的,你就不需要打电话给他们了?不幸的是,接受的答案也是错误的。 jQuery 的就绪不是关于库的就绪,它是 DOM 就绪的简写。 vanilla DOM ready 更复杂,这就是人们喜欢 jQuery 的原因 :)
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2011-04-07
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多