Javascript 使用Mootools';添加事件处理程序。addEvent()在某个地方神秘地失败
我在为一个web应用程序开发一些JS时遇到了一个相当令人难以置信的问题。不幸的是,我不能发布完整的代码,因为它是一个尚未发布的项目的一部分。这个问题让我和我问过的一些同事都感到困惑——据我所知,这应该是可行的 现在来看实际问题:用户在一些表单字段中输入一些信息并单击“确认”图像,然后将AJAX请求发送回服务器。服务器进行一些处理,然后返回一个带有状态和一些附加数据的响应。用户正在使用的模式对话框窗口中显示状态消息,并显示带有链接的图标。以下是Mootools Request.JSON对象的“onComplete”处理程序,删除了一些错误条件处理:Javascript 使用Mootools';添加事件处理程序。addEvent()在某个地方神秘地失败,javascript,ajax,mootools,Javascript,Ajax,Mootools,我在为一个web应用程序开发一些JS时遇到了一个相当令人难以置信的问题。不幸的是,我不能发布完整的代码,因为它是一个尚未发布的项目的一部分。这个问题让我和我问过的一些同事都感到困惑——据我所知,这应该是可行的 现在来看实际问题:用户在一些表单字段中输入一些信息并单击“确认”图像,然后将AJAX请求发送回服务器。服务器进行一些处理,然后返回一个带有状态和一些附加数据的响应。用户正在使用的模式对话框窗口中显示状态消息,并显示带有链接的图标。以下是Mootools Request.JSON对象的“on
onComplete: function(response) {
if (response) {
if (response.status == 0) {
// this means the request was successful
licenses = response.licenses;
updateControls();
licenseList();
// here I add the status message...
$("createform_result").innerHTML = "<img src=\'/media/com_supportarea/images/db_success.png\' /> License created. Download:<br /><br />";
// ...and the download "link"
if (response.tlsid) {
$("createform_result").innerHTML += "<a href=\"#\" id=\"newtlslic-"+response.tlsid+"\"><img src=\'/media/com_supportarea/images/download_small.png\' /></a> <em>TLS</em>";
// this line is here for debugging only, to make sure this
// block of code is run (it is) and the element is found (it is)
$("newtlslic-"+response.tlsid).style.border = "1px solid red";
$("newtlslic-"+response.tlsid).addEvent("click", function(e) {
// I've stripped out all other code, also for debugging
e.stop();
});
}
}
}
}
onComplete:函数(响应){
如果(答复){
如果(response.status==0){
//这意味着请求成功
许可证=响应。许可证;
updateControl();
执照持有者();
//在这里我添加状态消息。。。
$(“createform_result”).innerHTML=“已创建许可证。下载:
”;
//…和下载“链接”
if(response.tlsid){
$(“createform_结果”).innerHTML+=“TLS”;
//此行仅用于调试,以确保
//运行代码块(它是)并找到元素(它是)
$(“newtllic-”+response.tlsid).style.border=“1px实心红色”;
$(“newtllic-”+response.tlsid)。addEvent(“单击”,函数(e){
//我剥离了所有其他代码,也是为了调试
e、 停止();
});
}
}
}
}
显示带有链接的消息和图标,应用样式(显示红色边框),Firefox或Chrome中均未显示错误消息。但是,单击图标会导致将#附加到URL(e.stop()不起任何作用)。根据EventBug插件,链接没有附加任何点击事件。似乎.addEvent()在这里什么都不做
现在,他们有一个重要的问题:为什么会这样?我该如何解决?救命啊 javascript中的字符串是不可变的。当你做以下事情时:
$("createform_result").innerHTML += "<a href=\"#\" id=\"newtlslic-"+response.tlsid+"\"><img src=\'/media/com_supportarea/images/download_small.png\' /></a> <em>TLS</em>";
事件委派现在是1.4.0中mootools核心的一部分,或者在以前的版本中更多地在mootools中
玩得开心 你帮我搞定了,谢谢!我确实在向innerHTML添加更多内容:但不是在循环中。在所有的HTML操作之后,我只是简单地移动了.addEvent调用,它成功了。
// add this once, outside the loop
$("createform_result").addEvent("click:relay(a.editLink)", function(event, element) {
console.log(this === element);
console.log(this === event.target);
console.log(this.get("data-id"));
});
// then as you loop the results, just inject the els or use innerHTML or whatever...
new Element("a.editLink", {
html: '<img src=\'/media/com_supportarea/images/download_small.png\' /></a> <em>TLS</em>',
"data-id": response.tlsid
}).inject($("createform_result"));