有关DOM元素与事件的3个谜题

一、背景知识介绍
通常为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之类的客户端调试工具。来让这类工具告诉你“代码错了”。

(0)

相关推荐

  • 有关DOM元素与事件的3个谜题

    一.背景知识介绍 通常为DOM元素增加事件有以下几种办法: 1,硬编码形式 2,事件监听 3,JS框架提供的事件绑定 1,硬编码形式,采用的是原始事件(Original Event)的形式. 代码类似如下: 复制代码 代码如下: <element onclick='func();' /> document.getElementById('element_id').eventName = func(); 2,事件监听机制,这种形式采用的做法是根据DOM事件机制,分为DOM标准事件模型addEve

  • JQuery为页面Dom元素绑定事件及解除绑定方法

    1.绑定事件 复制代码 代码如下: $('#id').bind("click",function(){ ... }) 可一次性绑定多个事件 复制代码 代码如下: $('#id').bind("click mouseover mouseout",function(){ ... }) 2.解除绑定 复制代码 代码如下: $('#id').unbind("click") 3.绑定一次 复制代码 代码如下: $('#id').one("clic

  • Javascript处理DOM元素事件实现代码

    DOM元素都有一些标准事件,一般使用时只要使用onclick=function的方式就可以了,但是当需要为DOM元素添加多个事件,删除事件,或在用Javascript封装控件的时候,为封装的控件添加自定义事件的时候,onclick=function的方式就不够用了,但是浏览器有addEventListener和attachEvent方法可供调用,从而模拟出类似于C#中的事件委托的事件触发机制! 复制代码 代码如下: /* * 功能:事件处理 * Author:LQB * 时间:2009-1-4

  • jQuery中dom元素上绑定的事件详解

    作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的.比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台... 好,不扯远,说说当你想看到网站上某个元素绑定的事件函数的代码时应该怎么做吧. 查看原生绑定的事件函数代码 所谓原生就是通过addEventListener方法绑定到dom元素上.这个好办: 审查绑定事件的元素(对着它右键->审查元素)在弹出的Elements视图的控制台,右侧点击"Event Listeners&quo

  • 解决给dom元素绑定click等事件无效问题的方法

    之前一直遇到js插件生成的元素,click事件无效的问题,重新绑定也不行,终于找到解决方法,在此记下来. 同时加深对js事件处理机制的理解. 1. 事件被解绑 这种情况下一般不会导致click失效,但以下情况,click事件就失效了: $(function(){ $('.btn').unbind() }) $('.btn').click(function(){ //... }) 所以,click事件要有个好习惯: $(function(){ $('.btn').click(function(){

  • VUE中v-on:click事件中获取当前dom元素的代码

    在开发中总是忘记,特意在此记录 关键字:   $event <div class="bed" v-on:click="updateBed(index,$event)">{{item.BedID}}<br>{{item.CriminalName}}</div> updateBed: function(index, e) { var selectedBedDom = $(e.srcElement)//dom元素 } PS:下面看下v-

  • JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法

    本文实例讲述了JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法.分享给大家供大家参考,具体如下: 最近项目中遇到了在同一DOM元素上需要添加 onclick 和 ondblclick 2个事件,如果按照正常的方式添加处理,结果发现只会执行 onclick,而不会执行 ondblclick:这时我们需要对2个事件的处理函数稍作处理就可以实现2个事件并存了,代码如下: <script type="text/javascript"> var cl

  • jquery获取并修改触发事件的DOM元素示例【基于target 属性】

    本文实例讲述了jquery获取并修改触发事件的DOM元素.分享给大家供大家参考,具体如下: 需求 当点击关注后,改变按钮样式并显示取消关注,如图 实现 利用jQuery的 target获取到触发该事件的dom,然后修改它 target 属性 代码: HTML <div class="people-desc"> <div class="people-name">{$vo['nickname']}</div> <div clas

  • 通过Mootools 1.2来操纵HTML DOM元素

    我们已经学习过如何来选取DOM元素,怎么创建数组,怎么创建函数,怎么把事件添加到元素,今天我们来深入地学习一下如果操纵HTML元素.通过MooTools 1.2,你可以添加新元素到一个HTML页面中,也可以删除元素,以及改变任何样式或者元素参数,这些都非常容易. 基本方法 .get(); 这个工具可以让你获取元素的属性(property).元素的属性是组成一个HTML元素的各种不同部分,例如src.value.name等等.使用.get();方法非常简单: 参考代码: 复制代码 代码如下: //

  • AngularJS实现给动态生成的元素绑定事件的方法

    本文实例讲述了AngularJS实现给动态生成的元素绑定事件的方法.分享给大家供大家参考,具体如下: 1 . 我们知道在jQuery中,动态生成一个元素,如果要在动态生成元素的同时,动态绑定事件,可以通过live/on方法(在jquery3.0中已经废除了bind方法). 2 . 在AngularJS中,操作DOM一般在指令中完成,事件监听机制是在对于已经静态生成的dom绑定事件,而如果在指令中动态生成了DOM节点,动态生成的节点不会被JS事件监听. 举例来说: angular.module('

随机推荐