有关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 相关文章推荐
Textarea根据内容自适应高度
Oct 28 Javascript
HTML页面登录时的JS验证方法
May 28 Javascript
javascript数组排序汇总
Jul 07 Javascript
基于jQuery实现收缩展开功能
Mar 18 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
javascript实现小型区块链功能
Apr 03 Javascript
vue实现列表垂直无缝滚动
Apr 08 Vue.js
入门基础学习 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
几种显示数据的方法的比较
2006/10/09 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
Django框架封装外部函数示例
2019/05/28 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python实现壁纸下载与轮换
2020/10/19 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
村委会主任先进事迹
2014/01/15 职场文书
优秀教师先进事迹
2014/01/22 职场文书
网络技术专业求职信
2014/02/18 职场文书
高中家长寄语
2014/04/02 职场文书
新法人代表任命书
2014/06/06 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
商务代表岗位职责
2015/02/15 职场文书
2015年电信员工工作总结
2015/05/26 职场文书