如何将jQuery Mobile附加到我自己的jQuery命名空间版本



对于使用 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是行不通的。

相关内容

最新更新