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()里面多判断一下了。
给元素动态绑定事件,之前在网上查到的是用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()里面多判断一下了。
相关文章推荐
- javascript动态生成按钮并绑定点击事件
- javascript动态绑定事件用法
- html javascript 转移字符 单引号 双引号 动态事件绑定
- 用扫雷游戏说明c#按钮动态绑定鼠标事件
- Android列表动态绑定按钮点击事件
- Javascript(jQuery)中绑定页面上所有按钮点击事件的几种方式
- JavaScript动态添加|绑定事件
- JavaScript给按钮绑定点击事件(onclick)的方法
- asp.net为按钮绑定javascript确认事件
- 动态生成按钮并绑定事件
- iOS--- 动态添加了按钮,绑定同一个点击事件,如何判断点击的是哪个?
- 使用decj简化Web前端开发(一):声明式Javascript动态加载和浏览器事件绑定
- ios 动态添加了按钮,绑定同一个点击事件,如何判断点击的是哪个?
- ajax动态加载页面,对页面的按钮绑定点击事件
- html javascript 转移字符 单引号 双引号 动态事件绑定
- JavaScript动态添加|绑定事件
- 使用decj简化Web前端开发一:声明式Javascript动态加载和浏览器事件绑定
- javascript 动态调用点击 按钮的事件ele.onclick();
- 动态绑定按钮事件
- javascript深入学习-DOM取参绑定事件-按钮计算器