【问题标题】:Multiple buttons with the same ID [closed]具有相同ID的多个按钮[关闭]
【发布时间】:2014-07-31 15:08:03
【问题描述】:

已解决:咖啡不足 - 在创建按钮之前添加了事件侦听器。

我正在从 HTML LocalStorage 创建一个表格,如下所示:

for (i = 1; i <= localStorage['count']; i++) {
        tableHtml = tableHtml + "<tr><td><button class='delete' id=" + i + ">Delete</button></td><td>" + localStorage['fullName' + i] + "</td><td>" + localStorage['email' + i] + "</td><td>" + localStorage['phoneNum' + i] + "</td></tr>";
    }

这很好用,但是删除按钮很麻烦。

我看到了这个:

jQuery find ID of clicked button by class

所以我认为我可以做到这一点:

$(".delete").click(function () {
    alert('delete clicked for id: ' + $(this).id);
});

但是,它不起作用。有什么建议吗?

【问题讨论】:

  • 仔细观察你发布的问题中的代码,你会发现错误
  • 拥有多个具有相同 ID 的元素是不正确的。永远不要这样做。如果您有多个具有相同 ID 的元素,则 ID 应该是 class
  • @ZachSaucier OP 的代码不会产生具有相同 ID 的元素
  • 您显然没有阅读您链接的问题的答案,那么您为什么要在这里阅读它们?
  • 当元素被添加到页面时,你在哪里绑定点击事件?您最好使用onlive 进行绑定,这样您就可以确保绑定当前和未来的元素。如果没有,则需要在将 els 添加到页面后添加点击绑定。

标签: javascript jquery button


【解决方案1】:

您可以使用 javascript 获取元素的 id,而无需使用 jquery 包装器,如下所示:

$(".delete").click(function () {
    alert('delete clicked for id: ' + this.id); // get id via javascript
});

或:

 $(".delete").click(function () {
        alert('delete clicked for id: ' + $(this)[0].id); // via javascript object
    });

如果您看到有问题的 link 被引用,它也正在使用 javascript (this.id) 获取 id

如果你想通过 jquery 获取,那么:

 $(".delete").click(function () {
            alert('delete clicked for id: ' + $(this).attr("id")); // via jquery object
        });

【讨论】:

  • $(this).attr('id'),但这是天真的jQuery初学者新手方式,应该始终使用this.id
  • 干杯 - 不工作?
  • 缺少第二个双引号 $(this).attr("id"));
  • 感谢@scrappedcola 纠正错字
【解决方案2】:

什么时候绑定点击事件?如果它在元素存在之前,你会想要使用 .on。

$('body').on('click','.delete', function(){
    alert('delete clicked for id: ' + $(this).attr('id'));
});

查看有效的jsFiddle

【讨论】:

  • 我会 +1 你阅读 cmets 并注意到 OP 已经通过在正确的时间注册事件处理程序解决了他的问题,但是我必须 -1 你使用 @ 987654324@ 而不是 this.id ... ;-)
  • 那不是 2x -1 的吗? -1,因为我没有阅读 cmets(并且迟到了 8 分钟......!),以及 -1 用于使用 .attr('id')? (对于任何想知道的人:.id is much quicker。)
  • 只是把它称为偶数,不要碰运气! ;-)
【解决方案3】:

使用纯javascript:

this.id

或者jquery

$(this).attr('id');

$(this) 是 jquery 对象。并且您正在尝试获取 javascript 属性 ID。您需要先将对象转换为 javascript。

$(this)[0].id;

【讨论】:

  • 谢谢...我都试过了,似乎都不管用
  • "Pure jQuery" - 鉴于 jQuery 只是让使用 javascript 变得更容易,我认为这不是正确的说法
【解决方案4】:

DOM 元素不应将数字作为 id 的第一个字符。 把你的代码改成这样:

for (i = 1; i <= localStorage['count']; i++) {
    tableHtml = tableHtml + "<tr><td><button class='delete' id=del-id" + i + ">Delete</button> </td><td>" + localStorage['fullName' + i] + "</td><td>" + localStorage['email' + i] + "</td><td>" + localStorage['phoneNum' + i] + "</td></tr>";
}

$(".delete").click(function () {
    alert('delete clicked for id: ' + $(this).prop('id');
});

这应该会带您走上正确的道路。 请记住 .prop() 函数是 jQuery 1.10+ 特定的。 如果您使用的是旧版本,请使用 .attr()

正如这里的一些人提到的 - 从 HTML5 开始,id 可以是数字 仍然以数字形式使用它们可能会产生相当不愉快的问题。 来自其中一位用户的以下 cmets 链接。

【讨论】:

  • 是的,他们可以,因为 HTML5。但是 CSS3 不允许在选择器中使用它,所以它仍然不是一个好主意。
  • ergo - 他们不能。如果你可以设置一些东西,所以你不能使用它 - 它没有意义
  • w3.org/TR/html5/dom.html#the-id-attribute - 我的印象是,从 HTML5 开始,ID 是允许使用数值的?
  • @wick3d 不,我没有说它们不能使用,它们现在明确合法。但是 CSS 样式表不能使用,例如#1 引用这样的元素。这并没有让它们变得无用,只是没那么有用
  • @Alnitak 我编辑了我的答案,注意到你的信息。谢谢。
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多