Javascript Ajax成功回调具有不同的$.fn KVPs
我正在使用jQuery库。 该库将构造函数jCarouselLite添加到构造函数$/jQuery的原型中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));
$.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,就会出现这种情况。“但是,第一次的输出”您调用的是第一个?回调中的那个?最后那个?(提示,结尾的那一个应该先发生)我喜欢你结尾的注释,因为事实上这仍然是一个与你如何包含脚本有关的问题。:)