在使用的时候发现一个问题,,,
在重新渲染一个模板后,,用 jquery 给元素绑定的事件处理器不会触发了,,经过调试后发现,,jquery绑定事件的原理可能是给文档元素对象添加属性,,而渲染的时候会删除这个对象,,以模板文件来新建元素,,所以事件处理器并不会重新绑定
在之后想到的解决办法有点搞笑,,每个页面只渲染一次,,每次需要渲染的时候就向服务器请求更改数据,,然后刷新本页面,,就避免了绑定了事件处理器的对象被删除,,
//刷新本页面 var url = window.location.href; window.location.href = url; //这个刷新方法虽然笨,,但是有效
后面又想到一个解决办法,,,在模块内创建元素的时候设置事件处理器,,,,就相当于每次渲染就设置事件处理器,,,,也避免了这个问题
//手动设置事件处理器,,虽然麻烦,,但相比上面一个要简单太多 <button class = "btn btn-default next" onclick = "next()">Next</button>
写到这里突然想到,,,,既然jquery的注册事件处理器,,是只注册一次,,,那如果给一个className注册了一个处理器,,,再更改className会不会依然能够触发,,,,
去尝试了一下:
代码如下:
<!DOCTYPE html> <html> <head> <meta charset = "utf-8"/> <script src = "jquery.min.js"></script> <script> $(window).load(function() { $('.next').click(function() { console.log($(this)[0].className); $(this)[0].className = "last"; }); }); </script> </head> <body> <button class = "next">next</button> </body> </html>
输出的结果:
'next' 'last' 'last'
,,,就是这样,,,,改变一个元素的id或者className只会更改css的样式选择,,,,而不会对事件处理器有影响,,