测试是否加载了jquery而不使用文档就绪事件

时间:2011-01-07 09:11:52

标签: jquery document-ready

在我的网站上,我有一个jquery函数,可以在加载页面后立即从另一个(安全的)服务器检索数据。使用jsonp调用我当前在文档就绪事件后加载此数据:

<script type="text/javascript">
    $(document).ready(function () {
       $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
            initPage(data);
        });
    });
</script>

我对上述调用不喜欢的是,jsonp实际上可以在文档就绪事件之前被执行,从而减慢页面加载速度。因此,如果我在页面中包含jquery(即不使用脚本标记引用),则以下代码工作正常并且页面加载速度更快:

<script type="text/javascript">
    $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
        $(document).ready(function () {
            initPage(data);
        });
    });
</script>

但是在每个页面中包含jquery是一个23k的开销,我想避免。我如何测试是否已加载jquery并且只有在加载jquery时才执行initPage()函数?

编辑: 更确切地说,如果加载了jquery,我需要反复检查,然后执行该事件。计时器工作可能是解决方案..

解决方案: 我创建了一个执行jquery检查的preinit。我的页面加载速度不快:)。感谢大家!

   function preInit() 
   {
       // wait until jquery is loeaded
       if (!(typeof jQuery === 'function')) {
           window.setTimeout(function () {
               //console.log(count++);
               preInit();
           }, 10);  // Try again every 10 ms..
           return;
       }
           $.getJSON(_secureHost + '/base/members/current.aspx?callback=?',
            function (data) {
                $(document).ready(function () {
                    initPage(data);
                });
            });
       }

6 个答案:

答案 0 :(得分:5)

我认为你可以使用

if (jQuery) {
   ...
}

查看jQuery对象是否存在。

好的,更好的是:

if (typeof jQuery !== 'undefined') {
   ...
}

if (typeof jQuery === 'function') {
   ...
}

编辑:

不要担心开销或是否加载了jQuery对象。如果您只使用常规<script src="...">标记包含jQuery库,然后执行不带$(document).ready的代码,请执行以下操作:

<script type="text/javascript">
   $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
        initPage(data);
    });
</script>

它会起作用。 $(document).ready部分只是为了确保在您尝试更改尚未加载的DOM元素之前已完全加载DOM。 jQuery库本身,包括Ajax功能,将立即存在。

现在,如果您的initPage(data)调用使用了DOM,我认为它确实存在,那么可以对其进行检查,如下所示:

<script type="text/javascript">
    function initPage(data) {
        var $domObject = $('#your-dom-object');
        if ($domObject.length === 0) { // Dom object not loaded yet.
            window.setTimeout(function() {
                initPage(data);
            }, 0); // Try again after other stuff has finished.
            return;
        }
        // Do your regular stuff here.
    }
</script>

但是,我不认为在大多数情况下这是必要的。

答案 1 :(得分:1)

只要您将包含jQuery的脚本标记放在运行您的函数的脚本标记之上,那么它应该可以正常工作。

将脚本包装在此而不是就绪函数中可能会有所帮助:

(function() {
    // Your code here
})();

答案 2 :(得分:0)

您可以添加加载完成功能或网格完成功能,如下所示,这将有助于您在jqgrid上执行某些操作

 height : '550',
    width : '787',
    loadComplete : function() {}
    gridComplete:function(){}

答案 3 :(得分:0)

您好我认为您应首先检查是否为jquery并且您要使用的方法是否已定义

  

if(typeof(jQuery)!='undefined'&amp;&amp; typeof($。ajax)!='undefined'){
       //你的代码将来到这里                   }

答案 4 :(得分:0)

  

我不喜欢上述内容   调用,实际上是jsonp   在文件准备好之前完成   事件

你知道吗?!请注意您可能仍然有图像loading..etc
我想你需要使用:

$(window).load(function() {
    $.getJSON(_secureHost + '/base/members/current.aspx?callback=?', function (data) {
        initPage(data);
    });
});  

Link

答案 5 :(得分:0)

我使用的是footable jquery插件。这对我有用:

if ( $.fn.footable) 
{...}

jquery版本 - 1.9.1 足部版本 - 0.5