在我的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=""3"" name=""elements[foo][0]"" size=""foo"" />
这很奇怪。 在手动重新inputelement
string字符后,错误消失了。 当我撤销这个改变时,我注意到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">​</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">​​​​​​​​​​​​​​​​​​​​​​​​​​​,</span><span class="str">'block'</span><span class="pun">);​​​​​​</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]' }));