Vue中,如何对动态生成的{{{topic.html}}},对其中的 img 标签绑定onclick事件
发布于 9 年前 作者 TakWolf 23210 次浏览 最后一次编辑是 8 年前 来自 问答

需求大概是这样的:

  <div id="page">
	  {{{topic.html}}}    
  </div>
var vm = new Vue({
    el: '#page',
    data: {
        topic: {}
    }
});

其中topic.html是就是html字符串,可能会不断更新,每次更新之后,都要对其中的img标签绑定onclick事件,应该怎么做?vue有办法解决吗?

目前是用jquery来实现的:

vm.$watch('topic', function () {
	$('#page img').unbind('click').click(function () { // 需要解绑,否则会重复绑定事件
		// some...
	});
});

这个思路是对的吗?不想引入jQuery

11 回复

你可以把 click 事件直接绑定在 #page 上:

$('#page').on('click', 'img', function() {
  // some...
});

然后在组件 beforeDestroy 时解绑事件。

jquery 有个 delegate 用法。就是不把事件绑在对应元素上,而是绑在更高的元素上来捕捉下面元素的点击事件。

你也玩vue了? From Noder

动态组件?不知道能不能解决这个问题。明天试试 From Noder

@soliury 这东西太好用了,打算前端全都转到vue上了

@alsotang 我研究一下

@TakWolf 我们团队也打算全部转移到vue From Noder

解决了吗?要回来结贴哦

同楼上希望有总结帖

@klausgao @yunkou 问题已解决 根据大家的建议,都是通过代理事件的方式来实现。 vue的事件绑定支持原生的event参数,所以目前是这样解决的:

<div id="page" v-on:click="openImageProxy($event)">
    {{{topic.html}}}    
</div>
 
var vm = new Vue({
    el: '#page',
    data: {
        topic: {}
    },
    methods: {
        openImageProxy: function (event) {
            if (event.target.nodeName === 'IMG') {
                // event.target.src 这里做处理
            }
        }
    }
});

最终移除了jquery和属性监听

不错不错不错

回到顶部