2009-01-16 76 views
32

我的几个页面的使用jQuery和原型同时使用jQuery和Protoype。由于我升级到JQuery 1.3版本,这似乎是导致问题的原因,因为这两个库定义了一个名为'$'的函数。在同一页面

jQuery提供一个函数noConflict(),它放弃到可以使用它其他库的$控制。所以好像我需要通过我的所有网页看起来像这样:

<head>  
    <script type="text/javascript" src="/obp/js/prototype.js"></script> 
    <script type="text/javascript" src="/obp/js/jquery.js"></script> 
</head> 

并改变它们看起来像这样:

<head>  
    <script type="text/javascript" src="/obp/js/prototype.js"></script> 
    <script type="text/javascript" src="/obp/js/jquery.js"></script> 
    <script type="text/javascript"> 
     jQuery.noConflict(); 
     var $j = jQuery; 
    </script> 
</head> 

我应该那么可以使用“$”替代原型和JQuery的'$ j'(或'jQuery')。我并不完全乐意在每个相关页面中复制这两行代码,并且期望在某些时候有人可能会忘记将它们添加到新页面中。我宁愿能做到以下几点

  • 创建一个文件J所query-noconflict.js其中“包括” jquery.js和我所有的JSP中的两行代码上面
  • 进口jquery-noconflict.js(而不是jquery.js)显示/ HTML页面

但是,我不确定是否有可能以我描述的方式在另一个JS文件中包含一个JS文件?当然,另一种解决方案是直接将上面的两行代码添加到jquery.js中,但如果我这样做,那么每次升级JQuery时都需要记住这一点。

+0

请问我提供给你的作品? – PrimosK 2012-01-16 10:29:32

+1

不知道,已经3年了,因为我问了这个问题... – 2012-01-16 10:49:53

+0

好的.. :)我错过了.. :)但我认为原理是正确的,因为我试过了... – PrimosK 2012-01-16 10:51:20

回答

5

这似乎是最简单的答案是硬着头皮,并注明您的noConflict线。当然,如果您的网页没有使用共享标题,那么该解决方案可能并不是最好的。

1
<script> 
    document.write(unescape('%3Cscript type="text/javascript" src="/obp/js/jquery.js"%3E%3C/script%3E')); 
</script> 
<script> 
    jQuery.noConflict(); 
    var $j = jQuery; 
</script> 

var scripty = document.createElement('script'); 
scripty.href="/obp/js/jquery.js"; 
document.getElementsByTagName('head')[0].appendChild(scripty); 
jQuery.noConflict(); 
var $j = jQuery; 

编辑:

我尝试了这个建议,但最后两行产生错误

jQuery is not defined 
3

我通过这个去了一会儿。这非常烦人,最后我决定清除掉所有旧的Prototype,并用jQuery替换它。我喜欢Prototype处理一些Ajax任务的方式,但不值得维护所有没有冲突的东西。

0

如果我是你,我会放弃我没有冲突的代码转换为JavaScript包含文件像你opined约上方,然后找出一些方法,其中我会设置这些事情,我需要在我的所有页面,包括在一个中心位置。如果您正在使用直接的HTML文件,并且您没有任何类型的模板/脚本功能服务器端以获取文档中包含的内容,则始终可以执行服务器端包含。

无论哪种方式,你会体验到更新每个页面这个时候会再回来的时候,你需要更新您的分析代码或网站页脚的痛苦。

1

你可以先打电话jQuery的,然后设置

var $j = jQuery; 

原型将采取$控制在这种情况下。

或者,您可以通过使用完整的jQuery函数名称(jQuery)来引用jQuery。

2

难道你不只是将jQuery = noConflict()代码包含在jquery.js源文件中?为什么需要这样定义?

0

使用原型下面的jQuery是这样的:

<script type="text/javascript" src="news/jquery-1.2.3.pack.js"></script> 
<script type="text/javascript" src="news/jquery.easynews.js"></script> 


<script type="text/javascript" src="lb/js/prototype.js"></script> 
<script type="text/javascript" src="lb/js/scriptaculous.js?load=effects"></script> 
<script type="text/javascript" src="lb/js/lightbox.js"></script> 
<link href="lb/css/lightbox.css" rel="stylesheet" type="text/css" /> 
在这种情况下,jQuery函数会产生问题,所以你可以用它来解决问题

<script type="text/javascript"> 
    jQuery.noConflict(); 
    var JQ = jQuery;//rename $ function 
</script> 
4

这个解决方案工作得很好:

jQuery.noConflict(); 
var $j = jQuery; 

已经到位的使用$j 210 jQuery代码,如:

$j(document).ready(function() { 
    $j('#div_id').innerfade({ 
     // some stuff 
    }); 
}); 
18

目前,你可以做这样的事情:

<head>   
    <script type="text/javascript" src="/obp/js/prototype.js"></script> 
    <script type="text/javascript" src="/obp/js/jquery.js"></script> 
    <script type="text/javascript"> 
     var $j = jQuery.noConflict(); 
    </script> 
</head> 

然后,使用jQuery作为$j()和原型的$()

1

jquery-noconflict.js应该像这样(确保所有在一行):

document.write("<script type=\"text/javascript\" src=\"/obp/js/jquery.js\"></script><script type=\"text/javascript\">jQuery.noConflict();var $j = jQuery;</script>"); 

...和比你有(因为你已经指出的)应该是这样的:

<head>  
    <script type="text/javascript" src="/obp/js/prototype.js"></script>  
    <script type="text/javascript" src="/obp/js/jquery-noconflict.js"></script> 
</head> 

该解决方案解决了我的所有需求。