Ext.onReady()vs $(document).ready()

时间:2013-01-30 09:55:05

标签: javascript jquery dom extjs extjs4

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

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

事情神奇地起作用。现在我正在使用ext-all.js,它有~1.3MB的缩小,这是非常大的imho ......当他进行第二次检查时,事情变得神奇地加载......但我认为这两个函数不同于它们定义建议,因为如果我放入另一个$(document).ready而不是Ext.onReady()行,事情就会再次破裂。我想Ext.onReady({});函数做了一些其他黑魔法,$(document).ready()没有,如果有人知道这种魔法是什么,我很感兴趣?

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

感谢您阅读该帖子。 =) PS。我正在使用ExtJS大约一天,所以我对它很陌生。

3 个答案:

答案 0 :(得分:21)

不,它们不一样,第一个将在你的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 :(得分:0)

他们都检查DOM何时准备就绪。 如果在使用jQuery时需要加载Ext,请尝试反转逻辑(不知道它是否可行,还没试过)。

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

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

答案 2 :(得分:0)

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

相关问题