鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 429, 文章 - 235, 评论 - 5529, 引用 - 356
数据加载中……

在什么时候才会用到fireEvent方法呢?

    在DHTML开发中,微软在其DOM中为每个元素实现了一个fireEvent方法。我们知道HTML的事件onXXX可以由系统(IE环境)来管理和触发,也可以直接执行事件的handler,比如onclick,如果被赋予事件处理函数,我们可以用element.onclick()来执行事件处理函数。那么fireEvent用来干嘛呢?

    在MSDN中fireEvent的描述很简单:Fires a specified event on the object.
    bFired = object.fireEvent(sEvent [, oEventObject])

    并且MSDN给出了一个使用fireEvent的示例:

<HTML>
    
<HEAD>
        
<SCRIPT>
        
function fnFireEvents()
        
{
            div.innerText 
= "The cursor has moved over me!";
            btn.fireEvent(
"onclick");
        }

        
</SCRIPT>
    
</HEAD>
    
<BODY>
        
<h1>Using the fireEvent method</h1>
        By moving the cursor over the DIV below, the button is clicked.
        
<DIV ID="div" onmouseover="fnFireEvents();">
            Mouse over this!
        
</DIV>
        
<BUTTON ID="btn" ONCLICK="this.innerText='I have been clicked!'">Button</BUTTON>
    
</BODY>
</HTML>

    这个示例非常的简单,也完全说明了fireEvent的用法。不过这个示例有一点误导我们,从而让我们不容易发现frieEvent更有价值的使用方法。由于button的onclick事件被赋予语句:this.innerText = 'I have been clicked!',这里很容易误导我们,fireEvent产生的是执行了btn.onclick()的效果。嗯,确实是这个效果,但是意义却完全不同,btn.onclick()只是一个函数调用,它的执行必须依赖于用户对其赋值,否则btn.onclick为null,是不能执行btn.onclick()的。而fireEvent('onclick')的效果,"等同于"鼠标在button元素上进行了点击。

    由于IE的事件处理是bubble up方式,fireEvent(sEvent)就显得更加的有意义了,如果我们在一个table元素<table>中监听事件,比如onclick,当点击不同的td做出不同的响应时。如果使用程序来模拟,只能使用fireEvent这种方式,示例如下:

<table border="1" onclick="alert(event.srcElement.innerText);">
    
<tr>
        
<td id="abc">abc</td>
        
<td id="def">def</td>
    
</tr>
</table>
<button onclick="abc.fireEvent('onclick')">
    abc
</button>
<button onclick="def.fireEvent('onclick')">
    def
</button>

    使用abc.onclick()和def.onclick()将得到"Object doesn't support this property or method"异常。

   
abc def

     

    知道了fireEvent的用法,那么我们用它来做什么呢?在开发具有复杂事件处理动作组件时。有时我们需要从程序中去触发一个本身因该鼠标或键盘触发的事件,比如在TreeView控件中,我们一般是使用鼠标点击来Expand&Collapse一个结点,如果我们要用程序代码来实现这个操作怎么办呢?当然直接执行事件处理函数是可以的,不过如果事件处理函数依赖于event变量中的状态值,那么就必须使用fireEvent方法。

    原来我曾经说过,因该把事件处理的函数封装起来,便于直接调用。比如上面说到的TreeView节点的Expand和Collapse,我在TreeView控件中都是把它们封装成两个函数Expand和Collapse,在节点被点击时,执行:
 OpIcon.onclick = function()
 {
     
var objNode = this.Object;
     
if ( objNode.m_IsExpanded )
         objNode.Collapse();
    
else
         objNode.Expaned();
 }

    这样一来,在程序中控制Expand和Collapse也就是分别执行函数而已。不过后来发现既然DOM中有fireEvent方法,似乎我在"动态载入数据的无刷新TreeView控件(4)"中的某些想法也不是很必要了。

