Ajax Success Callback有不同的$ .fn KVP

时间:2015-06-29 18:57:42

标签: javascript jquery ajax

我正在使用jQuery库jcarousellite。 该库将构造函数jCarouselLite添加到构造函数$ / jQuery的原型中。

$.fn.jCarouselLite=function(){ /*"LOTS OF CODE HERE"*/ }

我有一个jQuery ajax调用(我使用$ .ajax),这是在文件就绪事件($(document).ready)上调用成功回调,成功回调有以下代码:

 console.log(Object.getOwnPropertyNames($.fn));

我在正文结束之前包含内联/内部脚本,它具有与上面相同的代码:

console.log(Object.getOwnPropertyNames($.fn));

但是,第一个console.log的输出不包含构造函数jCarouselLite,而第二个console.log的输出包含它。 我想在第一个Ajax回调中使用它,但由于没有找到它,我得到一个引用错误。

我错过了什么吗?

注意:这不是包含脚本包含顺序的问题: 我已经按照适当的顺序包含了脚本,所以请不要将其作为答案。

1 个答案:

答案 0 :(得分:1)

你包括jQuery两次,这就是我所知道的。

假设您有以下代码,注释日志输出:

<强>的jquery.js

<强> jquery.foo.js:

multiple: true

<强> mycode.js:

(function ($) {
    'use strict';
    $.fn.foo = function () {
        console.log("Hello World!");
        return this;
    };
}(jQuery));

如果你将jQuery包含两次,或者你从原型中删除了属性,那么foo在一秒钟之后变为未定义的唯一方法就是如此。 jQuery中的任何内容都不会从原型中删除属性,因此结论必须是包括jQuery两次。 jQuery的第二个副本没有初始化插件,因此,1秒后,当您记录原型(在jQuery的新副本上)时,它不再具有插件。

为了证明这一点,如果您将代码修改为以下代码,它应该可以工作,无论jQuery被包含两次:

console.log($.fn.foo); // function
setTimeout(function () {
    console.log($.fn.foo); // undefined
}, 1000);

修复它的原因是它需要(function ($) { console.log($.fn.foo); // function setTimeout(function () { console.log($.fn.foo); // function }, 1000); }(jQuery)); 的值并将其存储,以便在jQuery更改时,您的代码不会受到影响。如果它在1秒后继续记录未定义,您将知道原型正在被更改。 (您仍然应该避免使用jQuery两次,这会浪费客户端带宽/电池等,并可能影响加载时间)