【问题标题】:What chars needs escaping in querySelector?querySelector 中需要转义哪些字符?
【发布时间】:2014-05-14 20:40:55
【问题描述】:

根据这里的文档:https://developer.mozilla.org/en-US/docs/Web/API/document.querySelector#Notes

它说在查询选择器时需要转义一些字符:

匹配不遵循 CSS 语法的 ID 或选择器(通过使用 例如冒号或空格不恰当),您必须转义 带有反斜杠的字符。因为反斜杠是转义字符 在 JavaScript 中,如果您输入的是文字字符串,则必须转义 它两次(一次用于 JavaScript 字符串,另一次用于 查询选择器):

我希望编写一个对字符串进行转义但需要知道哪些字符需要先转义的函数。

谢谢

【问题讨论】:

    标签: javascript css


    【解决方案1】:

    更新答案:

    在下面的评论中你说:

    我正在制作一个 firefox 插件,我正在通过label 中的属性识别项目(因为所有项目的类都相同)。所以querySelector('[label="blah blah blah"]') 和用户可以编辑标签,所以这就是问题所在,用户可以做任何事情。

    啊,这改变了一切。一组完全不同的规则适用于属性选择器中的操作数。当您使用" 包围操作数时,我认为您只需使用反斜杠转义"(当然,用反斜杠转义任何反斜杠),例如带有文本testing "one" two threelabel选择器(不是querySelector 的字符串,我们会回到那个)将是[label="testing \"one\" two three"]。因此,从包含目标标签的变量开始,我们将所有" 字符替换为\",并将所有\ 字符替换为\\

    var div = document.querySelector('[label="' + theLabel.replace(/["\\]/g, '\\$&') + '"]');
    

    完整示例:Live Copy

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=utf-8 />
    <title>Escaping attributes</title>
    </head>
    <body>
      <div label='testing "one" \two three'>This should turn green</div>
      <script>
        (function() {
          var label = 'testing "one" \\two three';
          var div = document.querySelector('[label="' + label.replace(/["\\]/g, '\\$&') + '"]');
          div.style.color = "green";
        })();
      </script>
    </body>
    </html>
    

    原答案:

    the CSS specification 中的详细信息;例如,ID 和类选择器中哪些字符需要转义的详细信息是here

    在 CSS 中,标识符(包括选择器中的元素名称、类和 ID)只能包含字符 [a-zA-Z0-9] 和 ISO 10646 字符 U+00A0 及更高,加上连字符 (-) 和下划线 (@ 987654343@);它们不能以数字、两个连字符或一个连字符后跟一个数字开头。标识符还可以包含转义字符和任何 ISO 10646 字符作为数字代码(请参阅下一项)。例如,标识符“B&amp;W?”可以写成“B\&amp;W\?”或“B\26 W\3F”。

    现在,querySelector / querySelectorAll 的问题在于,由于它们采用字符串,并且反斜杠在字符串文字中很特殊,因此您必须在字符串文字中使用 两个 反斜杠one CSS 选择器中的反斜杠。因此,对于引用中的最后一个示例,假设您想将其用作类选择器。你必须这样做:

    var list = document.querySelectorAll(".B\\26 W\\3F");
    

    ...它将选择器.B\26 W\3F 传递给选择器引擎。 Live Example | Live Source

    【讨论】:

    • 非常感谢这个回复。无论如何我可以将字符串转换为 querySelector 安全吗?有没有预先写好的函数你知道吗?
    • @Noitidart:我不知道。您可以使用正则表达式来转义相关字符,但这并不完美。我只是倾向于坚持使用仅使用a-zA-Z0-9- 的简单idclass 值;那我就不用担心逃跑了。
    • 事情是我正在制作一个 firefox 插件我正在做的是通过标签中的属性识别项目(因为所有项目的类都是相同的)。所以querySelector('[label="blah blah blah"]') 并且用户可以编辑标签,所以这就是问题所在,用户可以做任何事情。 :( 哈哈
    • @Noitidart:啊,在那种情况下完全不同的规则适用——生活可能会变得更容易一些。我已经更新了答案。
    • 好人非常感谢我非常感谢这项辛勤工作。所以基本上只有双引号和正斜杠需要转义啊。 mdn文章说,我经历过,我需要使用4个斜杠而不是一个。
    【解决方案2】:

    如果可能,您可以使用此解决方案,尽管不能跨浏览器(除 IE 外的所有现代浏览器)-https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape

    CSS.escape(".foo#bar") ->"\.foo\#bar"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 2010-11-08
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多