即使在被注释掉之后,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('<<<rendered already>>>');
代码中。如果您注释掉 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 代码仍然在执行的主要内容,如果未能解决你的问题,请参考以下文章