【问题标题】:KnockoutJS & jQuery(noConflict) & prototype.js = conflict?KnockoutJS & jQuery(noConflict) & prototype.js = 冲突?
【发布时间】:2012-05-15 05:04:11
【问题描述】:

到目前为止,我一直在使用 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 行,一切都会正常运行。知道可能导致问题的原因吗?谢谢!

【问题讨论】:

  • 你真的不应该在开发过程中使用缩小的库。既然已经有了 jQuery,为什么还需要原型?!
  • 我得到了一些预先写好的原型代码,我被要求在应用程序中实现(据说已经完成,因此是缩小版),我宁愿不必转换为 jQuery,尽管我假设这是可能的。
  • 你使用 jQuery 吗?你在任何地方都使用 $ 吗?什么是 currentServerTree?
  • 是的,我确实使用 jQuery。我已经消除了'$' 的所有实例并用'jQuery' 替换它们。 currentServerTree 是一个 var,分配了一个可淘汰的 observable
  • 该错误听起来好像 serverName 未设置或不是可观察的,您要么在代码中调用 serverName() 要么绑定是......我不知道为什么除非某些 Ajax 调用正在更新您的模型并且未将其映射到可观察对象,否则与原型/jquery 有任何关系。一个更全面的例子会有所帮助......

标签: javascript jquery prototypejs knockout.js


【解决方案1】:

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>

【讨论】:

  • docs.jquery.com/Using_jQuery_with_Other_Libraries 但是,您可以在 jQuery 和其他库都加载后的任何时候调用 jQuery.noConflict() 来覆盖该默认值。感谢您的回复,但它不起作用,并且与上述链接的建议相反。
【解决方案2】:

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

看起来您还没有使用原型,因为页面在未加载时仍然有效,因此请尝试将原型的引用保留在其中,然后将您的 .noConflict 脚本更改为此以查看它是否有效:

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

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

【讨论】:

  • 感谢您的意见。尝试加载 jquery,然后加载原型,然后运行您建议的代码,并得到 $ 不是函数 [Break On This Error] element = $(element);以及之前的错误
猜你喜欢
  • 2015-04-07
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2023-03-08
  • 2012-09-21
  • 2011-03-07
  • 2014-07-20
相关资源
最近更新 更多