使用jQuery去给元素绑定事件时,无法给新创建的元素绑定事件的原因
在我们使用jQuery库去撰写js代码的时候经常会遇到这种问题 ,比如说给某个元素绑定点击事件,原本写在文档中的元素都可以响应该事件,比如下面我点击所有的div,去修改他们的颜色。
页面骨架如下:
<body>
<section>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</section>
<button>点我</button>
</body>
展示效果如下:

此时我点击的第三个div那么它响应事件变成了红色

代码如下:
<script>
$('div').click(function() {
$(this).css('backgroundColor', 'red');
})
</script>
此时我们在代码中创建一个div元素;
$('button').click(function() {
var box = $("<div>num</div>");
$('section').append(box);
})

此时问题出现了,使用点击事件再次生成的div无法响应点击事件,为什么?
因为在我们的浏览器运行文件中的js代码时,它会通过jQuery的隐式迭代去给每一个元素绑定事件,而查找这些元素的根据就是写在选择器中的类名或者是id,在这个时候它会给现在在页面上的所有的符合条件的元素添加事件,注意,是现在在页面上的元素,而我们在页面加载完之后再通过js手动添加的页面元素则不会添加上这个事件,问题分析清楚了,那么如何解决呢?
这个时候就需要使用到on方法了,on方法用于为一个或一个系列的元素绑定事件,具体的语法如下:
$(selector).on(event,childSelector,data,function)
selector是绑定的元素,event是绑定的事件的类型,childSelector是可选项,代表需要被绑定事件的子元素,子选项,data是传输到函数外的数据,function是绑定在元素上的函数。
好的,那么现在方法介绍完了,要怎么实现新元素的绑定呢?
答案就在childSelector这个选项上,下面是代码:
$('section').on('click', 'div', function() {
$(this).css('backgroundColor', 'red');
});
此时,新创建的元素就可以响应到点击事件了,因为此时的事件实际上是绑定在section盒子上面的。而div是section的子元素,所以每当我们点击section元素里的div元素的时候,就会触发该事件,改变该div元素的颜色。这样每当我们点击的时候,浏览器就会先去运行绑定在父元素上的on方法来查找类名或id符合条件的元素再运行事件,这样就避免了在页面加载完毕之前进行事件的绑定,让页面加载完毕之后再使用js生成的元素也可以享受到事件。
大家可以看到新生成的numdiv也可以响应到事件,问题解决。
(ps:第一次写博客,有错误欢迎大家指出,感谢每一个阅读者)