欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
理解JavaScript中的事件

http://monw3c.blogbus.com/logs/17322672.html

在很多語(yǔ)言的學(xué)習中,“事件”都是一個(gè)比較難理解,但是又是一個(gè)很重要的概念。javascript中的事件處理也是一樣,正因為有了事件處理,才會(huì )出現Ajax拖動(dòng)的效果。本文就討論一下JavaScript中的事件處理,讀過(guò)之后,您就會(huì )知道,很多Ajax框架實(shí)現拖動(dòng)效果的原理了。
一、 IE Event對象
(一)IE Event對象的主要屬性和方法
  在IE中有一個(gè)專(zhuān)門(mén)負責事件處理的對象Event,這個(gè)對象負責對事件的處理,含有很多的屬性和方法,通過(guò)這些方法和屬性的調用,就能完成很多的事件處理。
  type:事件的類(lèi)型,就是HTML標簽屬性中,沒(méi)有“on”前綴之后的字符串,例如“Click”就代表單擊事件。
  srcElement:事件源,就是發(fā)生事件的元素。
  button:聲明了被按下的鼠標鍵,是一個(gè)整數。1代表鼠標左鍵,2代表鼠標右鍵,4代表鼠標的中間鍵,如果按下了多個(gè)鼠標鍵,就把這些值加在一起,所以3就代表左右鍵同時(shí)按下。
  clientX/clientY:是指事件發(fā)生的時(shí)候,鼠標的橫、縱坐標,返回的是整數,它們的值是相對于包容窗口的左上角生成的。
  offsetX/offsetY:鼠標指針相對于源元素的位置,可以確定單擊Image對象的哪個(gè)象素。
  altKey,ctrlKey,shiftKey:顧名思義,這些屬性是指鼠標事件發(fā)生的時(shí)候,是否同時(shí)按住了Alt、Ctrl或者Shift鍵,返回的是一個(gè)布爾值。
  keyCode:返回keydown和keyup事件發(fā)生的時(shí)候,按鍵的代碼以及keypress事件的Unicode字符。
  fromElement、toElement前者是指代mouseover事件移動(dòng)過(guò)的文檔元素,后者指代mouseout事件中鼠標移動(dòng)到的文檔元素。
  cancelBubble:一個(gè)布爾屬性,把它設置為true的時(shí)候,將停止事件進(jìn)一步起泡到包容層次的元素。
  returnValue:一個(gè)布爾值屬性,設置為false的時(shí)候可以組織瀏覽器執行默認的事件動(dòng)作,相當于<a href=”#” onclick=”ProcessMethod();return false;” />。
attachEvent()和detachEvent()方法:為制定DOM對象事件類(lèi)型注冊多個(gè)事件處理函數的方法,它們有兩個(gè)參數,第一個(gè)是事件類(lèi)型,第二個(gè)是事件處理函數。在attachEvent()事件執行的時(shí)候,this關(guān)鍵字指向的是window對象,而不是發(fā)生事件的那個(gè)元素。
 ?。ǘ㊣E Event對象的一些說(shuō)明
  1.IE Event對象是一個(gè)全局屬性
  在IE中,不能把Event對象作為參數傳遞給事件處理程序,只能用window.event或者event來(lái)引用Event對象。因為在IE中,Event是window的一個(gè)屬性,也就是說(shuō)event是一個(gè)全局變量,這個(gè)變量提供了事件的細節。

HGX注:在IE下,有一種特殊情況:當通過(guò)attachEvent來(lái)注冊事件時(shí),事件對象是通過(guò)一個(gè)隱藏參數傳遞到EventHander里的,我們可以通過(guò)arguments[0]來(lái)取到它。
2.IE中事件的起泡:IE中事件可以沿著(zhù)包容層次一點(diǎn)點(diǎn)起泡到上層,也就是說(shuō),下層的DOM節點(diǎn)定義的事件處理函數,到了上層的節點(diǎn)如果還有和下層相同事件類(lèi)型的事件處理函數,那么上層的事件處理函數也會(huì )執行。例如,<div>標簽包含了<a>,如果這兩個(gè)標簽都有onclick事件的處理函數,那么執行的情況就是先執行<a>標簽的onclick事件處理函數,再執行<div>的事件處理函數。如果希望<a>的事件處理函數執行完畢之后,不希望執行上層的<div>的onclick的事件處理函數了,那么就把cancelBubble設置為false即可。
  
