我试图让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上的评论员有同样的问题。
代码文件长达数千行,我的雇主可能禁止发布多行代码。我只是在寻找一个提示,一个线索,一个黑暗的镜头,关于什么会导致一个完全合理的选择字符串被拒绝。
答案 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()