【发布时间】:2011-02-19 07:21:56
【问题描述】:
我正在使用 jQuery 1.2.6 的页面上开发应用程序,但我想为我的应用程序使用 jQuery 1.4.2。我真的不喜欢像这样使用多个版本的 jQuery,但是页面上的副本(1.2.6)是我无法控制的。我决定像这样隔离我的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<script type="text/javascript" src="jquery-1.2.6.min.js>
<script type="text/javascript" src="pageStuff.js"></script>
</head>
<body>
Welcome to our page.
<div id="app">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="myStuff.js"></script>
</div>
</body></html>
文件 myStuff.js 有我自己的代码,应该使用 jQuery 1.4.2,它看起来像这样:
(function($) { //wrap everything in function to add ability to use $ var with noConflict
var jQuery = $;
//my code
})(jQuery.noConflict(true));
这是一个极其简化的版本,但我希望你能理解我所做的事情。有一段时间,一切正常。但是,我决定在单独的文件中使用 jQuery 插件。我测试了它,它的行为很有趣。经过一番实验,我发现该插件使用的是旧版本的jQuery,而我希望它使用新版本。有谁知道如何从将代码包装在 myStuff.js 中的函数中的上下文中导入和运行 js 文件?
如果这对任何人都很重要,以下是我如何知道插件正在使用旧版本,以及我为解决问题所做的工作:我创建了一个名为 test.js 的文件,其中包含以下行:
alert($.fn.jquery);
我尝试在 myStuff.js 下方以通常包含外部 Javascript 的方式在脚本标记中引用该文件,结果正如我预期的那样,它是 1.2.6。然后我去掉了那个脚本标签并将这一行放在 myStuff.js 中:
$.getScript("test.js");
它仍然以 1.2.6 的形式返回。这并不令人意外——根据jQuery's documentation 的说法,以这种方式包含的脚本是在全局上下文中执行的。然后我尝试这样做:
var testFn = $.proxy($.getScript, this);
testFn("test.js");
它仍然以 1.2.6 的形式返回。经过一番修改,我发现“this”关键字指的是窗口,我假设它是指全局上下文。我正在寻找一些东西来代替“this”来引用封闭函数的上下文,或者以其他方式使文件中的代码从封闭函数运行。我注意到,如果我复制并粘贴代码,它可以正常工作,但它是一个在许多地方使用的大插件,我不想让我的文件与他们的代码混淆。我没主意了。其他人知道怎么做吗?
【问题讨论】:
-
简而言之,这么多,很多的东西都没有考虑到这一点,你不能运行2个版本的jQuery并且让你的插件开箱即用,拥有
window.jQuery的人将赢得这场战斗。另外...您将客户端的 javascript 负载加倍,您应该找到解决此问题的不同方法。 -
您应该关闭所有带有
</script>的<script>标签。以防万一您遇到一些语法问题(仅基于您上面提供的代码) -
你要插入哪个插件
-
我在上面的示例中添加了结束脚本标签。我一直在我的项目中使用结束脚本标签。问题与此无关。我正在尝试使用 jCarousel 插件。你可以在sorgalla.com/jcarousel看到它。
标签: javascript jquery