二、 IE中拖動(dòng)DOM元素的例子
/*
  該函數由mousedown事件處理調用
  它為隨后發(fā)生的mousemove和mouseup事件注冊了臨時(shí)的捕捉事件處理程序
  并用這些事件處理程序拖動(dòng)指定的文檔元素
  第二個(gè)參數必須是mousedown事件的事件對象
*/
function beginDrag(elementToDrag,event)
{
  //該元素當前位于何處
  //該元素的樣式性質(zhì)必須具有left和top CSS屬性
  //此外,我們假定他們用象素做單位
  //var x=parseInt(elementToDrag.style.left);
  //var y=parseInt(elementToDrag.style.top);  
  //計算一個(gè)點(diǎn)和鼠標點(diǎn)擊之間的距離,下面的嵌套的moveHandler函數需要這些值
  var deltaX=event.clientX-parseInt(elementToDrag.style.left);
  var deltaY=event.clientY-parseInt(elementToDrag.style.top);  
//  注冊mousedown事件后發(fā)生的mousemove和mouseup事件的處理程序
//  注意,它們被注冊為文檔的捕捉事件處理程序
//  在鼠標按鈕保持按下的狀態(tài)的時(shí)候,這些事件處理程序保持活動(dòng)的狀態(tài)
//  在按鈕被釋放的時(shí)候,它們被刪除
  document.attachEvent("onmousemove",moveHandler);
  document.attachEvent("onmouseup",upHandler);   
  //我們已經(jīng)處理了該事件,不要讓別的元素看到它
event.cancelBubble=true;
event.returnValue=false;  
  /*
    這是在元素被拖動(dòng)時(shí)候捕捉mousemove事件的處理程序,它響應移動(dòng)的元素    
  */
  function moveHandler(e)  
  {
    //把元素移動(dòng)到當前的鼠標位置
    e=window.event;
    elementToDrag.style.left=(event.clientX-deltaX)+"px";
    elementToDrag.style.top=(event.clientY-deltaY)+"px";    
    //不要讓別的元素看到該事件
    event.cancelBubble=true;    
  }  
  /*
    該事件將捕捉拖動(dòng)結束的時(shí)候發(fā)生的mouseup事件
  */
  function upHandler(e)
  {
    //注銷(xiāo)事件處理程序
      document.detachEvent("onmouseup",upHandler);
      document.detachEvent("onmousemove",moveHandler);}   
      event.cancelBubble=true;
    }  
   調用它的HTML文件代碼:
 <html>
 <head>
     <title>Untitled Page</title>
     <script type="text/javascript" src="dragIE.js"></script>
 </head>
 <body>
 <div style="position:absolute;left:100px;top:100px;background-color:White;border:solid black;">
   <div style="background-color:Gray;border-bottom:solid black;padding:3px;font-family:Sans-Serif;font-weight:bold;" >
   拖動(dòng)我         
   </div>
   <div>
   <p>This is a test.Testing,testing</p></div>
 </div>
 </body>
三、 DOM中的高級事件處理
IE6中的事件處理,并不是W3C DOM標準的事件處理模型,所以如果上述代碼運行在MozillaFirefox的瀏覽器中,就會(huì )失去作用,同時(shí)即將發(fā)布的IE 7也將支持W3CDOM的二級標準,所以掌握DOM的高級事件處理顯得就很重要了,因為W3C DOM二級標準是未來(lái)Web的發(fā)展方向,同時(shí)W3CDOM的API非常常用,為未來(lái)更加復雜的Web開(kāi)發(fā)提供了良好的基礎。
(一)事件處理程序的作用域和事件的傳播
  在正式討論DOM高級事件處理之前,我們有必要了解一下事件處理程序的作用域。事件處理程序的作用域要比普通的函數作用域復雜很多。普通的函數作用域鏈比較容易,例如在一個(gè)普通函數中查找一個(gè)變量a,那么JavaScript解釋器會(huì )先在該函數的調用對象中查找是否有a這個(gè)變量,如果沒(méi)有,將會(huì )在作用域鏈的下一個(gè)對象,一般是全局對象中查找。但是事件處理程序沒(méi)這么簡(jiǎn)單,特別是用HTML的屬性定義的,它們的作用域鏈的頭部是調用它們的對象,而下一個(gè)對象并不是全局對象,而是觸發(fā)事件處理程序的對象。這樣就會(huì )出現一個(gè)問(wèn)題,window和document都有一個(gè)方法open(),如果open()前面不加修飾,那么在事件處理的函數中將會(huì )調用document.open()方法,而不是常用的window.open()方法,所以使用的時(shí)候應該明確指明是window.open()。
