有关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 cookie操作代码
Mar 14 Javascript
jQuery登陆判断简单实现代码
Apr 21 Javascript
jquery让指定的元素闪烁显示的方法
Mar 17 Javascript
jQuery中使用animate自定义动画的方法
May 29 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
vue基于mint-ui的城市选择3级联动的示例
Oct 25 Javascript
微信小程序收藏功能的实现代码
Jun 12 Javascript
简述ES6新增关键字let与var的区别
Aug 23 Javascript
js 根据对象数组中的属性进行排序实现代码
Sep 12 Javascript
vue点击标签切换选中及互相排斥操作
Jul 17 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 会话(session 时间设定)使用入门代码
2008/06/05 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python实现TCP通信的示例代码
2019/09/09 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
煤矿班组长岗位职责
2013/12/29 职场文书
行政助理工作职责范本
2014/03/04 职场文书
公司经理聘任书
2014/03/29 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
个人自查自纠材料
2014/10/14 职场文书
违章停车检讨书
2014/10/21 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
Django实现翻页的示例代码
2021/05/24 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL