Chrome扩展中动态添加元素的事件绑定失效问题求助
这个问题我太熟了!动态元素绑定事件失效是前端开发里非常常见的坑,核心原因和你绑定事件的时机、方式有关,咱们一步步来解决:
问题出在哪?
你现在写的$("fact").on('click', function() { ... })有两个关键问题:
- 选择器写错了:要选中class为
fact的元素,应该用.fact而不是fact(后者是找<fact>标签,显然不存在); - 绑定时机不对:普通的
.on()绑定只会作用于执行代码时已经存在于DOM中的元素,你后面动态追加的按钮是在绑定之后才创建的,自然没被绑定到事件。
解决方案1:事件委托(最推荐)
事件委托利用事件冒泡的原理,把事件绑定到一个已经存在的父元素(比如document,或者更靠近目标元素的容器,性能更好),然后通过选择器过滤触发事件的目标元素。这样不管元素是现在有还是以后动态添加的,只要匹配选择器就能触发事件。
修改你的事件绑定代码:
// 把事件绑定到document(或者更合适的父容器),过滤.fact元素 $(document).on('click', '.fact', function() { alert("事件生效啦!"); });
解决方案2:创建元素时直接绑定事件
如果你不想用事件委托,也可以在动态创建按钮的时候就直接给它绑定事件,这样创建出来的每个按钮都自带事件监听:
for (i = 0; i < myclass.length; i++) { result = patt.exec(myclass[i]); // 先创建按钮元素,绑定事件,再追加到目标元素 var $btn = $('<button class="fact" id=' + result[0] + ' style="position: absolute;">fact</button>'); $btn.on('click', function() { alert("事件生效啦!"); }); $(myclass[i]).append($btn); };
额外小提醒
你的代码里myclass是一个jQuery集合,原来的myclass.append()会把按钮追加到所有匹配的元素里,改成$(myclass[i]).append(...)才能给每个目标元素单独追加按钮,避免重复追加的问题哦!
内容的提问来源于stack exchange,提问作者Nini Älġërïnö
相关产品推荐
相关产品推荐