(二)事件傳播和注冊事件處理程序
1.事件傳播
  在二級DOM標準中,事件處理程序比較復雜,當事件發(fā)生的時(shí)候,目標節點(diǎn)的事件處理程序就會(huì )被觸發(fā)執行,但是目標節點(diǎn)的父節點(diǎn)也有機會(huì )來(lái)處理這個(gè)事件。事件的傳播分為三個(gè)階段,首先是捕捉階段,事件從Document對象沿著(zhù)DOM樹(shù)向下傳播到目標節點(diǎn),如果目標的任何一個(gè)父節點(diǎn)注冊了捕捉事件的處理程序,那么事件在傳播的過(guò)程中就會(huì )首先運行這個(gè)程序。下一個(gè)階段就是發(fā)生在目標節點(diǎn)自身了,注冊在目標節點(diǎn)上的相應的事件處理程序就會(huì )執行;最后是起泡階段,事件將從目標節點(diǎn)向上傳回給父節點(diǎn),同樣,如果父節點(diǎn)有相應的事件處理程序也會(huì )處理。在IE中,沒(méi)有捕捉的階段,但是有起泡的階段??梢杂胹topPropagation()方法來(lái)停止事件傳播,也就是讓其他元素對這個(gè)事件不可見(jiàn),在IE 6中,就是把cancelBubble設置為true。
2.注冊事件處理程序
  和IE一樣,DOM標準也有自己的事件處理程序,不過(guò)DOM二級標準的事件處理程序比IE的強大一些,事件處理程序的注冊用addEventListner方法,該方法有三個(gè)參數,第一個(gè)是事件類(lèi)型,第二個(gè)是處理的函數,第三個(gè)是一個(gè)布爾值,true表示制定的事件處理程序將在事件傳播的階段用于捕捉事件,否則就不捕捉,當事件發(fā)生在對象上才觸發(fā)執行這個(gè)事件處理的函數,或者發(fā)生在該對象的字節點(diǎn)上,并且向上起泡到這個(gè)對象上的時(shí)候,觸發(fā)執行這個(gè)事件處理的函數。例如:document.addEventListener("mousemove",moveHandler,true);就是在mousemove事件發(fā)生的時(shí)候,調用moveHandler函數,并且可以捕捉事件。
  可以用addEventListener為一個(gè)事件注冊多個(gè)事件處理的程序,但是這些函數的執行順序是不確定,并不像C#那樣按照注冊的順序執行。
在MozillaFirefox中用addEventListener注冊一個(gè)事件處理程序的時(shí)候,this關(guān)鍵字就表示調用事件處理程序的文檔元素,但是其他瀏覽器并不一定是這樣,因為這不是DOM標準,正確的做法是用currentTarget屬性來(lái)引用調用事件處理程序的文檔元素。
3.二級DOM標準中的Event
和IE不同的是,W3CDOM中的Event對象并不是window全局對象下面的屬性,換句話(huà)說(shuō),event不是全局變量。通常在DOM二級標準中,event作為發(fā)生事件的文檔對象的屬性。Event含有兩個(gè)子接口,分別是UIEvent和MutationEvent,這兩個(gè)子接口實(shí)現了Event的所有方法和屬性,而MouseEvent接口又是UIEvent的子接口,所以實(shí)現了UIEvent和Event的所有方法和屬性。下面,我們就看看Event、UIEvent和MouseEvent的主要屬性和方法。
  1.Event
    type:事件類(lèi)型,和IE類(lèi)似,但是沒(méi)有“on”前綴,例如單擊事件只是“click”。
    target:發(fā)生事件的節點(diǎn)。
    currentTarget:發(fā)生當前正在處理的事件的節點(diǎn),可能是Target屬性所指向的節點(diǎn),也可能由于捕捉或者起泡,指向Target所指節點(diǎn)的父節點(diǎn)。
    eventPhase:指定了事件傳播的階段。是一個(gè)數字。
    timeStamp:事件發(fā)生的時(shí)間。
    bubbles:指明該事件是否起泡。
    cancelable:指明該事件是否可以用preventDefault()方法來(lái)取消默認的動(dòng)作。
    preventDefault()方法:取消事件的默認動(dòng)作;
    stopPropagation()方法:停止事件傳播。
  2.UIEvent
    view:發(fā)生事件的window對象。
    detail:提供事件的額外信息,對于單擊事件、mousedown和mouseup事件都代表的是點(diǎn)擊次數。
  3.MouseEvent
   button:一個(gè)數字,指明在mousedown、mouseup和單擊事件中,鼠標鍵的狀態(tài),和IE中的button屬性類(lèi)似,但是數字代表的意義不一樣,0代表左鍵,1代表中間鍵,2代表右鍵。
   altKey、ctrlKey、shiftKey、metaKey:和IE相同,但是IE沒(méi)有最后一個(gè)。
