猿问

jQuery选择器值转义

我有一个包含一系列选项的下拉列表:


<select id=SomeDropdown>

  <option value="a'b]&lt;p>">a'b]&lt;p></option>

  <option value="easy">easy</option>

<select>

请注意,选项值/文本包含一些讨厌的东西:


单引号

关闭方括号

转载html

我需要删除a'b] <p>选项,但我没有运气写选择器。无论是:


$("#SomeDropdown >option[value='a''b]&lt;p>']");

要么


$("#SomeDropdown >option[value='a\'b]&lt;p>']");

正在返回选项。


使用“value =”选择器时,转义值的正确方法是什么?


达令说
浏览 594回答 3
3回答

繁星淼淼

我认为你不能。它应该是:#SomeDropdown >option[value='a\'b]<p>']这确实可以作为CSS选择器(在现代浏览器中)。用JavaScript字符串文字表示,你自然需要另一轮转义:$("#SomeDropdown >option[value='a\\'b]<p>']")但是这在jQuery中不起作用,因为它的选择器解析器并不完全符合标准。它使用此正则表达式来解析条件的value一部分[attr=value]:(['"]*)(.*?)\3|)\s*\]\ 3是包含开头报价的组,奇怪的是允许多个开头报价,或根本没有开盘报价。。*?然后可以解析任何字符,包括引号,直到它击中第一个']'字符,结束匹配。反斜杠转义CSS特殊字符没有规定,因此您无法在jQuery中匹配任意字符串值。(再次,正则表达式解析器丢失。)但好消息是你不必依赖jQuery选择器; 你可以使用非常好的DOM方法,特别是HTMLSelectElement.options:var select= document.getElementById('SomeDropdown');for (var i= select.options.length; i-->0;) {&nbsp; &nbsp; if (select.options[i].value=="a'b]<p>") {&nbsp; &nbsp; &nbsp; &nbsp; // do something with option}&nbsp; &nbsp;}这比要求jQuery费力地解析和实现你的选择器要简单快多倍,你可以使用你喜欢的任何值字符串,而不必担心转义特殊字符。

梦里花落0921

我使用这个函数来转义jquery选择器。它基本上逃脱了一切可疑但可能过于激进。函数escapeStr(str)&nbsp;{&nbsp; &nbsp; if(str)&nbsp; &nbsp; &nbsp; &nbsp; return str.replace(/([#;?%&,。+ *〜\':“!^ $ [\]()=> | \ / @])/ g,'\\ $ 1');&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 返回str;}

九州编程

使用.filter()自定义功能。txt应该包含你讨厌的字符串,或者你可以indexOf用你选择的任何其他函数替换。$("#SomeDropdown option")&nbsp; &nbsp;.filter(function(i){&nbsp; &nbsp; &nbsp; &nbsp;return $(this).attr("value").indexOf(txt) != -1;&nbsp; &nbsp;})&nbsp; &nbsp;.remove();
随时随地看视频慕课网APP
我要回答