ASP.NET服务器控件的jQuery版本冲突解决方案

Ali*_*zmi 0 versioning asp.net jquery custom-server-controls conflict

我正在开发一个ASP.NET服务器控件,它使用jQuery作为一些客户端逻辑.我已将jQuery文件嵌入控件中作为资源.

我不想将使用控件的应用程序限制为特定版本的jQuery,我想继续使用我嵌入的jQuery版本.

我知道noconflict方法,但我看到的问题是我无法控制页面上脚本标签的顺序.

如果用户的jQuery版本包含在我之前,那么在我可以调用noconflict之前,我最终会覆盖它.

请帮忙

T.J*_*der 5

你可以这样做noConflict(true):

var myJQuery = jQuery.noConflict(true);
Run Code Online (Sandbox Code Playgroud)

true参数告诉jQuery jQuery除符号外还释放$符号.只需将其添加到嵌入控件中的jQuery.js文件的末尾即可.

jQuery脚本对冲突很聪明.它做的第一件事就是抓住两者的当前值$并且jQuery将它们松开,这样如果你要求它可以在以后恢复它们.因此,如果您的脚本首先被加载,既$不会jQuery定义也不会定义,新的脚本可以拥有它们.如果您的脚本第二次加载,它将恢复早期$jQuery.

示例:

我们假设您使用的是最新版本(v1.5.1),但页面作者使用的是旧版1.4.4.实际上,通过var jq151 = jQuery.noConflict(true);在1.5.1文件的末尾添加,你就是这样做的:

<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
Run Code Online (Sandbox Code Playgroud)

...除了它们都在一个脚本标签中.有两种可能性:

1)他们先走了:

<script src='jquery-1.4.4.min.js'></script>
<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
Run Code Online (Sandbox Code Playgroud)

实例

2)你先走了:

<script src='jquery-1.5.1.min.js'></script>
<script>var jq151 = jQuery.noConflict(true);</script>
<script src='jquery-1.4.4.min.js'></script>
Run Code Online (Sandbox Code Playgroud)

实例

无论哪种方式,都jQuery$最终指向他们的1.4.4版本,并jq151最终指向你的1.5.1版本.


也许稍微偏离主题,但对于任何认为这有点神奇的人来说,它实际上非常容易.:-)这是一个将重新定义的脚本foo,但如果你要求它恢复以前的定义:

// The script
(function() {
    var globalObject = this, // Or just use `window` on browsers
        oldfoo,
        ourfoo;

    oldfoo = globalObject.foo;
    ourfoo = globalObject.foo = {
        version: "new",
        restorePrevious: restorePrevious
    };

    function restorePrevious() {
        globalObject.foo = oldfoo;
        return ourfoo;
    }
})();
Run Code Online (Sandbox Code Playgroud)

foo上面定义的例子

foo上面定义的示例(如果你想知道为什么这个有效,尽管var foo脚本之后,这里有一些阅读关于穷人,被误解的阅读var)


关于插件:您在下面询问了有关插件的信息.插件通过将属性分配给jQuery.fn(和在某些情况下)的属性来注册自己jQuery,如下所示:

jQuery.fn.makeFoo = function() {
};
Run Code Online (Sandbox Code Playgroud)

通过上面的内容,您可以访问makeFoojQuery实例上的函数(例如$('foo').makeFoo();).一个编写良好的插件将确保它与两者兼容,noConflict()noConflict(true)使用此结构:

(function($) {
    $.fn.makeFoo = function() {
        $(this).addClass("foo");
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

......或者喜欢它的人.(通过以上,我们就从来没有使用jQuery在函数体内参考jQuery的.如果我们想,我们可以添加var jQuery = $;在上面.)

它定义了一个匿名函数并立即调用它,传入当前的全局值jQuery.它接收它作为$ 参数,因此在函数内,符号$始终jQuery它传递给自身的实例.它可以自由使用,$知道它引用了它注册的jQuery的版本.

只有一个写得很好的插件可能会假设它jQuery总是相同的(例如,只能与之一起播放,noConflict()而不是一起播放noConflict(true)).但是你可以解决这些问题.如果遇到一个,请复制一份并放入

(function($) {
    var jQuery = $;
Run Code Online (Sandbox Code Playgroud)

......在顶部和

})(jQuery);
Run Code Online (Sandbox Code Playgroud)

...在底部.99%的时间,这将使其表现.

如果您想在嵌入式jQuery实例中使用插件,最好将它们包含自定义文件中.所以文件内容变成:

  • jQuery脚本
  • (插件脚本)
  • (插件脚本)
  • ...
  • 您的 var jq151 = jQuery.noConflict(true);