JavaScript:按钮事件动态绑定

基于 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"就是οnclick="window.location.href='logout.do'"。
  1. <input type='button' id='quitButton' onclick="window.location.href='logout.do' />
  2. 或者
  3. <a href="#" id="quitLink" onclick="window.location.href='logout.do'" />
问题转化为:需要用户在那个function开始process之后,点击quitButton后先弹出一个confirm的dialog,此时点击"取消"不管,但点击"确定"就要请求那个logout。

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

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

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

具体代码:(与我们实际应用的略有不同,现在没心情重新测试)
  1. var isProcessing = false;
  2. PageJumper = Class.create();
  3. PageJumper.prototype = {
  4.     initialize: function(name, elements, msg) {
  5.         this.elements = elements;
  6.         this.name = name;
  7.         this.msg = msg;
  8.         this.init();
  9.     },
  10.     
  11.     init: function(){
  12.         for(i = 0; i < this.elements.length; i++) {
  13.             eid = this.elements[i];
  14.             if(!($(eid))) {
  15.                 continue;
  16.             }
  17.             orgMethod = $(eid).getAttribute("onclick");
  18.             $(eid).setAttribute("onclick"this.name + ".clickOnElem('" + eid + "');");
  19.             $(eid).setOriginalMethod(orgMethod);
  20.         }
  21.     },
  22.     
  23.     clickOnElem: function(eid) {
  24.         if(!(isProcessing == true)) {
  25.             this.invokeElementOriginalMethod($(eid).getOriginalMethod());
  26.             return;
  27.         }
  28.         if(confirm(this.msg)){
  29.             this.invokeElementOriginalMethod($(eid).getOriginalMethod());
  30.         }
  31.     },
  32.     
  33.     invokeElementOriginalMethod: function(m) {
  34.         eval(m);
  35.     }
  36. }
  37. Object.extend(Element.prototype, {
  38.     setOriginalMethod: function(method) {
  39.         this.originalMethod = method;
  40.     },
  41.     
  42.     getOriginalMethod: function(){
  43.         return this.originalMethod;
  44.     }
  45. });
外部如此调用:
  1. pj = new PageJumper('pj', ['quitButton'], "正在xx……确定停止吗?");
init方法的参数解释下
name:与PageJumper的实例名称保持一致,因为这边用的是字符串拼接。
elements:要进行修改的元素组
msg:弹出的消息内容

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

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


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



这里没有考虑到直接用href跳转的情况,但也就是在 invokeElementOriginalMethod()里面多判断一下了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值