【问题标题】:Vue: Bind click event to dynamically inserted contentVue:将点击事件绑定到动态插入的内容
【发布时间】:2019-05-21 11:44:47
【问题描述】:

我有一个 Vue 应用程序,它从一个 API 请求一些 html,其中包含一些块,如 <div class="play-video">...</div>

使用 axios 通过 promise 调用 API,它被插入到 dom 中,如下所示:

<div v-if="content" v-html="content"></div>

如何使用.play-video 类将点击事件绑定到子级?是否只是观察 content 的变化,然后运行 ​​vanilla js 查询选择器来绑定它们?

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

您可以通过添加@click 处理程序并使用Element.matches() 检查目标元素来使用一些事件委托

new Vue({
  el: '#app',
  data: {
    content: null
  },
  methods: {
    handleClick(e) {
      if (e.target.matches('.play-video, .play-video *')) {
        console.log('Got a click on .play-video or a child element')
      }
    }
  },
  mounted () {
    // simulate loading content
    setTimeout(() => {
      this.content = `
        <div>
          <p>Some other element</p>
          <button>I'm not part of <code>.play-video</code></button>
          <div class="play-video">
            <p><button>Click me, I am!</button></p>
          </div>
        </div>
        `
    }, 1000)
  }
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<div id="app">
  <div v-if="content" v-html="content" @click="handleClick"></div>
  <p v-else>Loading...</p>
</div>

如果您只想捕获 .play-video 元素本身而不是其任何子元素上的点击事件,请将选择器更改为仅 '.play-video'

请参阅 https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill 了解浏览器兼容性和必要时的 polyfill。

【讨论】:

  • 完美,谢谢。对不起,如果这是一个明显的问题,但很多搜索结果都在看 jQuery。
  • @waffl 不客气。我猜你会找到 jQuery 的结果,因为 jQuery 是第一个真正让事件委托成为一等公民的框架之一
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多