使用noConflict初始化jQuery插件

时间:2016-07-21 15:48:16

标签: javascript jquery

因此,我正在尝试在请求的限制范围内工作,并取得了一些进展,但仍然被锁定。这是场景:

目前,我正在使用依赖于jQuery v1.4.2的网站。由于我在后端给出的唯一访问是能够将内容注入到CMS驱动的页面中,因此我一直在加载jQuery 1.11以支持一些非常需要的功能。

闪回到昨天,我意识到客户端的开发团队现在捆绑了v1.4和v1.11,并且没有任何关联1.11进入$$。

(function() {
    $$ = $.noConflict( true );  // Move jQuery 1.11.0 into $$ and restore $ to jQuery 1.4.2
})();

// Use the following self-invoking anonymous function 
// when you need to run code that depends on $ = jQuery 1.11
// Otherwise, you can access jquery 1.11 with $$
//  (function( $ ){
// inside here $ is jQuery 1.11
// and jQuery 1.4.2 is out of scope
//  })( $$ );

由于我的脚本(以及我试图加载到页面中的插件)被注入页面中间,而jQuery v1.4和v1.11位于页面底部,我正在加载它方式:

(function checkForJquery(){
    if ('$$' in window) {
        (function($) {
            console.log('success');
            $.getScript("myplugin.jquery.js", function(){
            $( ".devices").myplugin({
                // devices - Array | productID
                prop1: ["prod3960155", "prod3640151", "prod3640152", "prod5530141"],
                prop2: "attribute",
                prop3: "attribute"
            });
        });
    })($$);
    } else {
        console.log('not yet');
        window.setTimeout(checkForJquery, 1000);
    }
})();

所以我遇到的问题是,如果我使用:

(function( $ ){})( $$ );

我什么也没得到 - 插件永远不会初始化。但是,如果我使用:

(function( $ ){})( jQuery );

它确实有效,但后来我无法访问最新的API。任何想法为什么会工作而不是另一个?

为了清楚起见,我正在使用jQuery插件Boilerplate,它的开头是这样的:

;( function( $, window, document, undefined ) { } )( jQuery, window, document );

任何见解都将非常感谢!

谢谢, 乔

1 个答案:

答案 0 :(得分:2)

您的脚本无法工作的原因不是您对插件的调用,而是创建。

为了解释,下面的代码仅使用第二个实例$$来搜索类.devices的所有元素,并启动您的插件myPlugin。没别了。

(function($) {
    $(".devices").myplugin();
})($$);

但您已将您的插件注册到旧版本。当您在上面的代码中使用jQuery而不是$$时,这就是它的工作原因。

要在插件中使用$$ jQuery实例,您还必须在创建时设置它。但是你已经通过了jQuery。因为您使用了noConflict,所以名称jQuery属于旧版本的jQuery。

要将插件注册到正确的实例,您必须在创建时将其更改为$$

;(function($, window, document, undefined){})($$, window, document);

要使插件适用于其他安装,您可以添加jQuery作为后备广告。如果您在其他网站上也使用该插件并且不想每次都更改它,这将有所帮助。

;(function($, window, document, undefined){})($$ || jQuery, window, document);

多数民众赞成。