日期:2014-05-16  浏览次数:20266 次

js动态创建页面元素后绑定的事件,在下次修改这些元素时如何恢复这些事件。
我语言描述的不太清楚,举个例子来说明下。
这样一个模版<div id="body"></div>
我现在向body里追加一个div里面放一些内容,鼠标指向这个div时会出现一个编辑和删除的功能。
$("<div>123434</div>").appendTo($("#body")).hover(
function(){继续追加一个div上去,里面一个编辑按钮一个删除按钮},function(){移除掉这个编辑和删除功能的div}
);
这时页面变成这样<div id="body"><div>123434</div></div>.
然后我将<div>123434</div>会保存进数据库,用来生成页面。
然后这个模版还要可以修改的,打开编辑页面后我从数据库取出<div>123434</div>放进<div id="body"></div>里,这时hover事件由于这个div是从数据库取的,不是js来创建的,所以这个事件就没用了。
如何在绑定上这个事件呢。
由于模版内容很多,图片、文字、图片轮播、文章列表等等非常多东西,所以不可能加载模版后一个元素一个元素的在去绑定事件啊

------解决方案--------------------
用js写,让js自己生成html元素
------解决方案--------------------
可以使用事件代理)委派).delegate()
http://www.css88.com/jqapi-1.9/delegate/
------解决方案--------------------
var el = Ext.getElementById( id );
el.addListener( {
    mouseover: function(evt,el,o) {
    }
} );

------解决方案--------------------
4楼的答案应该是你想要的。
利用js的事件委托机制,将监听器绑定到外层div上(就是你的id为body的),这样内部div的mouseover事件冒泡到外层div上时会被捕捉到并处理。写法如下:
$('#body').delegate('div','mouseover',function(){
    //你的处理函数
});
这句话只要写在页面加载完后执行就可以了。
------解决方案--------------------
<div class="generateDiv">123434</div>

用一个属性标记一下生成的HTML,然后用delegate

js

$('body').delegate('.generateDiv','mouseenter',function(){/*继续追加一个div上去,里面一个编辑按钮一个删除按钮*/}).delegate('.generateDiv','mouseleave',function(){/*移除掉这个编辑和删除功能的div*/});

------解决方案--------------------


你的模板还没有抽象出来
原则性的东西没有抽象出来
你要封装抽象你的模板容器的每个必要事件

模板容器.on('事件','对象')