使用document.writeln()重新定义jQuery

时间:2011-03-16 12:30:37

标签: jquery

我正在使用我们网站目前正在使用的Javascript库(> 8000)。 网站正在调用一个引导程序js,它依次会引用其他一些库脚本。

由于我们的JavaScript库大量使用jQuery,它目前也包含在引导程序中。

这是使用document.writeln:

完成的
document.writeln("<script src=\"js\/jquery-1.4.4.min.js\" type=\"text\/javascript\"><\/script>");

我知道document.writeln不符合xHtml并且有更好的解决方案,但这只是它目前适用于我们所有网站并摆脱document.writeln的方式一个选项。

现在的问题是,当网站已经定义了较低版本的jQuery时,我们会遇到冲突。所以,我们决定在我们的库中重新定义jQuery:

document.writeln("<script src=\"js\/jquery-1.4.4.min.js\" type=\"text\/javascript\"><\/script>");
document.writeln("<script type=\"text\/javascript\">");    
document.writeln("   var $myJQuery = jQuery.noConflict();");
document.writeln("</script>");

不幸的是,它没有用。

有人有解决方案吗?

3 个答案:

答案 0 :(得分:4)

jQuery.noConflict()只释放$()而不是jQuery(),这可能是问题所在。您可以尝试手动执行此操作(但请参阅下面的更好方法),如下所示:

<script>
  theOld$ = $;
  theOldjQuery = jQuery;
</script>
<script src=jquery-new-version.js></script>
<script>
  $ = theOld$;
  newjQuery = jQuery;
  jQuery = theOldjQuery;
</script>

更新:更好的方法(感谢T.J.Crowder提示):

<script src=jquery-new-version.js></script>
<script>
  newjQuery = jQuery.noConflict(true);
</script>

请参阅jQuery.noConflict的文档。

答案 1 :(得分:2)

如上所述,由于这一行,它可能无法正常工作:

document.writeln("</script>");

您需要分解字符串中的</script>标记,以防止浏览器看到它并认为脚本在那里结束。 E.g:

document.writeln("<\/script>");

您已使用引用代码中的早期代码完成此操作,但不是新代码。

另请参阅rsp's answer below,您可能需要true noConflict参数才能释放jQuery符号,而不仅仅是$符号。< / p>

答案 2 :(得分:0)

你可能会发现jquery包含在html5boilerplate.com中的方式很有用:

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.5.1.min.js">\x3C/script>')</script>

因此您可以在页面上执行jQuery对象存在的检查以及jQuery版本

// Returns string Ex: "1.5.1"
$().jquery;