陌上花開

          遇高山,我御風(fēng)而翔,逢江河,我凌波微波

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
           在DHTML開發(fā)中,微軟在其DOM中為每個(gè)元素實(shí)現(xiàn)了一個(gè)fireEvent方法。我們知道HTML的事件onXXX可以由系統(tǒng)(IE環(huán)境)來管理和觸發(fā),也可以直接執(zhí)行事件的handler,比如onclick,如果被賦予事件處理函數(shù),我們可以用element.onclick()來執(zhí)行事件處理函數(shù)。那么fireEvent用來干嘛呢?

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

              并且MSDN給出了一個(gè)使用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>

              這個(gè)示例非常的簡單,也完全說明了fireEvent的用法。不過這個(gè)示例有一點(diǎn)誤導(dǎo)我們,從而讓我們不容易發(fā)現(xiàn)frieEvent更有價(jià)值的使用方法。由于button的onclick事件被賦予語句:this.innerText = 'I have been clicked!',這里很容易誤導(dǎo)我們,fireEvent產(chǎn)生的是執(zhí)行了btn.onclick()的效果。嗯,確實(shí)是這個(gè)效果,但是意義卻完全不同,btn.onclick()只是一個(gè)函數(shù)調(diào)用,它的執(zhí)行必須依賴于用戶對其賦值,否則btn.onclick為null,是不能執(zhí)行btn.onclick()的。而fireEvent('onclick')的效果,"等同于"鼠標(biāo)在button元素上進(jìn)行了點(diǎn)擊。

              由于IE的事件處理是bubble up方式,fireEvent(sEvent)就顯得更加的有意義了,如果我們在一個(gè)table元素<table>中監(jiān)聽事件,比如onclick,當(dāng)點(diǎn)擊不同的td做出不同的響應(yīng)時(shí)。如果使用程序來模擬,只能使用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的用法,那么我們用它來做什么呢?在開發(fā)具有復(fù)雜事件處理動(dòng)作組件時(shí)。有時(shí)我們需要從程序中去觸發(fā)一個(gè)本身因該鼠標(biāo)或鍵盤觸發(fā)的事件,比如在TreeView控件中,我們一般是使用鼠標(biāo)點(diǎn)擊來Expand&Collapse一個(gè)結(jié)點(diǎn),如果我們要用程序代碼來實(shí)現(xiàn)這個(gè)操作怎么辦呢?當(dāng)然直接執(zhí)行事件處理函數(shù)是可以的,不過如果事件處理函數(shù)依賴于event變量中的狀態(tài)值,那么就必須使用fireEvent方法。

              原來我曾經(jīng)說過,因該把事件處理的函數(shù)封裝起來,便于直接調(diào)用。比如上面說到的TreeView節(jié)點(diǎn)的Expand和Collapse,我在TreeView控件中都是把它們封裝成兩個(gè)函數(shù)Expand和Collapse,在節(jié)點(diǎn)被點(diǎn)擊時(shí),執(zhí)行:
           OpIcon.onclick = function()
           {
               
          var objNode = this.Object;
               
          if ( objNode.m_IsExpanded )
                   objNode.Collapse();
              
          else
                   objNode.Expaned();
           }

              這樣一來,在程序中控制Expand和Collapse也就是分別執(zhí)行函數(shù)而已。不過后來發(fā)現(xiàn)既然DOM中有fireEvent方法,似乎我在"
          轉(zhuǎn)載:
          http://www.cnblogs.com/birdshome/archive/2005/04/07/128182.html
          posted on 2010-04-01 22:19 askzs 閱讀(391) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          我要啦免费统计
          主站蜘蛛池模板: 江西省| 阳城县| 东光县| 彭山县| 凤冈县| 滦平县| 宜宾县| 泗阳县| 都安| 资溪县| 宁强县| 和硕县| 正定县| 桃江县| 洪江市| 隆林| 乐亭县| 红桥区| 南投县| 当雄县| 张掖市| 德保县| 封丘县| 建阳市| 巍山| 易门县| 滕州市| 丰台区| 宜州市| 鞍山市| 万山特区| 天长市| 锦屏县| 木里| 嘉善县| 临沭县| 新竹县| 南开区| 新巴尔虎右旗| 大渡口区| 师宗县|