0

我有一些简单的 javascript 可以在我的网页上隐藏和显示文本块,这些文本块曾经可以正常工作。我最近在 assets/javascripts 中放置了一个新的 javascript 库,以在我的网站上创建其他视觉效果。它工作正常,但现在我的简单 javascript 不再在线工作,虽然它仍然在本地工作。Chrome 控制台显示来自库的错误消息(“Uncaught ReferenceError: Raphael is not defined”)。

这会阻止我的其余 javascript 在生产服务器上工作,但不能在我的本地开发服务器上工作吗?如何防止资产中的库加载到其他页面上,以免破坏一切?

4

1 回答 1

1

是的,这可能会破坏您的其余代码。当您在生产环境中运行 rails 时,如果您使用了 sproket 并且需要将所有内容放入 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 变量为真时包含。你可以在任何地方设置它,无论是在你的控制器中,还是在视图的顶部,甚至在你从视图中调用的视图助手中。完全取决于你

于 2013-05-05T20:52:33.093 回答