有关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增删元素的代码
Feb 14 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
Bootstrap项目实战之首页内容介绍(全)
Apr 25 Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
Jul 27 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
Node+Express+MongoDB实现登录注册功能实例
Apr 23 Javascript
Angular resolve基础用法详解
Oct 03 Javascript
vue-cli项目中使用echarts图表实例
Oct 22 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
Oct 28 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 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/10/09 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Djang中静态文件配置方法
2015/07/30 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
python读取图片任意范围区域
2019/01/23 Python
Python适配器模式代码实现解析
2019/08/02 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python基于openpyxl生成excel文件
2020/12/23 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
请说出几个常用的异常类
2013/01/08 面试题
主要的Ajax框架都有什么
2013/11/14 面试题
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
素质教育学习心得体会
2016/01/19 职场文书
高中语文教学反思范文
2016/02/16 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python