对于使用 jQuery 作为依赖项的个人库,我采用了我正在使用的 jQuery 版本,并更改了他们的代码以将 jQuery 附加到我自己的个人对象,而不是直接附加到窗口对象。
所以而不是
window.jQuery
我的jQuery被访问为:
window.myObjectName.jQuery
这工作正常,但是,我现在正在合并jQuery mobile,并且我无法找到jQuery mobile中要更改的代码的哪些部分,以便将其附加到myObjectName下的jQuery。
有没有人可以帮助我解决这个问题?将不胜感激,如果您需要更多信息,请告诉我,谢谢!
我设法为此找到了解决方案,并将为感兴趣的其他人发布解决方案。
j查询移动版 v1.4.5
查看 jQuery Mobile 的美化版本,我们可以看到有多个封装,在此代码的顶部我们可以看到一个名为"root"的参数传入
(function ( root, doc, factory ) {
if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
define( [ "jquery" ], function ( $ ) {
factory( $, root, doc );
return $.mobile;
});
} else {
// Browser globals
factory( root.jQuery, root, doc );
}
}( this, document, function ( jQuery, window, document, undefined ) {/*!
这个顶部函数是一个工厂函数,它调用代码的其余部分。如果记录 "root" 的值,则参数命名空间窗口对象,后跟文档和回调函数。命名空间窗口对象必须从"this"更改为已附加 jQuery 的对象的名称,例如:
}( window.myObject, document, function ( jQuery, window, document, undefined ) {/*!
这几乎可以工作,这还有一个步骤,因为这会导致 jQuery mobile 在代码中的以下三个点引用命名空间窗口对象时抛出错误:
line 1472: window.navigator.userAgent.indexOf("Firefox")
line 1473: window.navigator.userAgent.search(/CriOS/)
line 1499: var ua = window.navigtor.userAgent;
jQueryM 引用的窗口对象是您在上面更改的根命名空间。对这三行代码的简单修复是将变量设置为jQuery Mobile之外的窗口对象,例如:
var pseudoWindow = window;
(function ( root, doc, factory ) {
if ( typeof define === "function" && define.amd ) {
然后为上面的三行代码设置窗口引用以引用此变量
line 1472: pseudoWindow.navigator.userAgent.indexOf("Firefox")
line 1473: pseudoWindow.navigator.userAgent.search(/CriOS/)
line 1499: var ua = pseudoWindow.navigtor.userAgent;
这将成功地使 jQuery mobile 将自身附加到不直接附加到窗口的 jQuery。
仅供文档使用,并回答@twernt,以下是我将jQuery附加到我自己的自定义对象的方法。
如果你打开 jQuery 库,你可以在底部附近找到 jQuery 将自身直接附加到窗口对象的位置:
var
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$;
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
};
// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
我只是相应地更改 jQuery 代码以将其附加到我的对象,如下所示:
var
// Map over jQuery in case of overwrite
_jQuery = window.myObject.jQuery,
// Map over the $ in case of overwrite
_$ = window.$;
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
};
// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
window.myObject.jQuery = window.myObject.$ = jQuery;
}
return jQuery;
所以正如你在这里看到的,jQuery从一开始就不会直接附加到窗口对象,所以直接从窗口(如window.jQuery)引用jQuery是行不通的。