<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-7  評(píng)論-24  文章-102  trackbacks-0

    1、排錯(cuò)、調(diào)試
    2、事件
    3、Event對(duì)象
    4、事件冒泡
    5、事件句柄和 this
    6、DOM Level 2事件模型
    7、測(cè)驗(yàn)





    1、排錯(cuò)、調(diào)試


         Firebug是最常用的 Firefox開(kāi)發(fā)工具,同時(shí)常用的 Web工具還有 Web Developer toolkit,該工具功能包括頁(yè)面 HTML和 CSS代碼的校驗(yàn)、可訪問(wèn)性檢查、查看 CSS和 cookies、檢查圖像、查看 JavaScript修改后的頁(yè)面源代碼(包括動(dòng)態(tài)源代碼)。


    2、事件

         事件包括:用戶(hù)界面事件(鼠標(biāo)、鍵盤(pán)觸發(fā)的)、邏輯事件(一個(gè)處理的結(jié)果)、和變化事件(修改文檔的操作)。

    事件句柄 (Event Handlers)

    HTML 4.0 的新特性之一是能夠使 HTML 事件觸發(fā)瀏覽器中的行為,比如當(dāng)用戶(hù)點(diǎn)擊某個(gè) HTML 元素時(shí)啟動(dòng)一段 JavaScript。下面是一個(gè)屬性列表,可將之插入 HTML 標(biāo)簽以定義事件的行為。

    屬性 此事件發(fā)生在何時(shí)... IE F O W3C
    onabort 圖像的加載被中斷。 4 1 9 Yes
    onblur 元素失去焦點(diǎn)。 3 1 9 Yes
    onchange 域的內(nèi)容被改變。 3 1 9 Yes
    onclick 當(dāng)用戶(hù)點(diǎn)擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄。 3 1 9 Yes
    ondblclick 當(dāng)用戶(hù)雙擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄。 4 1 9 Yes
    onerror 在加載文檔或圖像時(shí)發(fā)生錯(cuò)誤。 4 1 9 Yes
    onfocus 元素獲得焦點(diǎn)。 3 1 9 Yes
    onkeydown 某個(gè)鍵盤(pán)按鍵被按下。 3 1 No Yes
    onkeypress 某個(gè)鍵盤(pán)按鍵被按下并松開(kāi)。 3 1 9 Yes
    onkeyup 某個(gè)鍵盤(pán)按鍵被松開(kāi)。 3 1 9 Yes
    onload 一張頁(yè)面或一幅圖像完成加載。 3 1 9 Yes
    onmousedown 鼠標(biāo)按鈕被按下。 4 1 9 Yes
    onmousemove 鼠標(biāo)被移動(dòng)。 3 1 9 Yes
    onmouseout 鼠標(biāo)從某元素移開(kāi)。 4 1 9 Yes
    onmouseover 鼠標(biāo)移到某元素之上。 3 1 9 Yes
    onmouseup 鼠標(biāo)按鍵被松開(kāi)。 4 1 9 Yes
    onreset 重置按鈕被點(diǎn)擊。 4 1 9 Yes
    onresize 窗口或框架被重新調(diào)整大小。 4 1 9 Yes
    onselect 文本被選中。 3 1 9 Yes
    onsubmit 確認(rèn)按鈕被點(diǎn)擊。 3 1 9 Yes
    onunload 用戶(hù)退出頁(yè)面。 3 1 9 Yes
    注:HTML DOM Event 對(duì)象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp


    內(nèi)聯(lián)模式/內(nèi)聯(lián)注冊(cè)模式
    以屬性的形式為 HTML元素添加屬性的方法。
    <body onload="var 1=23; i*=3; alert(i);">
    <body onload="calcNumber();">

    傳統(tǒng)模式/傳統(tǒng)注冊(cè)模式
    通過(guò)對(duì)象屬性將一個(gè)函數(shù)指派為事件句柄。如果想禁用事件處理,那么可以將事件句柄的值賦為 null。
    window.onload = calcNumber;


    注:
         在 DOM Level 0事件模型中,任何對(duì)象只允許指定一個(gè)事件句柄。如果你想針對(duì)某一特定對(duì)象的某個(gè)事件指定多個(gè)函數(shù),則需要在事件句柄代碼中列出他們:

    內(nèi)嵌模式:
    <body onload="helloMsg(); helloTwice();">

    傳統(tǒng)模式:
    function helloMsg() {
        var helloString = "hello there";
        alert(helloString);
        helloTwice();
    }

    當(dāng)要求瀏覽器停止執(zhí)行事件行為,可以從事件句柄函數(shù)中返回 false值。


    3、Event對(duì)象

         Event對(duì)象是和所有事件相關(guān)的。它有一些用來(lái)提供事件相關(guān)信息的屬性,如 Web頁(yè)面中鼠標(biāo)點(diǎn)擊的位置。

         IE將 Event視為 window對(duì)象的屬性。當(dāng)處理事件時(shí),將通過(guò)程序訪問(wèn) window對(duì)象,其所包含的數(shù)據(jù)也會(huì)相應(yīng)的進(jìn)行填充。
    function mouseDown() {
        
    var locString = "X = " + window.event.screenX + " Y = " + window.event.screenY;
        alert(locString);
    }

    document.onmousedown = mouseDown;

         在基于 Netscape的瀏覽器(如 Firefox、Mozilla、Opera和 Safari)中,獲取 Event對(duì)象的方法是不同的:他將作為函數(shù)的一部分傳入。
    function mouseDown(theEvent) {
        
    var locString = "X = " + theEvent.screenX + " Y = " + theEvent.screenY;
        alert(locString);
    }

    document.onmousedown 
    = mouseDown;

         處理這些瀏覽器差異的方法之一是檢查傳入函數(shù)的 Event對(duì)象是否已經(jīng)實(shí)例化。如果是,那么將這個(gè) Event對(duì)象賦給一個(gè)局部變量;否則,將假定 window.event為該事件,并將其賦給這個(gè)局部變量。
    function mouseDown(nsEvent) {
        
    var theEvent = nsEvent ? nsEvent : window.event;    //判斷 nsEvent對(duì)象是否已定義。定義則賦值,否則選擇 window.event屬性
        var locString = "X = " + theEvent.screenX + " Y = " + theEvent.screenY;
        alert(locString);
    }

    document.onmousedown 
    = mouseDown;


    鼠標(biāo) / 鍵盤(pán)屬性

    屬性 描述 IE F O W3C
    altKey 返回當(dāng)事件被觸發(fā)時(shí),"ALT" 是否被按下。 6 1 9 Yes
    button 返回當(dāng)事件被觸發(fā)時(shí),哪個(gè)鼠標(biāo)按鈕被點(diǎn)擊。 6 1 9 Yes
    clientX 返回當(dāng)事件被觸發(fā)時(shí),鼠標(biāo)指針的水平坐標(biāo)。 6 1 9 Yes
    clientY 返回當(dāng)事件被觸發(fā)時(shí),鼠標(biāo)指針的垂直坐標(biāo)。 6 1 9 Yes
    ctrlKey 返回當(dāng)事件被觸發(fā)時(shí),"CTRL" 鍵是否被按下。 6 1 9 Yes
    metaKey 返回當(dāng)事件被觸發(fā)時(shí),"meta" 鍵是否被按下。 No 1 9 Yes
    relatedTarget 返回與事件的目標(biāo)節(jié)點(diǎn)相關(guān)的節(jié)點(diǎn)。 No 1 9 Yes
    screenX 返回當(dāng)某個(gè)事件被觸發(fā)時(shí),鼠標(biāo)指針的水平坐標(biāo)。 6 1 9 Yes
    screenY 返回當(dāng)某個(gè)事件被觸發(fā)時(shí),鼠標(biāo)指針的垂直坐標(biāo)。 6 1 9 Yes
    shiftKey 返回當(dāng)事件被觸發(fā)時(shí),"SHIFT" 鍵是否被按下。 6 1 9 Yes
    注:HTML DOM Event 對(duì)象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp

    注:
         在 IE中,fromElement 對(duì)于 mouseover 和 mouseout 事件,fromElement 引用移出鼠標(biāo)的元素。 
         而在 Mozilla/Firefox中,relatedTarget 返回與事件的目標(biāo)節(jié)點(diǎn)相關(guān)的節(jié)點(diǎn)。
    要解決瀏覽器差異,可以使用:
    var oldElement = theEvent.fromElement ? theEvent.fromElement : theEvent.relatedTarget;


    4、事件冒泡

         如果你為多個(gè)嵌套的元素設(shè)置相同的事件句柄,會(huì)發(fā)生什么呢?他們將以什么樣的順序觸發(fā)?如果你想使得一次只影響一個(gè)元素,那么如何保存觸發(fā)事件句柄的事件呢?

         要管理元素堆棧中的事件,其中一個(gè)方法就是眾所周知的事件冒泡。在事件冒泡中,最內(nèi)部的元素將首先觸發(fā)該事件,然后堆棧內(nèi)的下一個(gè)元素觸發(fā)該事件,以此類(lèi)推,直到最外面的元素。如果事件句柄被指定給所有元素,那么這些事件將依次被觸發(fā)。

         如果 div2在 div1內(nèi)部,而 div1又在 document內(nèi)部,三者都做了事件處理。當(dāng)事件觸發(fā)的時(shí)候,優(yōu)先最里面的 div2元素,然后是 div1元素,最后是 document元素。

         如果你有一個(gè)元素堆棧,并且只希望一個(gè)元素觸發(fā)該事件句柄,那么你可以取消事件冒泡機(jī)制。如果在 IE中要取消一個(gè)事件冒泡,可以使用 IE中事件的 cancelBubble屬性;對(duì)于 Mozilla而言,則應(yīng)該使用事件的 stopPropagation方法。你可以先檢查 stopPropagation方法是否存在,然后根據(jù)其結(jié)果確定使用哪種方法:
    function stopEvent(evnt) {
        
    if (evnt.stopPropagation) evnt.stopPropagation;
        
    else evnt.cancelBubble = true;
    }
    //注:IE 7中調(diào)試出錯(cuò),提示信息 "stopPropagation為空或不是對(duì)象"。



    5、事件句柄和 this

         this關(guān)鍵字表示的是當(dāng)前調(diào)用的函數(shù)或者方法的所有者。對(duì)于一個(gè)全局變量而言,它表示的就是 window對(duì)象。對(duì)于一個(gè)對(duì)象的方法而言,它表示的就是該對(duì)象實(shí)例。而在一個(gè)事件句柄中,它表示的就是接收到該事件的元素。
    document.getElementById("first").onmousedown = function() {
        alert(
    this);    //在 Firefox中將輸出 "[object HTMLDivElement]"
        alert("first element event");
    }



    6、DOM Level 2事件模型


         對(duì)于堆棧內(nèi)元素的事件處理,還有一種被稱(chēng)為事件捕捉(event capturing)或 cascade-down的事件處理機(jī)制。對(duì)于前面這個(gè)包含3個(gè)元素的示例而言,事件將從最外面的元素開(kāi)始觸發(fā):window -> div1 -> div2。

         老事件模型和新的 DOM Level 2事件模型之間,主要區(qū)別:
    a.新事件模型并不依賴(lài)于特定的事件來(lái)處理屬性;
    b.你可以對(duì)任何一個(gè)對(duì)象的任何一種事件注冊(cè)多個(gè)事件句柄函數(shù)。

         新的事件句柄提供的3個(gè)方法:
    addEventListener,添加一個(gè)事件監(jiān)聽(tīng)器;
    removeEventListener,刪除一個(gè)事件監(jiān)聽(tīng)器;
    dispatchEvent,分發(fā)一個(gè)新的事件。

    示例:
    object.addEventListener('event', eventFunction, boolean);

         如 click或 load之類(lèi)的事件是其第一參數(shù);第二個(gè)參數(shù)是指定的事件句柄函數(shù);第三個(gè)參數(shù)用來(lái)指定事件是以 cascade-down或者冒泡模式處理的。當(dāng)?shù)谌齻€(gè)參數(shù)為 false時(shí)這個(gè)事件監(jiān)聽(tīng)器將以冒泡模式處理,否則將把這個(gè)事件監(jiān)聽(tīng)器改成事件捕捉模型。
    function cascadeDown(evnt) {
        alert(
    "Capturing: " + this);
    }

    function bubbleUp(evnt) {
        alert(
    "Bubbling: " + this);
    }

    window.onload 
    = setup;

    function setup(evnt) {
        
    //事件捕捉
        document.addEventListener("click", cascadeDown, true);
        document.forms[
    0].addEventListener("click", cascadeDown, true);
        document.forms[
    0].elements[0].addEventListener("click", cascadeDown, true);
        
        
    //事件冒泡
        document.addEventListener("click", bubbleUp, false);
        document.forms[
    0].addEventListener("click", bubbleUp, false);
        document.forms[
    0].elements[0].addEventListener("click", bubbleUp, false);
    }

    /*
    在 Firefox中,單擊按鈕將順序生成6個(gè)對(duì)話(huà)框

    Capturing: [object HTMLDocument]
    Capturing: [object HTMLFormElement]
    Capturing: [object HTMLInputElement]
    Bubbling: [object HTMLInputElement]
    Bubbling: [object HTMLFormElement]
    Bubbling: [object HTMLDocument]

    */


         如果你想停止事件執(zhí)行時(shí),可以在函數(shù)中調(diào)用 stopPropagation方法:
    function cascadeDown(evnt) {
        ...
        evnt.stopPropagation();
    }


         如果要徹底刪除一個(gè)事件監(jiān)聽(tīng)器,可以使用 removeEventListener方法:
    document.removeEventListener("click", cascadeDown, true);


         在 IE中,與 addEventListener和 removeEventListener方法相似的是 attachEvent和 detachEvent,對(duì)應(yīng)語(yǔ)法是:
    object.attachEvent("eventhandler", function);
    第一個(gè)參數(shù)是事件句柄,第二個(gè)是其函數(shù)。detachEvent語(yǔ)法類(lèi)似。


    跨瀏覽器解決方案:
    window.onload = setup;
    window.onunload 
    = cleanup;

    function setup(evnt) {
        
    var evtObject = document.getElementById("clickme");
        
        
    //檢查對(duì)象模型
        if (evtObject.addEventListener) evtObject.addEventListener("click", clickMe, false);
        
    else if (evtObject.attachEvent) evtObject.attachEvent("onclick", clickMe);
        
    else if (evtObject.onclick) evtObject.onclick=clickMe;    
    }

    /*清理
    在 IE中,需要跟蹤 window的 unload事件,然后調(diào)用 detachEvent方法清理,釋放相應(yīng)的內(nèi)存
    而 addEventListener方法使用的內(nèi)存是無(wú)需清理的。
    */
    function cleanup() {
        
    var evtObject = document.getElementById("clickme");
        
    if (evtObject.detachEvent) evtObject.detachEvent("onclick", clickMe);
    }

    function clickMe() {
        alert(
    "clickMe");
    }


    IE 屬性

    除了上面的鼠標(biāo)/事件屬性,IE 瀏覽器還支持下面的屬性:

    屬性 描述
    cancelBubble 如果事件句柄想阻止事件傳播到包容對(duì)象,必須把該屬性設(shè)為 true。
    fromElement 對(duì)于 mouseover 和 mouseout 事件,fromElement 引用移出鼠標(biāo)的元素。
    keyCode 對(duì)于 keypress 事件,該屬性聲明了被敲擊的鍵生成的 Unicode 字符碼。對(duì)于 keydown 和 keyup 事件,它指定了被敲擊的鍵的虛擬鍵盤(pán)碼。虛擬鍵盤(pán)碼可能和使用的鍵盤(pán)的布局相關(guān)。
    offsetX,offsetY 發(fā)生事件的地點(diǎn)在事件源元素的坐標(biāo)系統(tǒng)中的 x 坐標(biāo)和 y 坐標(biāo)。
    returnValue 如果設(shè)置了該屬性,它的值比事件句柄的返回值優(yōu)先級(jí)高。把這個(gè)屬性設(shè)置為 fasle,可以取消發(fā)生事件的源元素的默認(rèn)動(dòng)作。
    srcElement 對(duì)于生成事件的 Window 對(duì)象、Document 對(duì)象或 Element 對(duì)象的引用。
    toElement 對(duì)于 mouseover 和 mouseout 事件,該屬性引用移入鼠標(biāo)的元素。
    x,y 事件發(fā)生的位置的 x 坐標(biāo)和 y 坐標(biāo),它們相對(duì)于用CSS動(dòng)態(tài)定位的最內(nèi)層包容元素。
    注:HTML DOM Event 對(duì)象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp


    標(biāo)準(zhǔn) Event 屬性

    下面列出了 2 級(jí) DOM 事件標(biāo)準(zhǔn)定義的屬性。

    屬性 描述 IE F O W3C
    bubbles 返回布爾值,指示事件是否是起泡事件類(lèi)型。 No 1 9 Yes
    cancelable 返回布爾值,指示事件是否可擁可取消的默認(rèn)動(dòng)作。 No 1 9 Yes
    currentTarget 返回其事件監(jiān)聽(tīng)器觸發(fā)該事件的元素。 No 1 9 Yes
    eventPhase 返回事件傳播的當(dāng)前階段。       Yes
    target 返回觸發(fā)此事件的元素(事件的目標(biāo)節(jié)點(diǎn))。 No 1 9 Yes
    timeStamp 返回事件生成的日期和時(shí)間。 No 1 9 Yes
    type 返回當(dāng)前 Event 對(duì)象表示的事件的名稱(chēng)。 6 1 9 Yes
    注:HTML DOM Event 對(duì)象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp


    7、測(cè)驗(yàn)

    Q1:使用 DOM Level 0方法為 document的 click事件指定一個(gè)事件句柄函數(shù)。
    A1:document.onclick = clickMe;


    Q2:使用 DOM Level 2事件處理機(jī)制為 document添加 click事件句柄。
    A2:document.addEventListener("click", clickMe, false);


    Q3:如果使事件處理機(jī)制能安全運(yùn)行所有瀏覽器?
    A3:
        if (evtObject.addEventListener) evtObject.addEventListener("click", clickMe, false);
        else if (evtObject.attachEvent) evtObject.attachEvent("onclick", clickMe);
        else if (evtObject.onclick) evtObject.onclick=clickMe;   


    Q4:對(duì)于為 document對(duì)象指定的 onclick事件句柄,如何知道是在屏幕的什么位置執(zhí)行了單擊操作?
    A4:
         如果使用 DOM Level 0事件處理系統(tǒng),那么將無(wú)法使用 window對(duì)象的 event對(duì)象,也不能將其作為參數(shù)傳給函數(shù)。
         對(duì)于 DOM Level 2事件處理模型而言,event對(duì)象將會(huì)傳給事件句柄函數(shù),你可以通過(guò) event對(duì)象訪問(wèn)其 screenX和 screenY屬性。


    Q5:使用 DOM Level 2事件系統(tǒng),如何阻止從其他元素中冒泡上來(lái)的事件。
    A5:
         IE所支持的方法和絕大多數(shù)瀏覽器所支持的方法有所不同,因此你需要分別支持 IE和其他瀏覽器。你可以檢查 event對(duì)象是否支持 stopPropagation方法。如果支持,則調(diào)用它;否則就將 cancelBubble屬性的值設(shè)置為 true。


    Q7:捕獲 document對(duì)象的 keydown事件
    A7:
    window.onload = function() {    
        
    if (document.addEventListener) document.addEventListener("keydown", getKey, false);
        
    else if (document.attachEvent) document.attachEvent("onkeydown", getKey);
        
    else if (document.onkeydown) document.onkeydown=getKey;    
    }

    function getKey(evnt) {
        
    var theEvent = evnt ? evnt : window.event;
        alert(theEvent.which);  
    //Firefox 返回值,IE 7提示 undefined
    }
    posted on 2010-05-29 09:25 黃小二 閱讀(860) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Ajax

    評(píng)論:
    # re: Javascript學(xué)習(xí)指南(第2版)筆記(三) 排錯(cuò)、調(diào)試、事件捕獲 2011-06-17 13:55 | zechau
    主站蜘蛛池模板: 国产yw855.c免费视频| 日本在线免费观看| 色吊丝最新永久免费观看网站 | 成人自慰女黄网站免费大全 | 久久免费福利视频| 亚洲成a人片在线观看中文动漫| 中文字幕乱码免费看电影| 亚洲天堂在线视频| 99免费精品视频| 亚洲高清在线视频| 99久久免费看国产精品| 亚洲最大中文字幕| 操美女视频免费网站| 在线观看亚洲精品专区| 国产免费观看黄AV片| 久久WWW免费人成—看片| 亚洲国产精品成人久久| 一级毛片**不卡免费播| 久久亚洲精品专区蓝色区| 在线观着免费观看国产黄| 一区二区三区免费视频观看| 巨波霸乳在线永久免费视频| 亚洲成a人片在线观看无码| eeuss草民免费| 亚洲av中文无码乱人伦在线播放| 免费无码VA一区二区三区| 激情内射亚洲一区二区三区爱妻 | 在线电影你懂的亚洲| 无码人妻精品一二三区免费| 国产精品亚洲一区二区三区久久 | 亚洲偷自精品三十六区| 国产伦一区二区三区免费 | 亚洲a在线视频视频| 4hu四虎最新免费地址| 精品国产亚洲AV麻豆| 国产精品亚洲成在人线| 在线观看H网址免费入口| 黄色三级三级免费看| 亚洲精品线在线观看| 国产美女精品视频免费观看| 久久国产精品免费专区|