jQuery转义特殊字符失败

时间:2015-08-07 23:05:44

标签: javascript jquery

我试图让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上的评论员有同样的问题。

代码文件长达数千行,我的雇主可能禁止发布多行代码。我只是在寻找一个提示,一个线索,一个黑暗的镜头,关于什么会导致一个完全合理的选择字符串被拒绝。

2 个答案:

答案 0 :(得分:1)

小提琴中的代码也不起作用。我已经在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"。这会留下未转义的斜杠,这会导致语法错误。

答案 1 :(得分: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()