有关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 相关文章推荐
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 Javascript
Extjs NumberField后面加单位实现思路
Jul 30 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 Javascript
AngularJS自定义服务与fliter的混合使用
Nov 24 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
vue.js项目nginx部署教程
Apr 05 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
May 27 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 Javascript
微信小程序获取地理位置及经纬度授权代码实例
Sep 18 Javascript
JS实现简易贪吃蛇游戏
Aug 24 Javascript
vue实现选中效果
Oct 07 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中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
Python中获取对象信息的方法
2015/04/27 Python
python使用range函数计算一组数和的方法
2015/05/07 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Python3标准库总结
2019/02/19 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
机电一体化专业推荐信
2013/12/03 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
2014年行政部工作总结
2014/11/19 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
聘任书的格式及模板
2019/10/28 职场文书
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python