在我的JS代码中(零宽度空间)字符。 他们从哪里来的?

我正在使用NetBeans IDE 7.0.1开发Web应用程序的前端。 最近我有一个非常讨厌的bug,我终于修好了。

说我有代码

var element = '<input size="3" id="foo" name="elements[foo][0]" />'; $('#bar').append(element); 

我注意到,当我看到该size属性在Chrome中不起作用时(在其他浏览器中未检查到),出现了问题。 当我在Inspector中打开这个元素时,它被解释为类似的东西

 <input id="&quot;3&quot;" name="&quot;elements[foo][0]&quot;" size="&quot;foo&quot;" /> 

这很奇怪。 在手动重新inputelementstring字符后,错误消失了。 当我撤销这个改变时,我注意到Netbeans在我的旧代码中提醒了我一些Unicode字符。 它是一个在每个'='之后的零宽度空间,在'] ['和string的结尾之间。 所以string显示正常,因为零宽度空间不显示,但在逃脱他们后,我的string是

 '<input size=\u200b"3" id=\u200b"foo" name=\u200b"elements[foo]\u200b[0]" />\u200b' 

现在,我到底在哪里得到他们?

我不知道我从哪里复制了element的代码,但它绝对是下列之一:

  • 具有HTML模板文件的Netbeans编辑器的其他窗格;
  • Google Chrome Inspector,“以HTML格式复制”操作;
  • 谷歌浏览器源代码页面(非常怀疑)。

但是我不能用这两种方法来重现这个错误。

我在Windows 7下使用Netbeans 7.0.1和Google Chrome 13.0。没有键盘切换器或类似的东西在运行。 此外,我使用Git进行版本控制,但是我没有取出这些代码,所以Git是不太可能的。 这不可能是我同事的一个愚蠢的笑话,因为他们很有礼貌。

任何build议谁搞砸了我的代码?

这是黑暗中的刺

我敢打赌Google Chrome Inspector。 通过铬源search ,我发现了下面的代码块

  if (hasText) attrSpanElement.appendChild(document.createTextNode("=\u200B\"")); if (linkify && (name === "src" || name === "href")) { var rewrittenHref = WebInspector.resourceURLForRelatedNode(node, value); value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B"); attrSpanElement.appendChild(linkify(rewrittenHref, value, "webkit-html-attribute-value", node.nodeName().toLowerCase() === "a")); } else { value = value.replace(/([\/;:\)\]\}])/g, "$1\u200B"); var attrValueElement = attrSpanElement.createChild("span", "webkit-html-attribute-value"); attrValueElement.textContent = value; } 

我很可能在这里简单地叫了一个错误的树,但是在显示属性的时候,它看起来像是插入了零宽度的空格(来处理软文本换行?)。 也许“复制为HTML”function没有正确地删除它们?


更新

经过Chrome元素检查员的摆弄之后,我几乎相信这是你的\u200b所在。 注意,行不仅可以在可见空间中进行换行,而且可以在后面的=或者字符与/([\/;:\)\]\}])/由于插入的零宽度空间进行匹配。

铬检查员截图

不幸的是,我无法复制你的问题,他们无意中被包括到剪贴板(我在Win XP上使用Chrome 13.0.782.112)。

如果您能够重现该行为,那么提交错误报告肯定值得。

正如肖恩先生已经解决了这个问题。 我刚刚复制的问题,而我从网页上复制粘贴jQuery代码。

发生时:将Google Chrome 41.0.2272.118 m(未通过其他浏览器testing)的文本复制到Dreamweaver代码窗口。 这样沿着代码复制不需要的字符就像这里发生的一样

你从网页复制文本为

 $('.btn-pageMenu').css('display'​​​​​​​​​​​​​​​​​​​​​​​​​​​,'block');​​​​​​ 

在幕后,这是什么使这条线

 <code><span class="pun">&#8203;</span><span class="pln">$</span><span class="pun">(</span><span class="str">'.btn-pageMenu'</span><span class="pun">).</span><span class="pln">css</span><span class="pun">(</span><span class="str">'display'</span><span class="pun">&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;,</span><span class="str">'block'</span><span class="pun">);&#8203;&#8203;&#8203;&#8203;&#8203;&#8203;</span></code> 

复制到像你提到的那样的高级编辑器,或者Dreamweaver在浏览器中给出错误,也可能失败的JavaScript代码

 Uncaught SyntaxError: Unexpected token ILLEGAL 

解决scheme:当它发生时,请记住笔记本的价值,直到被大个子解决。 这与编辑和浏览器更相关。

这应该为你解决:

var element = $('<input size="3" id="foo" name="elements[foo][0]" />'); $('#bar').append(element);

或者你可以这样做,使其更清洁:

$('#bar').append($('<input />').attr({ size: '3', id: 'foo', name: 'elements[foo][0]' }));