有关DOM元素与事件的3个谜题


Posted in Javascript onNovember 11, 2010

一、背景知识介绍
通常为DOM元素增加事件有以下几种办法:
1,硬编码形式
2,事件监听
3,JS框架提供的事件绑定
1,硬编码形式,采用的是原始事件(Original Event)的形式。
代码类似如下:

<element onclick='func();' /> 
document.getElementById('element_id').eventName = func();

2,事件监听机制,这种形式采用的做法是根据DOM事件机制,分为DOM标准事件模型addEventListener和IE事件模型attchEvent。
代码类似如下:
var addEventHandler = function(ele, evt, fn){ 
if (ele.addEventListener) { 
ele.addEventListener(evt, fn, false); 
} 
else 
if (ele.attachEvent) { 
ele.attachEvent('on' + evt, fn); 
} 
else { 
ele['on' + evt] = fn; 
} 
}; 
var ele = document.getElementById('element_id'); 
addEventHandler(ele, 'eventName', function(){ code... });

3,JS框架提供的事件绑定机制,这里假设使用jQuery框架。
代码类似如下:
$('element_id').bind('eventName', function(event){ code... }); 
$('element_id').click(function(){ code... });

二、谜题
谜题是这样的,加入页面中有如下的代码片段:
<html> 
... ... 
<script type="text/javascript" src="js/jquery-lastest.js"></script> 
<script type="text/javascript"> 
var addEventhandler = function(ele, evt, fn){ 
if (ele.addEventListener) { 
ele.addEventListener(evt, fn, false); 
} 
else 
if (ele.attchEvent) { 
ele.attchEvent('on' + evt, fn); 
} 
else { 
ele['on' + evt] = fn; 
} 
}; 
function func_test(){ 
not_existfunc(); 
} 
$(document).ready(function(){ 
// code 02 
var jsbutton03 = document.getElementById('jsbutton_original_id03'); 
jsbutton03.onclick = func_test; 
// code 03 
var jsbutton02 = document.getElementById('jsbutton_original_id02'); 
addEventhandler(jsbutton02, 'click', func_test); 
// code 04 
$('#jqbutton_standard_id01').click(func_test); 
}); 
window.onerror = function(){ 
return true; 
}; 
</script> 
... ... 
<body> 
<input id="jsbutton_original_id01" type="button" onclick="func_test();" /> <!-- code 01 --> 
<input id="jsbutton_original_id02" type="button" /> 
<input id="jsbutton_original_id03" type="button" /> 
<input id="jqbutton_standard_id01" type="button" /> 
</body> 
... ... 
<script type="text/javascript"> 
// code 05 
$(document).ready(function(){ 
/* 
* 在这里编写代码,目标是在不改变上面代码的情况下对Code 1 ~ 4 的里的事件进行“手术”。 
* 手术的要求是: 
* Code 1 ~ 4 里的触发的OnClick行为会触发func_test方法,该方法会触发一个不存在的方法not_exist(); 
* 要求对其增加try/catch,再catch里捕获此错误。 
* 这里我提供 Code 1, 2 的改写方法,浏览器的兼容程度只需要考虑主流的IE6,7,8和FireFox3+即可,Chrome,Safari,Opera可以不考虑。 
* 代码可以使用jq代码,也可以使用js代码实现。 
*/ 
// hijack code 01 
var original_sorce_01 = $('#jsbutton_original_id01').attr('onclick'); // typeof original_source_01 is function 
$('#jsbutton_original_id01').removeattr('onclick').click(function(event){ 
try{ 
original_sorce_01(); 
} catch (ex) { 
// code... ... 
} 
}); 
// hijack code 02 
var jsbutton02 = document.getElementById('jsbutton_original_id02'); 
var original_source_02 = jsbutton02.onclick; 
jsbutton02.onclick = function(){ 
try{ 
original_source_02(); 
} catch (ex) { 
// code... ... 
} 
}; 
}); 
</script> 
</html>

遵循以上的思路,有没有人可以帮助我写一下hijack code 03 和 hijack code 04的代码?或者提供其他解决途径呢?
遵循以上的思路,有没有人可以帮助我写一下hijack code 03 和 hijack code 04的代码?或者提供其他解决途径呢?
1,既有代码是绝对不能修改的。
2,如果可以,扩展js原始类也是允许的。
3,func_test和not_existfunc是事先不知道的,只能通过“获取”得到。
4,最终的目的我需要知道错误发生的错误对象,方法名和事件、参数,基于此目的,其他解决方案也是可以的。
5,不能使用firebug之类的客户端调试工具。来让这类工具告诉你“代码错了”。
Javascript 相关文章推荐
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
Jan 22 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
Javascript闭包(Closure)详解
May 05 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
May 15 Javascript
jQuery Plupload上传插件的使用
Apr 19 jQuery
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
JS实现去除数组中重复json的方法示例
Dec 21 Javascript
利用jqgrid实现上移下移单元格功能
Nov 07 Javascript
vue项目中实现的微信分享功能示例
Jan 21 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
Sep 28 Javascript
vue.js实现只能输入数字的输入框
Oct 19 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 #Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
Nov 11 #Javascript
javascript正则表达式中参数g(全局)的作用
Nov 11 #Javascript
工作中常用到的JS表单验证代码(包括例子)
Nov 11 #Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
Nov 11 #Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 #Javascript
关于firefox的ElementTraversal 接口 使用说明
Nov 11 #Javascript
You might like
生成静态页面的PHP类
2006/07/15 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php实现学生管理系统
2020/03/21 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python分割列表(list)的方法示例
2017/05/07 Python
python pygame实现2048游戏
2018/11/20 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
经典婚礼主持词
2014/03/13 职场文书
创业计划书之寿司
2019/07/19 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
创业计划书之废品回收
2019/09/26 职场文书
创业计划书之熟食店
2019/10/16 职场文书
导游词之上海豫园
2019/10/24 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL