嗨,这个问题更多的是最佳实践咨询,有时当我构建一个完整的ajax应用程序时,我通常会动态添加元素,例如。当你添加一个项目列表时,我会做类似的事情:
var template = new Template("<li id='list#{id}'>#{value}</li>");
var arrayTemplate = [];
arrayOfItem.each(function(item, index){
arrayTemplate.push(template.evaluate( id : index, value : item))
});
在这两个选项之后通过“update”或“insert”
添加列表 ----- $("elementToUpdate").update("<ul>" + arrayTemplate.join("") + "</ul">);
问题是
如何在不重复读取数组的过程中添加事件处理程序,这是因为如果您尝试在更新或插入之前添加事件,则会出现错误,因为该元素不在DOM上。< / p>
所以我现在正在做的是插入或更新之后:
arrayOfItem.each(function(item, index){
$("list" + index).observe("click", function(){
alert("I see the world");
})
});
所以问题是存在更好的方法来做这个??????
答案 0 :(得分:1)
我不会$("list" + index)
。
我会考虑两种方式:
1)让点击事件冒泡并进入$(“elementToUpdate”):
$("elementToUpdate").observe("click", function(evt){
alert("I see the world");
});
您可以在evt-object中找到单击的li。
2)不要重复$("list" + index)
,而只是
$("elementToUpdate").find("li").each(...);
(假设您正在使用jQuery。原型有类似的东西。)
答案 1 :(得分:0)
您好我在Prototype Mail列表中发布此问题,这就是答案
您好,
如果你真的想直接观察每个人li
,那么
你看起来非常简单明了。但在那种情况下,
除非有一个非常好的理由这样做,我不会使用
每个li
上的处理程序;我会听取elementToUpdate的点击(或
只有一个处理程序,而不是其中的ul
:
$("elementToUpdate").observe("click", function(event) {
var li;
// Find out which `li` was clicked:
li = event.findElement("li");
if (li) {
// Do something with the `li`
}
});
Prototype 1.7 has a new feature to simplify that a bit:
$("elementToUpdate").on("click", "li", function(event, li) {
// Do something with the `li`; note it's given as the second
// argument to the function
});
......在幕后,Prototype基本上就是在做我所做的 以上。如果您仍然使用1.6(和。),您将需要第一个版本 因为1.7仍然在RC1,我希望你可能是)。
T.J。克劳德 独立软件顾问 tj / crowder software / com www.crowdersoftware.com
链接是:http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/fec98641d72f6fea#