由于实际的需要,有时需要往网页中动态的插入HTML内容,并在插入的节点中绑定事件处理函数。我们知道,用Javascript向HTML文档中 插入内容,有两种方法,
一种是在写HTML代码写入JS,然后插入到文档中;
另外一种是通过ajax的方式,从服务器获取数据,然后用js把获取的数据经 过处理后插入文档中;
两种方法各有特点,本文将分析新插入到文档中的元素的事件绑定问题,并假定新插入的对象不做内联的事件绑定(即不用类似 的形式)。所有的示例将会用到jQuery和原生javascript。
情况一: HTML代码存放在JS中,请看以下代码:
<script> var appendhtml=document.createElement("p"); appendhtml.innerHTML="这是插入的内容"; document.body.appendChild(appendhtml); var nodep=document.getElementsByTagName("p"); for (var i=0;i
1 2 3 4 5 6 | $(function(){ $("p").click(function(){ console.log("Click Event"); }) $(" ").appendTo("body"); }) |
但是,实际情况是,工作中有可能需要把后来生成的元素绑定上事件,并注册上事件处理函数。例如本网站的留言系统,第一次加载只会显示固定条数的评 论,如果评论超过一定数量,剩下的会用ajax的方式进行加载。所有的留言最后都有个回复功能,点击可以恢复相应的留言,也就是说,动态加载上来的留言, 也许要绑定click事件,并注册上回复留言的函数。当然偷懒的方法是,为ajax加载上来的内容再注册一个click并再绑定一次相应的函数,但这加大 了代码的冗余度,增加系统开销,还会使代码变得难以理解。那么更好的解决办法是什么呢?
那么,我能不能在被插入元素的父元素上监测冒泡产生的事件,并回调相应的函数呢?答案是当然是肯定的。来看下面的例子,注意网页面里插入内容是在JS代码的最后。
<script> $(function(){ $("body").delegate("p","click",function(){ console.log("Click Event"); }) $("这是生成的内容
").appendTo("body"); }) </script>
这是,发现所有的P元素点击都产生了输出,说明代码运行成功。这里我们用到了jQuery的delegate函数,来看一下官方解释:
在jQuery1.7.3以上的版本中,on方法也可以做这件事,官方有示例说明,这里不再赘述。
比如有一些情况多次从后台获取动态内容到前台,点击的时候会触发多次,还要使用 $("body").undelegate(); 解除之前的绑定 然后再一次重新绑定。
1 2 3 4 | $("body").undelegate(); $("body").delegate(".reply_check_btn","click",function() { alert('adsadsa'); }); |
?
1 2 3 |
|