Jquery替换id选择器中的特殊字符

时间:2018-05-22 17:00:20

标签: javascript jquery

我需要选择一个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

3 个答案:

答案 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;
&#13;
&#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>