clientX、clientY:和IE的含義相同,但是在DOM標準中,這兩個(gè)屬性值都不考慮文檔的滾動(dòng)情況,也就是說(shuō),無(wú)論文檔滾動(dòng)到哪里,只要事件發(fā)生在窗口左上角,clientX和clientY都是0,所以在IE中,要想得到事件發(fā)生的坐標相對于文檔開(kāi)頭的位置,要加上document.body.scrollLeft和document.body.scrollTop。
   screenX、screenY:鼠標指針相對于顯示器左上角的位置,如果你想打開(kāi)新的窗口,這兩個(gè)屬性很重要。
   relatedTarget:和IE中的fromElement、toElement類(lèi)似,除了對于mouseover和mouseout有意義外,其他的事件沒(méi)什么意義。
(三)兼容于兩種主流瀏覽器的拖動(dòng)DOM元素的例子
  好了,剛才講了這么多DOM編程和IE中的事件,那么如何編寫(xiě)兼容IE和Mozilla Firefox兩種主流瀏覽器的拖拽程序呢?代碼如下:
function beginDrag(elementToDrag,event)
{
  var deltaX=event.clientX-parseInt(elementToDrag.style.left);
  var deltaY=event.clientY-parseInt(elementToDrag.style.top);
  //HGX注:個(gè)人覺(jué)得使用通過(guò)CSS的left/top屬性來(lái)計算不是一個(gè)好方法,可以通過(guò)offserLeft和offserTop得到。
if(document.addEventListener)
{
  document.addEventListener("mousemove",moveHandler,true);
  document.addEventListener("mouseup",upHandler,true);
}
else if(document.attachEvent)
{
  document.attachEvent("onmousemove",moveHandler);
  document.attachEvent("onmouseup",upHandler);
  
}
  
  if(event.stopPropagation)   event.stopPropagation();
  else event.cancelBubble=true;
  if(event.preventDefault)  event.preventDefault();
  else event.returnValue=false;
  
  function moveHandler(e)  
  {
  if (!e) e=window.event; //如果是IE的事件對象,那么就用window.event
  //全局屬性,否則就用DOM二級標準的Event對象。

//HGX注:也可以這樣:e = e || window.event;
    elementToDrag.style.left=(event.clientX-deltaX)+"px";
    elementToDrag.style.top=(event.clientY-deltaY)+"px";
   
     if(event.stopPropagation)   event.stopPropagation();
    else event.cancelBubble=true;
   
  }
  
  function upHandler(
e)
  {
       if(document.removeEventListener)
    {
      document.removeEventListener("mouseup",upHandler,true);
      document.removeEventListener("mousemove",moveHandler,true);}
      else
    {
      document.detachEvent("onmouseup",upHandler);
      document.detachEvent("onmousemove",moveHandler);}
    }
      if(event.stopPropagation)   event.stopPropagation();
    else event.cancelBubble=true;
   
  }

HGX評:

看過(guò)許多關(guān)于事件機制的文章,這篇是寫(xiě)得非常好的,因此轉載到我的博客中來(lái)。

其實(shí) DOM LEVEL2的事件機制在Flash AS3中有非常詳細的介紹:捕獲階段—目標階段-冒泡階段,推薦大家去閱讀一下,相信會(huì )有更深的理解。

本質(zhì)上AS3與Javascript是同宗同源的,許多東西都可以從互相借鑒中學(xué)習。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
js 的event對象
js修改onclick動(dòng)作的四種方式
理解JavaScript中的事件處理
Dom事件介紹
最詳細的JavaScript和事件解讀 – 碼農網(wǎng)
JS中DOM重點(diǎn)基礎知識實(shí)驗(全)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久