【问题标题】:jQuery Escaping Special Characters FailsjQuery 转义特殊字符失败
【发布时间】:2015-08-12 23:53:27
【问题描述】:

我正在尝试制作一个 jQuery 选择器,以通过任意 id 选择一个 html 元素。 id 可能包含需要转义的特殊字符。一个例子是test_E///_AAAAA

我基本上正在做这个工作 fiddle 中正在发生的事情(它使用 v 1.11.0,我使用的是 v 1.11.3 并且还使用 2.1.3 进行了测试)

但是,在我的扩展环境中,它不起作用。我得到Syntax error, unrecognized expression: #test_E\\/\\/\\/_AAAAA

关于 jQuery 肯定有一些不为人知的事实,这就是这个工作和不工作之间的区别。我是新手,没有希望识别它。

我注意到我并不孤单。 this thread 的评论员也有同样的问题。

代码文件长达数千行,我的雇主可能禁止我发布超过几行的内容。我只是在寻找一个提示、一个线索、一个关于什么会导致一个完全合理的选择字符串被拒绝的问题。

【问题讨论】:

  • “我只是在寻找提示”:不要在 ID 中使用特殊字符...
  • 第一个线索是该元素不存在。但如果没有任何代码,将很难验证和回答。
  • freedomn-m。这是不可避免的。我需要为每个 DOM 元素提供一个唯一且可引用的 id,该 id 是从数据中动态填充的。该数据中唯一的唯一字段包含特殊字符(我无法控制)。 WhiteHat,如果 jQuery 选择器不能找到匹配的元素,它不会给出这个错误;它只是选择大小为 0。此错误表明 jQuery 在选择器字符串中感知到语法错误。

标签: javascript jquery


【解决方案1】:

你只需要足够的反斜杠:)

ID: 元素的 ID 是test_E\\/\\/\\/_AAAAA。请注意,反斜杠在 HTML 中没有任何特殊含义,因此 ID 中确实有六个反斜杠。

jQuery 选择器: 反斜杠、正斜杠和其他几个字符在 jQuery 选择器中具有特殊含义,因此我们需要用反斜杠对其进行转义。因此选择器需要是#test_E\\\\\/\\\\\/\\\\\/_AAAAA。这告诉 jQuery 查找 ID 包含 test_E 的元素,然后是两个反斜杠,然后是一个正斜杠,依此类推。

JavaScript 字符串文字: 要使用 JavaScript 字符串文字表示该选择器,每个反斜杠都需要转义。所以字符串文字将是"#test_E\\\\\\\\\\/\\\\\\\\\\/\\\\\\\\\\/_AAAAA"

var selectionString = "#test_E\\\\\\\\\\/\\\\\\\\\\/\\\\\\\\\\/_AAAAA";
snippet.log("actual id: " + $("p")[0].id);
snippet.log("selection string given to jQuery: " + selectionString);
snippet.log("text: " + $(selectionString).text());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

<p id="test_E\\/\\/\\/_AAAAA">This is a test :)</p>

如您所见,这非常丑陋、难以理解且难以正确处理。我强烈建议避免使用此类 ID。另一种选择是使用旧的document.getElementById(),它只需要字符串文字转义:

$(document.getElementById('test_E\\\\/\\\\/\\\\/_AAAAA')).text()

【讨论】:

    【解决方案2】:

    小提琴中的代码也不起作用。我在 IE、Firefox 和 Chrome 中都试过了,都没有找到该元素。

    您需要转义斜线才能在# 选择器中使用它。如果使用反斜杠,则必须对其进行两次转义,一次将其放入字符串中,一次用于选择器。

    要匹配 id test\A,您需要选择器 #test\\A,它作为字符串是 "#test\\\\A"

    要匹配 id test/A,您需要选择器 #test\/A,它作为字符串是 "#test\\/A"

    要匹配 id test_E\\/\\/\\/_AAAAA,您需要选择器 #test_E\\\\\/\\\\\/\\\\\/_AAAAA,它作为字符串是 "#test_E\\\\\\\\\\/\\\\\\\\\\/\\\\\\\\\\/_AAAAA"

    演示:https://jsfiddle.net/Guffa/463849xj/4/

    一般来说,您应该避免身份中出现不寻常的字符。即使您可以使其工作,仍然存在某些浏览器处理方式不同的风险。

    更新:

    错误消息显示选择器未转义,因此错误消息显示选择器#test_E\\/\\/\\/_AAAAA,这意味着您实际上使用了字符串"#test_E\\\\/\\\\/\\\\/_AAAAA"。这会使斜杠未转义,从而导致语法错误。

    【讨论】:

    • “您不能在 # 选择器中使用斜杠”。是的,你可以,你只需要更多的反斜杠。
    • @tom:是的,你是对的。谢谢。我更正了。
    • 小提琴好像变了。我已经分叉了它,修复了它,并更新了链接。
    • 道歉。问题中有错字。 id 应该是test_E\\\_AAAAA
    • @ds390s:那你使用选择器"#test_E\\\\\\\\\\\\_AAAAA"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多