【问题标题】:jQuery click event not working for p tag class [duplicate]jQuery单击事件不适用于p标签类[重复]
【发布时间】:2014-03-24 08:44:12
【问题描述】:

我正在生成从下拉列表中选择的选项的输出。 我想允许用户从输出中“删除”选择。

我无法让我的代码工作,这里是呈现输出的代码:

 $('#dataCombo').change(function(){
 $('#dataOutput').html('');
 var values = $('#dataCombo').val();
 for(var i = 0; i < values.length; i += 1) {
 $('#dataOutput').append(values[i] + '<p class="removeable">X</p>'+'<br/>')
 }});

因此,选定的下拉项目显示在页面上,旁边有一个“X”,在 P 标记中,类为“可移动”,生成。我已经在 chrome 中检查了这个,并且 p 标签是用正确的类创建的。

我添加了此代码以删除单击的选项,但它不起作用:

$('.removeable').click(function(){
$('.removeable').remove();
console.log("I did this"); 
});

该项目没有被删除,我没有在控制台中获得日志。知道为什么这不起作用吗?

编辑:

我已将我的代码修改为:

$('#dataOutput').append('<p class="removeable">' + values[i] + 'X</p>'+'<br/>')

它确实删除了该项目,但是该选项在下拉框中仍处于“选中状态”。我也试图让它“取消选择”这个。我正在使用 Bootstrap 和激活“多个”的下拉菜单。虽然该选项当前已从输出中删除,但并未从选择框中删除(这意味着当单击另一个选项时,它会重新呈现先前删除的元素)。

我已经(希望)以与重复问题不同的方式更清楚地提出了这个问题: Unselect an option using jQuery on a Bootstrap selectpicker

【问题讨论】:

  • 没有人解释说当浏览器执行你的$('.removeable').click(function(){}); 行时p 元素还不存在,所以点击处理程序不会被绑定。您需要告诉 jQuery 将点击处理程序绑定到祖先元素(当时 确实 存在于页面上)并将点击事件委托给您的 p
  • 最后,您可能想要删除 p 的父级(或更远的祖先 - 取决于您的标记),否则所有代码都会删除 X
  • 是的,没错,目前代码所做的只是删除 X,而不是选项本身
  • 如果没有看到更多的 HTML,很难用正确的 jQuery 回答以删除 selection。这个问题现在被标记为重复,因为之前已经介绍过 jQuery 中的事件委托。查看此问题顶部的链接,了解有关事件委托的信息。如果您在此之后遇到问题,请询问有关删除正确元素并提供相关 HTML 和 JavaScript 的另一个问题。

标签: jquery html


【解决方案1】:

使用 event delegation 并请在该点击处理程序中使用 $(this) 引用,如果您不使用它,那么在单击单个元素时会导致删除所有具有该类的元素

$("#dataOutput").on('click','.removeable',function(){
 $(this).remove();
 console.log("I did this"); 
});

还要注意,总是更喜欢最近的静态父级来委派事件

【讨论】:

  • @downvoter:你能提供你投反对票的理由吗?我在这里有什么遗漏吗..?
  • 我没有对你投反对票,但所有答案都被否决了(我看到菲利克斯从 3 变为 -1,现在又回到 1...)奇怪...
  • 感谢您,它现在确实删除了元素,但它只删除了“X”而不是标签内的选定选项。所以它正在删除 &lt;p class="removeable"&gt;X&lt;/p&gt; 但不是里面的项目。 (我也没有投票给你,以防你认为是我)
  • 请显示您的渲染html,以便我们编写符合您要求的代码.. :)
  • 我更改了 html 元素的顺序,因此删除了 while 内容,谢谢。
【解决方案2】:

由于您的段落已被动态添加到 DOM,因此这些段落的点击事件将不可用。在这种情况下,event delegation 将帮助您将该事件附加到这些动态生成的段落中:

事件委托允许我们将单个事件侦听器附加到 父元素,将为匹配选择器的所有子元素触发, 这些孩子是现在存在还是将来添加。

$('#dataOutput').on('click', '.removeable', function() {
    $(this).remove();
    console.log("I did this"); 
});

此外,您可以在点击处理程序中使用$(this) 仅定位被点击的段落,而不是在点击任何具有removeable 类的段落时删除所有.removeable

【讨论】:

  • 感谢您的回答,但是这种技术似乎只删除了 &lt;p class="removeable"&gt;X&lt;/p&gt; 而不是其中的项目。知道如何解决这个问题吗?
  • 点击段落时要删除哪些元素?你能说得具体点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多