有关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 相关文章推荐
JavaScript中“过于”犀利地for/in循环使用示例
Oct 22 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
使用impress.js制作幻灯片
Sep 09 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
jquery表单提交带错误信息提示效果
Mar 09 Javascript
详解如何用webpack打包一个网站应用项目
Jul 12 Javascript
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
详解vue中移动端自适应方案
May 05 Javascript
如何从头实现一个node.js的koa框架
Jun 17 Javascript
mock.js模拟前后台交互
Jul 25 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 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安全防范技巧分享
2011/11/03 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
php简单获取目录列表的方法
2015/03/24 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
javascript 闭包疑问
2010/12/30 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
vue.js项目nginx部署教程
2018/04/05 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
python实现复制整个目录的方法
2015/05/12 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
Python基础知识点 初识Python.md
2019/05/14 Python
详解Python实现进度条的4种方式
2020/01/15 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
小学安全工作总结2015
2015/05/18 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
校园安全学习心得体会
2016/01/18 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js