使用ASP.NET服务器控件解决jQuery版本冲突

使用ASP.NET服务器控件解决jQuery版本冲突,jquery,asp.net,versioning,conflict,custom-server-controls,Jquery,Asp.net,Versioning,Conflict,Custom Server Controls,我正在开发一个ASP.NET服务器控件,它将jQuery用于某些客户端逻辑。我已将jQuery文件作为资源嵌入控件中 我不想将使用控件的应用程序限制为特定版本的jQuery,我想继续使用我嵌入的jQuery版本 我知道noconflict方法,但我看到的问题是,我无法控制页面上脚本标记的顺序 如果用户版本的jQuery包含在我的之前,那么我将在调用noconflict之前覆盖它 请帮助这里有一个很好的解决方案:不要使用jQuery。至少,一开始不是。使用javascript等待所有脚本加载完毕,

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

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

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

如果用户版本的jQuery包含在我的之前,那么我将在调用noconflict之前覆盖它


请帮助

这里有一个很好的解决方案:不要使用jQuery。至少,一开始不是。使用javascript等待所有脚本加载完毕,存储“$”的值,然后通过脚本标记将jQuery注入,并恢复以前的“$”值。这里有一个很好的解决方案:不要使用jQuery。至少,一开始不是。使用javascript等待所有脚本加载完毕,存储“$”的值,然后通过脚本标记将jQuery插入,并恢复以前的“$”值。您可以使用以下方法执行此操作:

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>

(如果您想知道,尽管
var-foo
在脚本后面,但这为什么会起作用,请仔细阅读可怜的、被误解的
var


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

jQuery.fn.makeFoo = function() {
};
通过以上操作,您可以访问jQuery实例上的
makeFoo
函数(例如,
$('foo').makeFoo();
)。编写良好的插件将通过使用以下结构确保它能够很好地使用
noConflict()
noConflict(true)

(function($) {
    $.fn.makeFoo = function() {
        $(this).addClass("foo");
    };
})(jQuery);
…或者类似的。(有了以上内容,我们永远不会在函数体中使用
jQuery
来引用jQuery。如果我们愿意,我们可以在顶部添加
var jQuery=$;

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

只有编写得比较好的插件才能假定
jQuery
始终是相同的(例如,只使用
noConflict()
而不使用
noConflict(true)
)。不过,你可以解决这些问题。如果你遇到了一个,复制一份,然后

(function($) {
    var jQuery = $;
…在最高层和最高层

})(jQuery);
…在底部。99%的情况下,这会让它表现得很好

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

  • jQuery脚本
  • (插件脚本)
  • (插件脚本)
  • 您的
    var jq151=jQuery.noConflict(true)
您可以通过以下方式完成此操作:

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>

(如果您想知道,尽管
var-foo
在脚本后面,但这为什么会起作用,请仔细阅读可怜的、被误解的
var


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

jQuery.fn.makeFoo = function() {
};
通过以上操作,您可以访问jQuery实例上的
makeFoo
函数(例如,
$('foo').makeFoo();
)。编写良好的插件将通过使用以下结构确保它能够很好地使用
noConflict()
noConflict(true)

(function($) {
    $.fn.makeFoo = function() {
        $(this).addClass("foo");
    };
})(jQuery);
…或者类似的。(有了以上内容,我们永远不会在函数体中使用
jQuery
来引用jQuery。如果我们愿意,我们可以在顶部添加
var jQuery=$;

它定义一个匿名函数并立即调用它,传入当前全局值f
})(jQuery);