jQuery ID 选择器仅适用于第一个元素

IT技术 javascript jquery html
2021-02-05 09:40:35

我有 3 个具有相同 ID 的按钮。我需要在单击时获取每个按钮的值。

<button id="xyz" type="button" class="btn btn-primary" value="1">XYZ1</button>
<button id="xyz" type="button" class="btn btn-primary" value="2">XYZ2</button>
<button id="xyz" type="button" class="btn btn-primary" value="3">XYZ3</button>

这是我当前的jQuery脚本:

$("#xyz").click(function(){
      var xyz = $(this).val();
      alert(xyz);
});

但它仅适用于第一个按钮,其他按钮的点击将被忽略。

6个回答

我有 3 个具有相同 ID 的按钮...

您的 HTML 无效。一个页面中不能有多个具有相同id属性值的元素

引用规范

7.5.2元素标识符:id 和 class 属性

id = name [CS]
此属性为元素分配名称。此名称在文档中必须是唯一的。

解决方案:从id改为class

<button type="button" class="btn btn-primary xyz" value="1">XYZ1</button>
<button type="button" class="btn btn-primary xyz" value="2">XYZ2</button>
<button type="button" class="btn btn-primary xyz" value="3">XYZ3</button>

jQuery 代码

$(".xyz").click(function(){
    alert(this.value);
    // No need for jQuery :$(this).val() to get the value of the input.
});

但它只适用于第一个按钮

jQuery#id选择器文档

每个 id 值在一个文档中只能使用一次。如果多个元素被分配了相同的 ID,则使用该 ID 的查询将只选择 DOM 中第一个匹配的元素。但是,不应依赖这种行为;具有多个元素使用相同 ID 的文档是无效的。

如果您查看 jQuery 源代码,您会发现当您$使用 id selecor-( $("#id")) 进行调用时,jQuery 会调用本机 javascriptdocument.getElementById函数:

// HANDLE: $("#id")
} else {
    elem = document.getElementById( match[2] );
}

虽然,在他们规范document.getElementById没有提到它必须返回第一个值,这就是大多数(也许是全部?)浏览器实现它的方式。

演示

我已将我的课程修改为: class="btn btn-primary xyz" 谢谢你,这真的很有帮助 Mafaik
2021-03-13 09:40:35
@gdoron 你stack overflowmebruv ++1 的+1 中得到了它:P ++ :P
2021-03-21 09:40:35
这是一个完整答案的本垒打!++1
2021-03-23 09:40:35
谢谢,我已经尝试过了,它可以工作,但是使用 alert(this).val(); 现在我的按钮 css 类有问题,如您所见,按钮标签中有两个类
2021-03-25 09:40:35
对我来说看起来不错 :) 也许你可以只添加一个关于普通 DOM 方法的句子,这样我们就可以将它用作这种情况的规范答案(可能需要稍微调整一下问题,但我是用我的手机写的)。无需让它成为社区维基,你应该得到代表:)
2021-04-08 09:40:35

ID 的意思是“标识符”,每个文件只能使用一次。由于此时您的 HTML 是错误的,一些浏览器会选择第一个元素,一些是最后出现的具有该 ID 的元素。

更改名称的 id 将是一个很好的步骤。

然后使用 $('button[name="xyz"]').click(function(){

事实上,如果您只使用 $('button[id="xyz"]'),它将适用于具有该 id 的所有按钮(就像想要的原始问题一样)。在 Chrome 中测试。
2021-03-29 09:40:35

根据我的经验,如果您改用$('button#xyz')选择器,它将起作用。这是一个 hack,但它仍然是无效的 HTML。

如果您有多个具有相同 ID 的元素,这也有效。

 $("button#xyz").click(function(){
  var xyz = $(this).val();
  alert(xyz);
 });

你可以在这里查看

如果容器中有相同的 id,则可以使用 on() 访问每个事件的每个元素

$("#containers").on("click","#xyz",function(){
  alert($(this).val())
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="containers">

<button id="xyz" type="button" class="btn btn-primary" value="1">XYZ1</button>
<button id="xyz" type="button" class="btn btn-primary" value="2">XYZ2</button>
<button id="xyz" type="button" class="btn btn-primary" value="3">XYZ3</button>

</div>

关于 on() 的信息在这里