我需要选择一个id为' @'的html元素。和'。' (电子邮件)里面。我在网上找到了这个.replace( /(:|.|[|]|,|=|@)/g, "\$1" )
,但它不起作用。这就是我所拥有的:
elementId.replace(/(:|\.|\[|\]|,|=|@)/g, "\\$1" );
$("div > #" + elementId).empty();
当我手动转义它们时它起作用,例如$('#bla\\@bla\\.com')
,但当然在这种情况下对我没有帮助。这是我得到的错误,当我手动执行时我不会得到错误:
Uncaught Error: Syntax error, unrecognized expression: div > #bla@bla.be
答案 0 :(得分:1)
String.prototype.replace
不会修改原始字符串,而是返回修改后的字符串。所以你应该使用它的返回值。
var elementId = ":.[],=!#$%&'*+-/?^{}|~;@bla.com";
var cleanup = elementId.replace(/(:|\.|\[|\]|,|=|@|!|\#|\$|%|&|\'|\*|\+|\-|\/|\?|\^|\{|\||\}|~|;)/g, "\\$1" );
var selected = $("div > #" + cleanup).empty();
console.log(selected);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<div id=":.[],=!#$%&'*+-/?^{}|~;@bla.com"></div>
</div>
&#13;
有关String.prototype.replace
的更多信息,请here。
另一种选择是使用attribute selectors获取元素:
var selected = $("div > [id='" + elementId + "']").empty();
修改调整了正则表达式,以替换电子邮件地址中允许的所有字符。
答案 1 :(得分:1)
将ID视为常规属性:
$("div > [id='" + elementId + "']").empty();
您也可以使用getElementById
(获取jQuery对象,比方说
$(document.getElementById("bla@bla.be"))
)。
问题不在于你有这样的无效ID。 ID的规则非常宽松。问题是 CSS选择器具有标识符的某些规则,例如选择器#elementId
中使用的规则。属性的值或传递给getElementById
的值不是标识符,它们只是字符串,这就是它们正常工作的原因。
当然,最好的解决方案是修复上游代码,使其不会生成那些奇怪的ID。
您应该可以省略上面的div >
,因为ID表面上是唯一的。
答案 2 :(得分:1)
在您的代码中,您不使用replace的返回值。
如果您使用jQuery 3,则可以使用jQuery.escapeSelector()
var elm = $("div > #" + $.escapeSelector("bla@bla.be"));
console.log(elm);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
<div id="bla@bla.be"></div>
</div>