即使在被注释掉之后,jQuery 代码仍然在执行

Posted

技术标签:

【中文标题】即使在被注释掉之后,jQuery 代码仍然在执行【英文标题】:jQuery code still being executed even after being commented out 【发布时间】:2012-05-26 16:48:55 【问题描述】:

我有一个基本的 .js 文件,里面有这个

//$('#show').html('<%= escape_javascript(render(:partial => 'show')) %>');

当 .js 文件被调用时,上面的代码会被执行并且部分被渲染,即使它被注释掉了。当代码被删除时,部分永远不会被渲染。 DOM 保持不变,但我可以看到服务器在命令行中呈现的部分内容。什么给了?

【问题讨论】:

我们无法从这个角度判断。你清除缓存了吗? 我建议在该行放置一个断点并查看调用堆栈。 @Joseph 我清除了缓存但仍然是相同的行为 是“基础JS文件”还是erb模板? 当你说部分被渲染时,你是说 JavaScript 最终会向用户显示该数据,或者你只是在谈论渲染模板的 Rails。 【参考方案1】:

您正在注释掉在客户端执行的 JavaScript。

在客户端看到渲染的 JavaScript 之前,部分渲染发生在服务器端。

换句话说,注释掉 JavaScript 对 服务器 端处理的影响为零。如果您不希望显示服务器端字符串,请将其注释掉:

<%#= escape_javascript(etc) %>

让我们假设部分渲染是这样的:

<h1>Foo bar baz</h1>
<div>Plugh!</div>

为 JavaScript 转义它会将换行符转换为 \n(并且会转义单引号和双引号等),从而在客户端留下这个:

$('#show').html('<h1>Foo bar baz</h1>\n<div>Plugh!</div>');

无论 JS 是否被注释掉,除非您注释掉 escape_javascript Ruby 代码的结果,否则该部分将呈现。

在客户端,如果 JS 被注释掉,它不应该更新 show 的 HTML——你是说它是?

【讨论】:

但是对部分的调用发生在 JavaScript 中,所以如果注释掉了,调用不应该永远不会通过吗? 不。您的 erb 模板会生成大量 javascript。它不知道那个肿块的含义。 @Steve JavaScript 中没有“内”——这就是我要说的,两种类型的代码在两个不同的地方执行。客户端 JavaScript 在客户端执行,Ruby 在服务器执行。 当 DOM 被初始化时,显示部分还没有被渲染。调用 .js 文件,JavaScript 代码将 #show div 中的内容替换为部分“显示”。据我了解,这是将渲染部分的调用发送到服务器的时候。如果删除此 JavaScript 代码,则发送到服务器的消息永远不会通过。如果 JavaScript 被注释掉,那几乎不等同于删除代码(就解释器看到的而言)。感谢戴夫的帮助 @Steve 不!当客户端看到 JS 文件时,它的部分呈现为字符串,位于 $('#show').html('&lt;&lt;&lt;rendered already&gt;&gt;&gt;'); 代码中。如果您注释掉 JS,仍然会渲染部分内容,因为渲染发生在客户端看到文件之前。查看更新的答案;你是说#show 的 HTML 会在 JS 被注释掉的情况下更新吗?【参考方案2】:

检查这是线路还是您在其他地方有此呼叫:

//$('#show').html('<%=escape_javascript(render(:partial => 'show'))%>');alert('This is the line');

【讨论】:

这条线是因为一旦我删除它,就不再执行对部分的调用【参考方案3】:

也许您的 escape_javascript 函数正在插入换行符?这将结束注释并导致执行换行符之后的任何内容。

【讨论】:

我删除了它仍然是相同的行为 尝试在浏览器中保存 .js 文件。这应该从等式中消除 ruby​​ on rails - 然后您可以正确检查是否有任何换行符被插入到评论中。 escape_javascript 是 Rails 助手; AFAIK 它不会插入随机换行符。【参考方案4】:

我遇到了类似的问题,并想出了一个解决方法来解决我想要的问题。也许这样的事情会帮助你!

不要将代码行注释掉,而是尝试构建一个逻辑运算符,让您在要运行的函数上进行“开/关”切换。我是这样设置的,所以我可以关闭脚本,但保留它以供将来参考:

var toggle = 1; 

if(toggle == 2)
   functions that you want to run when turned on... 

由于您的变量不等于 2,因此 if 语句不会呈现其中存储的内容,从而有效地为您“注释”该代码!要将其重新打开,您只需将“切换”变量更改回 2(或您想要的任何“打开”值)。我为自己找到了一些解决方法,希望对您有所帮助!

【讨论】:

当我问这个问题时,我很难理解为什么问题中引用的嵌入式 Ruby 代码正在执行,即使我认为它已被注释掉。感谢回复,我现在知道嵌入式 Ruby 是在代码被视为 javascript 之前运行的。我想你有点误解了我的问题,再看我的问题确实缺乏细节。我已经编辑了这个问题以增加清晰度。谢谢你的回答。

以上是关于即使在被注释掉之后,jQuery 代码仍然在执行的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 添加元素

除非已注释掉print语句,否则收集的任务不会同时运行。为什么?

即使在钥匙串安全之后,仍然可以在代码中设置凭据

jQuery - 添加元素:很容易地添加新元素/内容

如何在Matlab中注释多行?

即使在父线程死亡或终止之后,子线程如何仍然执行?