如何在父 li 中捕获子复选框单击事件?

Posted

技术标签:

【中文标题】如何在父 li 中捕获子复选框单击事件?【英文标题】:How to capture child checkbox click event inside parent li? 【发布时间】:2017-12-17 20:08:23 【问题描述】:

我有以下显示我们正在使用的结构的 Vue 代码:

<template>
  <li class="mm-product-item" v-on:click="edit(item)">
    <p class="mm-product-info input-field">
      <input type="checkbox"
              class="filled-in"
              :id="'checkbox-' + item.id"
              :checked="item.addNextOrder"
              v-on:click.capture.stop="toggleNextOrder($event, item.id)" />
      <label :for="'checkbox-' + item.id"></label>
      <span class="mm-product-name" click="edit(item)"> item.name </span>
      <span class="mm-product-quantity"> item.quantity </span>
      <span class="mm-product-unit"> item.selectedUnit </span>
    </p>

    <button href="#remove-product" @click.prevent.stop="destroy(item.id)" class="mm-product-remove" title="remover produto">&times;</button>
  </li>
</template>

因此,checkbox 嵌套在 p 中,li 中嵌套。

li 作为父级,有一个更宽、更大的区域,应该触发edit(item) 方法。这工作得很好。

checkbox 虽然更小,但也应该捕获点击事件并触发toggleNextOrder 方法。

如果li 中没有指定事件,checkbox 事件处理就可以正常工作。

但如果li 事件存在(如上面的sn-p 中),checkbox 事件甚至不会发生,但根据Vue's documentation,它应该发生。

我能够使类似的情况正常工作in this JSFiddle,但由于某种原因,在这个生产环境中它不起作用。

有没有办法解决这个问题?

【问题讨论】:

你能用导致问题的代码复制错误吗? 如果您在 JSFiddle 中删除了内部 onClick,它仍然可以工作。所以看起来你内心的 onClick 什么也没做。也许您可以为您的生产代码做类似的事情,您将$event 作为参数发送到li onClick,如果您的$event 在复选框上,那么您调用toggleNextOrder 【参考方案1】:

我在 Chrome 开发工具的帮助下发现了发生了什么。

复选框旁边有一个标签,与之关联:

<input type="checkbox" (...) />
<label :for="'checkbox-' + item.id" (...) ></label>

使用谷歌浏览器的开发工具检查&lt;input type=checkbox&gt;,似乎复选框“没有区域”:

•••

在检查它旁边的 &lt;label&gt; 时,我发现它实际上“包裹并包围”了复选框:

•••

所以我将 @click.capture.stop.prevent="toggleNextOrder(item.id)" 事件处理程序添加到标签中,而不是复选框,现在它可以工作了。

【讨论】:

以上是关于如何在父 li 中捕获子复选框单击事件?的主要内容,如果未能解决你的问题,请参考以下文章

即使通过Javascript代码检查,如何触发复选框单击事件?

单击内部复选框时,使用jQuery将类添加到包含li

Bootstrap - 未捕获的类型错误:无法读取复选框单击时未定义的属性“单击”

使用复选框在父表中搜索 (Oracle Forms Builder)

具有复选框选择和行单击事件的 GWT CellTable

复选框中的Vuejs单击事件?