我正在使用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回调中使用它,但由于没有找到它,我得到一个引用错误。
我错过了什么吗?
注意:这不是包含脚本包含顺序的问题: 我已经按照适当的顺序包含了脚本,所以请不要将其作为答案。
答案 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两次,这会浪费客户端带宽/电池等,并可能影响加载时间)