代码之家  ›  专栏  ›  技术社区  ›  DreamsInHD

jquery替换ID选择器中的特殊字符

  •  0
  • DreamsInHD  · 技术社区  · 8 年前

    我需要选择一个HTML元素,该元素的ID中包含“@”和“.”(电子邮件)。我找到这个了 .replace( /(:|.|[|]|,|=|@)/g, "\$1" ) 在线但不起作用。这就是我所拥有的:

    elementId.replace(/(:|\.|\[|\]|,|=|@)/g, "\\$1" );
    
    $("div > #" + elementId).empty();
    

    例如,当我手动逃离它们时,它会起作用。 $('#bla\\@bla\\.com') 但在这种情况下,这当然对我没有帮助。这是我得到的错误,当我手动执行时,不会得到:

    Uncaught Error: Syntax error, unrecognized expression: div > #bla@bla.be
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   user9315861    8 年前

    将ID视为常规属性:

    $("div > [id='" + elementId + "']").empty();
    

    你也可以用 getElementById (要获取jquery对象,请说 $(document.getElementById("bla@bla.be")) )

    问题不是你的ID无效。ID的规则非常宽松。问题是 CSS选择器 有一定的规则 标识符 ,例如选择器中使用的 #elementId . 属性的值,或传递给 按ID获取元素 不是标识符,它们只是字符串,这就是它们工作正常的原因。

    当然,最好的解决方案是修复上游代码,这样它就不会生成那些奇怪的ID。

    你应该能够忽略 div > 在上面,因为ID表面上是独一无二的。

        2
  •  1
  •   muecas    8 年前

    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>

    更多关于 string.prototype.replace替换 可以找到 here .

    另一种选择是使用 attribute selectors :

    var selected = $("div > [id='" + elementId +  "']").empty();
    

    编辑 已调整regex以替换电子邮件地址中允许的所有字符。

        3
  •  1
  •   The fourth bird    8 年前

    在代码中,不使用返回值 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>