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

时间:2011-03-16 05:56:02

标签: jquery asp.net versioning conflict custom-server-controls

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

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

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

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

请帮忙

2 个答案:

答案 0 :(得分:5)

您可以使用noConflict(true)执行此操作:

var myJQuery = jQuery.noConflict(true);

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

jQuery脚本对冲突很聪明。它做的第一件事就是抓住$jQuery的当前值,然后将它们松开,这样如果你要求它可以恢复它们。因此,如果您的脚本首先加载,则不会定义$jQuery,新的可以使用它们。如果您的脚本第二次加载,则恢复早期的$jQuery

示例

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

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

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

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>

Live example

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>

Live example

无论哪种方式,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;
    }
})();

Example with foo defined before the above

Example with foo defined after the above(如果你想知道为什么这会有效,尽管{/ 1}}在脚本之后是here's some reading读取了可怜的,被误解的{{1} }})


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

jQuery.fn

通过上述内容,您可以访问jQuery实例上的jQuery函数(例如jQuery.fn.makeFoo = function() { }; )。 编写良好的插件将通过使用此结构确保它与makeFoo$('foo').makeFoo();完美匹配:

noConflict()

......或者喜欢它的人。 (有了上述内容,我们从不使用noConflict(true)在函数体中引用jQuery。如果我们想,我们可以在顶部添加(function($) { $.fn.makeFoo = function() { $(this).addClass("foo"); }; })(jQuery); 。)< / p>

它定义了一个匿名函数并立即调用它,传入jQuery的当前全局值。它会将其作为var jQuery = $; 参数接收,因此在函数中,符号jQuery始终成为它的$实例进入了自己。它可以自由地使用$知道它引用了它注册的jQuery的版本。

只有一个写得很好的插件可能会假设jQuery总是相同的(例如,只能与$很好地匹配而不能与jQuery一起使用)。但是你可以解决这些问题。如果遇到一个,请复制一份并放入

noConflict()

...在顶部和

noConflict(true)

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

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

  • jQuery脚本
  • (插件脚本)
  • (插件脚本)
  • ...
  • 您的(function($) { var jQuery = $;

答案 1 :(得分:0)

这是一个很好的解决方案:不要使用jQuery。至少 - 不是一开始。使用javascript等待所有脚本加载,存储值“$”,然后在via脚本标记中注入jQuery,并恢复之前的“$”值。