【问题标题】:Select element id with special character in it with jquery/javascript使用 jquery/javascript 选择具有特殊字符的元素 id
【发布时间】:2020-05-20 13:23:45
【问题描述】:

我有一个包含许多不同元素 ID 的 jsp。示例:

<div id="divName">
...
  <tr id="tr_0_123/45">
    <input type="hidden" name="field_0_123/45" value="NAME_Field" id="field_0_123/45">
  </tr>
</div>

问题是我需要能够从我的输入中读取值字段。为此,我使用

function workOnValue(){
  var idTr = 'tr_0_123/45';
  var idName = 'field_0_123/45';
  ${"#divName #"+idTr +" input[id='"+idName+"']).each(function(){
        do something...
  }
}

当我运行此代码时,JQuery 找不到任何具有该 id 的输入,同时找不到任何其他类型的不包含字符 / 它的 id。 我尝试了$.escapeSelector,但我的 jQuery 版本太旧,无法使用。 我尝试使用idName.replace("/","\\/");.replace(/[|\(\)#\\\/]/g, '\\$&amp;');

你有什么建议吗?

【问题讨论】:

标签: javascript html jquery escaping


【解决方案1】:

如果你只是想转义/,你可以用idName.replace("/", "\/")替换idName,而且在HTML本身中,ID定义的末尾没有关闭",所以实际的ID名称本身可能会被/ 截断,因为"s 对于没有空格的ID 是不必要的,而且据说也没有斜杠。

所以只需在输入的 ID 中添加一个结束 "

另一件事是,如果您按 ID 进行选择,则没有理由选择父节点的 ID,因为每个 ID 都是唯一的。如果您只想在元素中选择一种输入类型,您可以将所有代码更改为 ${"input[id='"+idName+"'])${"#divName input")${"#" + idTr +"input")

【讨论】:

  • 我也试过用 replace("/","\/") 但没有。也对格式感到抱歉,但在实际代码中没有诸如丢失“之类的错误,这是我在这里写问题时的错误。关于父母的 id,我出于其他原因需要这些,但一切都很好,除了特殊的字符/
  • @Fabzheimer 我注意到 TR 在其 ID 中也有一个 / 字符,该引用本身不起作用,还是仅输入 ID 有问题?
  • 问题在于所有包含 / 的 id。
  • @Fabzheimer 有一个相关问题,其中提到了可能的双重转义 stackoverflow.com/questions/27255591/… 但只需尝试一个简单的娱乐页面,非常基本的 HTML,它只包含一个带有斜杠 ID 的元素,然后尝试使用 document.getElementById 引用它,如果可行,那么您就知道它的可能,所以再试一次查询选择器,尝试 vanilla javascript,只是为了测试 &lt;div id="hi/there"&gt;&lt;/div&gt;&lt;script&gt;console.log(document.getElementById("hi/there"), document.querySelector('[id="hi/there"]'))&lt;/script&gt;
  • 我试过了,结果querySelector不是一个有效的选择器,getElementById也返回了
【解决方案2】:

您的 HTML 格式错误; tr 应位于 tbodythead 中,后者位于 table 中。 tr 中的内容也应该在tdth 中。请在下面的演示中查看console.log( $tr[0] ); 的输出。

您可以直接使用id 选择input 元素; id 属性是唯一的 - 如果不是,那么在您更正 table HTML 后,您的 HTML 格式仍然会出错。您可以使用$('[id="id-value"]') 按 id 进行选择。这两个演示演示了无论表格 html 是否格式错误,您都可以正确选择输入元素。请参阅下面console.log( $input ); 的输出。

$tr = $('[id="tr_0_123/45"]');
$input = $('[id="field_0_123/45"]');
console.log( $tr[0] );
console.log( $input.val() );
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="divName">
...
  <tr id="tr_0_123/45">
    <td><input type="hidden" name="field_0_123/45" value="NAME_Field" id="field_0_123/45"></td>
  </tr>
</div>

$tr = $('[id="tr_0_123/45"]');
$input = $('[id="field_0_123/45"]');
console.log( $tr[0] );
console.log( $input.val() );
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="divName">
...
<table>
  <tbody>
  <tr id="tr_0_123/45">
    <td><input type="hidden" name="field_0_123/45" value="NAME_Field" id="field_0_123/45"></td>
  </tr>
  </tbody>
</table>
</div>

注意

  1. 如果您有权访问生成 ID 的 JSP 页面,请对其进行编辑以删除特殊字符。
  2. 如果输入元素的 ID 不是唯一的 - 您使用 .each() 的事实暗示了这一点,请编辑 JSP 页面以使其唯一或将 id 属性更改为类属性。

参考文献

  1. HTML: Allowed Characters in id Attribute
  2. Best Practice for Naming the Id Attribute of Dom Elements
  3. What is the standard naming convention for html/css ids and classes?

【讨论】:

  • 感谢@PeterKA 的回答。首先,这不是实际的 html 结构,但感谢您的更正。另外,我试过 $input = $('[id="field_0_123/45"]');但答案仍未确定。
  • 请创建一个将$input = $('[id="field_0_123/45"]'); 显示为undefined 的最低演示,我们很乐意看看。
猜你喜欢
  • 2022-05-25
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2023-02-08
  • 2011-05-28
  • 2010-11-16
相关资源
最近更新 更多