我有一些简单的javascript来隐藏和显示我的网页上的文本块,以前工作正常。我最近在assets / javascripts中放置了一个新的javascript库,以便在我的网站上创建其他视觉效果。它工作正常,但现在我的简单的JavaScript不再在线工作,虽然它仍然在本地工作。 Chrome控制台会显示来自库的错误消息(“Uncaught ReferenceError:Raphael未定义”)。
这是否会阻止我的其他javascript在生产服务器上工作,但不能在我的本地开发服务器上工作?如何防止资产中的库加载到其他页面上,这样就不会破坏所有内容?
答案 0 :(得分:1)
是的,这可能会破坏你的其余代码。当您在生产中运行rails时,如果您已经使用了sprokets并将所有内容都需要到application.js中,那么它将被处理为单个文件。如果在该文件中的任何一点javascript代码失败,它将打破文件的其余部分(这非常烦人)
您可以有条件地包含我认为您已经在做错误的raphael库,但是在您的javascript代码中,您还可以检查它是否已定义。我要做的是围绕使用Raphael的代码,使用类似的东西:
if (typeof Raphael !== "undefined") {
... Raphael code goes here...
}
这样,如果未加载库,则无关紧要,您的代码也不会中断,如果加载了,那么您的Raphael特定代码将正常运行:)
更多信息
我也将Raphael库移到供应商目录中。这更有意义,因为这是专门针对您自己未添加/创建的资产。
rails现在自动加载Raphael的原因很可能是由于application.js
的默认配置。默认情况下,rails使用
//= require_tree .
这将包括资产目录中的所有JS文件,这是正常的,但如果你想有条件地包含文件,那就更难尴尬了。
如果你希望它基于每页的条件,你可以改变你的application.html布局来添加一个新的JS包含,只有在被告知时才会包含raphael库(通过一个变量或一些其他机制)
如果您添加以下内容:
<%= javascript_include_tag("raphael") if @raphael %>
显然将raphael更改为库文件的名称实际上是什么,然后只有@raphael变量为true时才包含raphael。您可以在控制器或视图顶部的任何位置进行设置,甚至可以在视图中调用的视图助手中进行设置。完全取决于你