posted on 2005-04-07 23:53 birdshome 阅读(7994) 评论(16)  编辑 收藏 网摘 所属分类: Jscript&Dhtml开发

评论

#1楼   回复  引用  查看    

good
2005-04-08 08:40 | ttyp      

#2楼   回复  引用    

event在htc中用的更多一些,我的htc大部分都有event抛出。比如表格排序的会抛出onsort,选择的会抛出onselect。我认为event主要是在我们封装的时候可以留下给别人进行二次开发的接口。别人可以通过捕捉事件来做他想要做的操作。
老兄好像最近对js很着迷呀,而且研究的还挺深呀,真是人才辈出呀。
2005-04-08 08:40 | ocean[未注册用户]

#3楼   回复  引用  查看    

强!!佩服!!;)
2005-04-08 09:10 | Laser.NET      

#4楼   回复  引用    

真佩服老兄对脚本研究的深度,看了你博客上的文章,收获很多,但感觉自己写起来,还是有些力不从心,希望推荐一些好的资料!
msn:shenyang1007@hotmail.com,大家可以交流一下!
2005-04-08 09:11 | 木鱼。NET

#5楼   回复  引用  查看    

ocean老兄,能否指点一下htc中如何定义一个event,并且抛出呢?多谢:)
2005-04-08 09:12 | Laser.NET      

#6楼   回复  引用  查看    

我的msn:laser_lu@hotmail.com也希望大家能让我参与交流:)
2005-04-08 09:13 | Laser.NET      

#7楼   回复  引用  查看    

使用setcapture的时候用的多。
2005-04-08 09:15 | 辣妹子      

#8楼   回复  引用  查看    

区别好像是:
fireEvent() 可接收的参数只能是内置的参数, 例如onclick这样的熟面孔. HTC中custom的事件名是不接受的. 会报 invalid argument 错误.

关于如何在HTC中定义一个 event 并且 fire 它, MSDN文档即简练又明白. 别来问人了.

又及:
别再js, js 的了, 我们跟着丢不起这个人.
2005-04-09 01:41 | 春鱼      

#9楼   回复  引用    

不错 研究的深!!!
2005-06-24 09:09 | longer

#10楼   回复  引用  查看    

为什么a标签的onclick事件通过fireEvent模拟失败。

<script language="javascript" type="text/javascript">
<!--
var x = "mouseinfo\n";
function add(evt){
x +=evt+"\n";
obinfo = document.getElementById('info');
obinfo.innerText = x;
}
//-->
</script>

<a name="test" href="http://www.sina.com.cn"">http://www.sina.com.cn"
onmousedown="add('mouse_down')"
onmouseup="add('mouse_up')"
onkeydown="add('key_down')"
onkeyup="add('key_up')"
onclick="add('click')"
><h1>sina</h1></a><br/><br/>
<button onclick="test.fireEvent('onclick')">fireEvent_onclick</button><br/>
<button onclick="test.click()">直接点击</button><br/>

<textarea name="" id="info" rows="10" cols="80" >
</textarea>
2005-12-13 09:40 | 古代的专栏      

#11楼[楼主]   回复  引用  查看    

@古代的专栏
查了半天fireEvent得文档,没有发现有解释这个问题的:(
既然fireEvent不能触发A元素的"默认"事件,只能看成IE就是这么设计的,或者硬要算是bug也可以,不过没有证据。
2005-12-13 12:42 | birdshome      

#12楼   回复  引用    

A不能模拟的原因估计是A和onclick有冲突存在,A本身的跳转就是onclick或keyCode==13来做的
2006-05-25 09:42 | fishbone[未注册用户]

#13楼   回复  引用  查看    

在FF下用不了,感觉局限性比较大
2008-12-11 08:43 | canbeing      

#14楼   回复  引用  查看    

学习了,谢谢!
看了之后的感觉是fireevent最大的好处是可以动态的模拟事件,并且可以传入不同参数。
2009-01-19 16:44 | 飞林沙      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 128182




相关文章:

相关链接: