JavaScript 委托 实现触发多个事件

Posted bywayboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript 委托 实现触发多个事件相关的知识,希望对你有一定的参考价值。

    有时候,我们需要一个时间触发多个处理函数,这个时候简单的 e.attachEvent似乎已经不能满足我们的要求,今天编写页面,想通过 class定义了一批组件的风格,但又希望它们能够响应鼠标操作而改变风格,却不至于影响事件。

    我今天就遇到了这个问题。从互联网上搜索了一下,找到了一个,用了一下,感觉还可以。但是,随着深入,这个看起来完美的例子 问题也就渐渐显现出来。缺陷是,不能响应在 html标签内定义好的事件。例如:

< input  type ="text"  class ="textbox"  onfocus ="alert('good');"   />

 在使用委托后,这个 alert()就不会被执行了。怎么改好这个问题呢?这个好说。呵呵……。稍微修改了下前人的代码。一切OK。

 

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312"   />
< title > 无标题文档 </ title >
< style >
.textbox 
{
    background-image
: url(images/input.png);
    border
:1px solid #999999;
    line-height
:20px;
    height
:20px;
}

.textbox_focus 
{
    background-image
: url(images/input.png);
    background-position
:0px -100px;
    border
:1px solid #00CC00;
    line-height
:20px;
    height
:20px;
}

</ style >
</ head >

< body  onload ="setStyle()" >
< input  type ="text"  class ="textbox"  onfocus ="alert('good');"   />
< input  type ="text"  class ="textbox"   />
</ body >
< script >
function delegate(func){
    
this.arr = new Array(); // 回调函数数组
    this.nrr = new Array();
    
this.add = function(n,func){
        
this.arr[this.arr.length] = func;
        
if(n.substring(0,2)=='on')
            
this.nrr[this.nrr.length] = n.substring(2);
        
else
            
this.nrr[this.nrr.length] = n;
    }
;
    
this.run = function(e){
        
for(var i=0;i<this.arr.length;i++){
            
var func = this.arr[i];
            
if(typeof func == "function"){
                
if(this.nrr[i]==e.type)
                    func(); 
// 遍历所有方法以及调用
            }

        }

    }

}

// 新建一个实现attach event的函数
function mrun_event(){
    
this.dEv.run(event);
}

function mAttachEvent(obj,sEvent,func){
    
if(!obj.dEv) obj.dEv = new delegate();
    
if(null!=eval("obj."+sEvent) && eval("obj."+sEvent+"!=mrun_event")){
        eval(
"obj.dEv.add('"+sEvent+"',obj."+sEvent+")");
    }

    obj.dEv.add(sEvent,func);
    eval(
"obj." + sEvent + " = mrun_event");
}

function setStyle(){
var ipts=document.getElementsByTagName('input');
    
for(i=0;i<ipts.length;i++){
        mAttachEvent(ipts[i],
'onfocus',function(){
            e
=event.srcElement;
            
switch(e.className){
            
case 'textbox':
                e.className
='textbox_focus';break;
            }

        }
);
        mAttachEvent(ipts[i],
'onblur',function(){
            e
=event.srcElement;
            
switch(e.className){
            
case 'textbox_focus':
                e.className
='textbox';break;
            }

        }
);
    }

}

</ script >
</ html >

以上是关于JavaScript 委托 实现触发多个事件的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中的事件委托机制

JavaScript------事件委托(event delegation)

jQuery Mobile 页面加载事件委托 javascript 触发两次

JavaScript 事件冒泡,事件捕获,事件委托

Javascript中的事件委托(事件代理)

JavaScript中冒泡与事件委托