Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax成功回调具有不同的$.fn KVPs_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript Ajax成功回调具有不同的$.fn KVPs

Javascript Ajax成功回调具有不同的$.fn KVPs,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在使用jQuery库。 该库将构造函数jCarouselLite添加到构造函数$/jQuery的原型中 $.fn.jCarouselLite=function(){ /*"LOTS OF CODE HERE"*/ } 我有一个jQuery ajax调用(我使用$.ajax),它是在调用成功回调的document ready事件($(document).ready)上进行的,成功回调有以下代码: console.log(Object.getOwnPropertyNames($.fn));

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

$.fn.jCarouselLite=function(){ /*"LOTS OF CODE HERE"*/ }
我有一个jQuery ajax调用(我使用$.ajax),它是在调用成功回调的document ready事件
($(document).ready)
上进行的,成功回调有以下代码:

 console.log(Object.getOwnPropertyNames($.fn));
我在正文结束之前包含内联/内部脚本,其代码与上面相同:

console.log(Object.getOwnPropertyNames($.fn));
但是,第一个
console.log
的输出不包含构造函数
jCarouselLite
,而第二个
console.log
的输出包含它。 我想在第一个Ajax回调中使用它,但由于找不到它,所以我得到了一个引用错误

我错过什么了吗

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

您已经包含了两次jQuery,下面是我如何知道的

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

jquery.js

jquery.foo.js:

(function ($) {
    'use strict';
    $.fn.foo = function () {
        console.log("Hello World!");
        return this;
    };
}(jQuery));
console.log($.fn.foo); // function
setTimeout(function () {
    console.log($.fn.foo); // undefined
}, 1000);
mycode.js:

(function ($) {
    'use strict';
    $.fn.foo = function () {
        console.log("Hello World!");
        return this;
    };
}(jQuery));
console.log($.fn.foo); // function
setTimeout(function () {
    console.log($.fn.foo); // undefined
}, 1000);
foo在一秒钟后变为未定义的唯一方法是两次包含jQuery,或者从原型中删除属性。jQuery中的任何内容都不会从原型中删除属性,因此结论必须是您包含jQuery两次。jQuery的第二个副本没有初始化插件,因此,1秒后,当您记录原型(在jQuery的新副本上)时,它不再有插件

为了证明这一点,如果您将代码修改为以下内容,那么不管jQuery包含两次,它都应该可以工作:

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

修复它的原因是它接受
jQuery
的值并将其存储,以便在
window.jQuery
发生更改时,您的代码不会受到影响。如果它在1秒后继续记录未定义,您将知道原型正在更改。(您仍然应该避免两次包含jQuery,这会浪费客户端带宽/电池等,并可能影响加载时间)

如果两次包含jQuery,就会出现这种情况。“但是,第一次的输出”您调用的是第一个?回调中的那个?最后那个?(提示,结尾的那一个应该先发生)我喜欢你结尾的注释,因为事实上这仍然是一个与你如何包含脚本有关的问题。:)