KnockoutJS& jQuery(noConflict)& prototype.js =冲突?

时间:2012-05-06 09:05:02

标签: javascript jquery prototypejs knockout.js

到目前为止,我一直在使用knockoutJS和jQuery而没有任何问题,但是仅仅在我的html中包含prototype.js文件,在启动应用程序时会导致一些错误。我在开始时运行jQuery.noConflict()以避免jQuery和prototypejs之间的冲突,但显然它没有解决问题。代码和错误如下:

<script type="text/javascript" src="js/jquery/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery-contextmenu.js"></script>
 <script type="text/javascript" src="js/jquery/jquery.tmpl.js"></script>

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

<script type="text/javascript">
   jQuery.noConflict();   
</script>

<!--  knockout library -->
<script type="text/javascript" src="js/knockout-1.2.1.js"></script>
<script type="text/javascript" src="js/knockout.mapping-latest.js"></script>

//////////////

currentServerTree [key] .serverName不是函数 anonymous()knockout-1.2.1.js(第11行)

Za(a=" { text: scoringFunctio...n = __ko_value; } } } ", b=Object { preferenceName=d(), selectedServer=d(), selectedDatabase=d(), more...})knockout-1.2.1.js (line 11)
J()knockout-1.2.1.js (line 44)
j()knockout-1.2.1.js (line 34)
j(e=function(), d=null, b=Object { disposeWhenNodeIsRemoved=textarea#inScoreFunction.inputField, read=function(), disposeWhen=function()})knockout-1.2.1.js (line 36)
J(e=textarea#inScoreFunction.inputField, d=null, b=Object { preferenceName=d(), selectedServer=d(), selectedDatabase=d(), more...}, a="data-bind")knockout-1.2.1.js (line 45)
ua(a=textarea#inScoreFunction.inputField)knockout-1.2.1.js (line 45)
g(a=[input#singleTable.inputField Constant, input#joinTable.inputField Variable, th, 16 more...], b=function())knockout-1.2.1.js (line 8)
ua(e=Object { preferenceName=d(), selectedServer=d(), selectedDatabase=d(), more...}, d=table#attributesTable4)knockout-1.2.1.js (line 45)
()index.jsp (line 1052)
[Break On This Error]   

...rn "+a))();return(new Function("sc","with(sc) { return ("+a+") }"))(b)},Fa:funct...

如果我删除prototype.js行,一切都运行得很好。有什么可能导致问题的原因吗?谢谢!

2 个答案:

答案 0 :(得分:0)

noConflict()的目的是从jQuery中删除“$”符号,从而允许原型使用它。为了使它能够工作,你必须在Prototype实际加载之前运行它:

<script type="text/javascript" src="js/jquery/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery-contextmenu.js"></script>
<script type="text/javascript" src="js/jquery/jquery.tmpl.js"></script>

<script type="text/javascript">jQuery.noConflict();</script>

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

<!--  knockout library -->
<script type="text/javascript" src="js/knockout-1.2.1.js"></script>
<script type="text/javascript" src="js/knockout.mapping-latest.js"></script>

答案 1 :(得分:0)

我认为您可能实际上在代码中的某处使用jQuery,并尝试使用$来访问它。您对jQuery.noConflict();的调用实际上并没有做任何事情,因为稍后会加载原型。它的目的是将$设置回jQuery更改之前的内容,所以如果你在原型之后加载了jQuery,它会将$设置回原型。

看起来你还没有使用原型,因为页面在没有加载的情况下工作,所以尝试在那里保留对原型的引用,并在它之后更改你的.noConflict脚本,看看它是否有效:

<script type="text/javascript">
   $ = jQuery;   
</script>

如果可行,那么你的代码在某处使用$,你需要决定是否要$表示jQuery或原型。