您的位置:首页 > Web前端 > JavaScript

JavaScript:按钮事件动态绑定

2008-10-20 15:33 543 查看
基于 prototype.js, v1.6

给元素动态绑定事件,之前在网上查到的是用bind方法,感觉不好理解,而且当动态绑定的方法又要加参数时就不好整了。
改用此方法比较好理解,写起来也简单方便。
$(myelements).setAttribute("onclick", "xxx();");
$(myelements).setAttribute("onblur", "update($F('input1')");//这个看起来好像不行
$(myelements).setAttribute("onchange", "updateElem(" + varName + ")");
再简单点的说,就是拼装字符串了。

实战:
给页面上的部分按钮添加离开提示。

需求:某一个功能是通过ajax的连续请求来完成的,需要花费很长的时间(window.setInterval(function(){xxxxxx}, 3000);),当此功能开始运作后,点击页面上的一些按钮将给予提示:"XXX已经开始了,确定要离开这个页面吗?"

实际情况是,这个需求在开发一开始的时候并没有给予充分的重视,都是按部就班,页面上的每个按钮,该干啥都自己在干啥,例如"quitButton"就是onclick="window.location.href='logout.do'"。
<input type='button' id='quitButton' onclick="window.location.href='logout.do' />

或者

<a href="#" id="quitLink" onclick="window.location.href='logout.do'" />
问题转化为:需要用户在那个function开始process之后,点击quitButton后先弹出一个confirm的dialog,此时点击"取消"不管,但点击"确定"就要请求那个logout。

。。。。。。。。。突然没心情了,就直接说要点,贴代码:

首先肯定要修改当前的onclick(要弹出个dialog)
其次,在修改之前,也肯定要备份当前的onclick(点击确定后你去干嘛)
最后,点击确定后就去调用先前备份的方法

其他的小tip
function开始process后,应该定义一个boolean型的全局变量:isProcessing

具体代码:(与我们实际应用的略有不同,现在没心情重新测试)
var isProcessing = false;

PageJumper = Class.create();
PageJumper.prototype = {
initialize: function(name, elements, msg) {
this.elements = elements;
this.name = name;
this.msg = msg;
this.init();
},

init: function(){
for(i = 0; i < this.elements.length; i++) {
eid = this.elements[i];
if(!($(eid))) {
continue;
}
orgMethod = $(eid).getAttribute("onclick");
$(eid).setAttribute("onclick", this.name + ".clickOnElem('" + eid + "');");
$(eid).setOriginalMethod(orgMethod);
}
},

clickOnElem: function(eid) {
if(!(isProcessing == true)) {
this.invokeElementOriginalMethod($(eid).getOriginalMethod());
return;
}
if(confirm(this.msg)){
this.invokeElementOriginalMethod($(eid).getOriginalMethod());
}
},

invokeElementOriginalMethod: function(m) {
eval(m);
}
}

Object.extend(Element.prototype, {
setOriginalMethod: function(method) {
this.originalMethod = method;
},

getOriginalMethod: function(){
return this.originalMethod;
}
});
外部如此调用:
pj = new PageJumper('pj', ['quitButton'], "正在xx……确定停止吗?");
init方法的参数解释下
name:与PageJumper的实例名称保持一致,因为这边用的是字符串拼接。
elements:要进行修改的元素组
msg:弹出的消息内容

这里只对isProcessing变量进行读操作,写操作应该放到function的开始结束处。

后一段的 Object.extend.....是用来做原有方法备份的。

PS一个题外的,他们真BT。。。
产品部门的doc设计文档里,随便用了一段文字“好技法ioejg 技法ioajeoigf警方介绍的方法二哦”(截图里面的)。
结果,UI人员给我们的html文件里面,也是用的这一段。。。

这里没有考虑到直接用href跳转的情况,但也就是在invokeElementOriginalMethod()里面多判断一下了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: