【javascript】事件類型

事件類型

  • Web 瀏覽器中可能發(fā)生的事件有很多類型

    • UI事件:當(dāng)用戶與界面上的元素交互時觸發(fā)。
    • 焦點事件:當(dāng)元素獲得或失去焦點時觸發(fā)。
    • 滾輪事件:當(dāng)使用鼠標(biāo)滾輪時觸發(fā)茎杂。
    • 文本事件:當(dāng)在文檔中輸入文本時觸發(fā)起便。
    • 鍵盤事件:但用戶通過鍵盤在頁面上執(zhí)行操作時觸發(fā)。
    • 合成事件:當(dāng)為輸入法編輯器輸入字符時觸發(fā)酥宴。
    • 變動事件:當(dāng)?shù)讓覦OM結(jié)構(gòu)發(fā)生變化時觸發(fā)。
//事件處理程序
var EventUtil = {
    addHandler: function(element, type, handler){
        if (element.addEventListener){
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent){
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },
    getEvent: function(event){
        return event ? event : window.event;
    },
    removeHandler: function(element, type, handler){
        if (element.removeEventListener){
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent){
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;
        }
    }
};

1您觉、UI事件

  • UI 事件指的是那些不一定與用戶操作有關(guān)的事件拙寡。

(1)load事件

  • load在當(dāng)頁面完全加載后在window上面觸發(fā),當(dāng)所有框架都加載完畢時在框架集上面觸發(fā)琳水,當(dāng)圖像加載完畢時在<img>元素上面觸發(fā)肆糕,或者當(dāng)嵌入的內(nèi)容加載完畢時在<object>元素上面觸發(fā)。
//第一種定義onload 事件處理程序的方式
EventUtil.addHandler(window, "load", function(event){
    alert("Loaded!");
});
<!--第二種指定onload 事件處理程序的方式-->
<!DOCTYPE html>
<html>
    <head>
        <title>Load Event Example</title>
    </head>
    <body onload="alert('Loaded!')">
    </body>
</html>

(2)unload事件

  • unload在孝,當(dāng)頁面完全卸載后在window上面觸發(fā)诚啃,當(dāng)所有框架都卸載后在框架集上面觸發(fā),或者當(dāng)嵌入的內(nèi)容卸載完畢后在<object>元素上面觸發(fā)私沮。
  • 只要用戶從一個頁面切換到另一個頁面绍申,就會發(fā)生unload事件。而利用這個事件最多的情況是清除引用顾彰,以避免內(nèi)存泄漏极阅。
EventUtil.addHandler(window, "unload", function(event){
    alert("Unloaded");
});
<!DOCTYPE html>
<html>
    <head>
        <title>Unload Event Example</title>
    </head>
    <body onunload="alert('Unloaded!')">
    </body>
</html>

(3)resize事件

  • resize|當(dāng)窗口或框架的大小變化時在window 或框架上面觸發(fā)。
  • 瀏覽器窗口最小化或最大化時也會觸發(fā)resize 事件涨享。
EventUtil.addHandler(window, "resize", function(event){
    alert("Resized");
});

(4)scroll事件

  • scroll筋搏,當(dāng)用戶滾動帶滾動條的元素中的內(nèi)容時,在該元素上面觸發(fā)厕隧。<body>元素中包含所加載頁面的滾動條奔脐。
EventUtil.addHandler(window, "scroll", function(event){
    if (document.compatMode == "CSS1Compat"){
        alert(document.documentElement.scrollTop);
    } else {
        alert(document.body.scrollTop);
    }
});

(5)abort

  • abort俄周,在用戶停止下載過程時,如果嵌入的內(nèi)容沒有加載完髓迎,則在<object>元素上面觸發(fā)峦朗。

(6)error

  • error,當(dāng)發(fā)生JavaScript錯誤時在window上面觸發(fā)排龄,當(dāng)無法加載圖像時在<img>元素上面觸發(fā)波势,當(dāng)無法加載嵌入內(nèi)容時在<object>元素上面觸發(fā),或者當(dāng)有一或多個框架無法加載時在框架集上面觸發(fā)

(7)select

  • select橄维,當(dāng)用戶選擇文本框(<input>或<texterea>)中的一或多個字符時觸發(fā)尺铣。

2、焦點事件

  • 焦點事件會在頁面元素獲得或失去焦點時觸發(fā)争舞,有以下6 個焦點事件凛忿。

    • blur:在元素失去焦點時觸發(fā)。這個事件不會冒泡竞川;所有瀏覽器都支持它店溢。
    • focus:在元素獲得焦點時觸發(fā)。這個事件不會冒泡委乌;所有瀏覽器都支持它逞怨。
    • focusin:在元素獲得焦點時觸發(fā)。這個事件與HTML 事件focus 等價福澡,但它冒泡。
    • focusout:在元素失去焦點時觸發(fā)驹马。這個事件是HTML 事件blur 的通用版本革砸。

  • 當(dāng)焦點從頁面中的一個元素移動到另一個元素,會依次觸發(fā)下列事件:
    (1) focusout 在失去焦點的元素上觸發(fā)糯累;
    (2) focusin 在獲得焦點的元素上觸發(fā)算利;
    (3) blur 在失去焦點的元素上觸發(fā);
    (4) DOMFocusOut 在失去焦點的元素上觸發(fā)泳姐;
    (5) focus 在獲得焦點的元素上觸發(fā)效拭;
    (6) DOMFocusIn 在獲得焦點的元素上觸發(fā)。
    其中胖秒,blur缎患、DOMFocusOut和focusout的事件目標(biāo)是失去焦點的元素;而focus阎肝、DOMFocusIn和focusin 的事件目標(biāo)是獲得焦點的元素挤渔。

  • 要確定瀏覽器是否支持這些事件,可以使用如下代碼:

var isSupported = document.implementation.hasFeature("FocusEvent", "3.0");

3风题、鼠標(biāo)與滾輪事件

  • click:在用戶單擊主鼠標(biāo)按鈕(一般是左邊的按鈕)或者按下回車鍵時觸發(fā)判导。
  • dblclick:在用戶雙擊主鼠標(biāo)按鈕(一般是左邊的按鈕)時觸發(fā)嫉父。
  • mousedown:在用戶按下了任意鼠標(biāo)按鈕時觸發(fā)。不能通過鍵盤觸發(fā)這個事件眼刃。
  • mouseenter:在鼠標(biāo)光標(biāo)從元素外部首次移動到元素范圍之內(nèi)時觸發(fā)绕辖。這個事件不冒泡,而且在光標(biāo)移動到后代元素上不會觸發(fā)擂红。
  • mouseleave:在位于元素上方的鼠標(biāo)光標(biāo)移動到元素范圍之外時觸發(fā)仪际。這個事件不冒泡,而且在光標(biāo)移動到后代元素上不會觸發(fā)篮条。
  • mousemove:當(dāng)鼠標(biāo)指針在元素內(nèi)部移動時重復(fù)地觸發(fā)弟头。不能通過鍵盤觸發(fā)這個事件。
  • mouseout:在鼠標(biāo)指針位于一個元素上方涉茧,然后用戶將其移入另一個元素時觸發(fā)赴恨。
  • mouseover:在鼠標(biāo)指針位于一個元素外部,然后用戶將其首次移入另一個元素邊界之內(nèi)時觸發(fā)伴栓。不能通過鍵盤觸發(fā)這個事件伦连。
  • mouseup:在用戶釋放鼠標(biāo)按鈕時觸發(fā)。不能通過鍵盤觸發(fā)這個事件钳垮。

  • 要檢測瀏覽器是否支持上面的所有事件惑淳,可以使用以下代碼:
var isSupported = document.implementation.hasFeature("MouseEvent", "3.0")
  • 鼠標(biāo)事件中還有一類滾輪事件。而說是一類事件饺窿,其實就是一個mousewheel 事件歧焦。這個事件跟蹤鼠標(biāo)滾輪。

(1)客戶區(qū)坐標(biāo)位置

var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "click", function(event){
    event = EventUtil.getEvent(event);
    alert("Client coordinates: " + event.clientX + "," + event.clientY);
});

(2)頁面坐標(biāo)位置

var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "click", function(event){
    event = EventUtil.getEvent(event);
    alert("Page coordinates: " + event.pageX + "," + event.pageY);
});
  • IE8 及更早版本不支持事件對象上的頁面坐標(biāo)肚医,不過使用客戶區(qū)坐標(biāo)和滾動信息可以計算出來绢馍。
var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "click", function(event){
    event = EventUtil.getEvent(event);
    var pageX = event.pageX,
    pageY = event.pageY;
    if (pageX === undefined){
        pageX = event.clientX + (document.body.scrollLeft ||
        document.documentElement.scrollLeft);
    }
    if (pageY === undefined){
        pageY = event.clientY + (document.body.scrollTop ||
        document.documentElement.scrollTop);
    }
    alert("Page coordinates: " + pageX + "," + pageY);
});

(3)屏幕坐標(biāo)位置

  • 通過screenX 和screenY屬性可以確定鼠標(biāo)事件發(fā)生時鼠標(biāo)指針相對于整個屏幕的坐標(biāo)信息。
var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "click", function(event){
    event = EventUtil.getEvent(event);
    alert("Screen coordinates: " + event.screenX + "," + event.screenY);
});

(4)修改鍵

  • 在按下鼠標(biāo)時鍵盤上的某些鍵的狀態(tài)也可以影響到所要采取的操作肠套。
var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "click", function(event){
    event = EventUtil.getEvent(event);
    var keys = new Array();
    if (event.shiftKey){
        keys.push("shift");
    }
    if (event.ctrlKey){
        keys.push("ctrl");
    }
    if (event.altKey){
        keys.push("alt");
    }
    if (event.metaKey){
        keys.push("meta");
    }
    alert("Keys: " + keys.join(","));
});

(5)相關(guān)元素

  • 在發(fā)生mouseover 和mouserout 事件時舰涌,還會涉及更多的元素。
  • 對mouseover 事件而言你稚,事件的主目標(biāo)是獲得光標(biāo)的元素瓷耙,而相關(guān)元素就是那個失去光標(biāo)的元素。
  • 對mouseout 事件而言刁赖,事件的主目標(biāo)是失去光標(biāo)的元素搁痛,而相關(guān)元素則是獲得光標(biāo)的元素。
  • DOM通過event 對象的relatedTarget 屬性提供了相關(guān)元素的信息宇弛。
  • IE8及之前版本不支持relatedTarget屬性落追,但提供了保存著同樣信息的不同屬性。在mouseover 事件觸發(fā)時涯肩,IE 的fromElement屬性中保存了相關(guān)元素轿钠;在mouseout事件觸發(fā)時巢钓,IE 的toElement 屬性中保存著相關(guān)元素。
<!DOCTYPE html>
<html>
    <head>
    <title>Related Elements Example</title>
    </head>
    <body>
        <div id="myDiv" style="background-color:red;">test</div>
    </body>
</html>
var EventUtil = {
//省略了其他代碼
    getRelatedTarget: function(event){
        if (event.relatedTarget){
            return event.relatedTarget;
        } else if (event.toElement){
            return event.toElement;
        } else if (event.fromElement){
            return event.fromElement;
        } else {
            return null;
        }
    },
//省略了其他代碼
};

var div = document.getElementById("myDiv");
EventUtil.addHandler(div, "mouseout", function(event){
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
    var relatedTarget = EventUtil.getRelatedTarget(event);
    alert("Moused out of " + target.tagName + " to " + relatedTarget.tagName);
});

(6)鼠標(biāo)按鈕

  • DOM的button 屬性可能有如下3 個值:
    • 0 表示主鼠標(biāo)按鈕疗垛。
    • 1 表示中間的鼠標(biāo)按鈕(鼠標(biāo)滾輪按鈕)症汹。
    • 2 表示次鼠標(biāo)按鈕。
    • 在常規(guī)的設(shè)置中贷腕,主鼠標(biāo)按鈕就是鼠標(biāo)左鍵背镇,而次鼠標(biāo)按鈕就是鼠標(biāo)右鍵。

  • IE8 及之前版本也提供了button 屬性泽裳,但這個屬性的值與DOM的button屬性有很大差異瞒斩。
    • 0:表示沒有按下按鈕。
    • 1:表示按下了主鼠標(biāo)按鈕涮总。
    • 2:表示按下了次鼠標(biāo)按鈕胸囱。
    • 3:表示同時按下了主、次鼠標(biāo)按鈕瀑梗。
    • 4:表示按下了中間的鼠標(biāo)按鈕烹笔。
    • 5:表示同時按下了主鼠標(biāo)按鈕和中間的鼠標(biāo)按鈕。
    • 6:表示同時按下了次鼠標(biāo)按鈕和中間的鼠標(biāo)按鈕抛丽。
    • 7:表示同時按下了三個鼠標(biāo)按鈕谤职。
var EventUtil = {
    //省略了其他代碼
    getButton: function(event){
        if (document.implementation.hasFeature("MouseEvents", "2.0")){
            return event.button;
        } else {
            switch(event.button){
            case 0:
            case 1:
            case 3:
            case 5:
            case 7:
                return 0;
            case 2:
            case 6:
                return 2;
            case 4:
                return 1;
            }
        }
    },
    //省略了其他代碼
};
var div = document.getElementById("myDiv");
    EventUtil.addHandler(div, "mousedown", function(event){
    event = EventUtil.getEvent(event);
    alert(EventUtil.getButton(event));
});

(7)鼠標(biāo)滾輪事件

  • 與mousewheel 事件對應(yīng)的event對象除包含鼠標(biāo)事件的所有標(biāo)準(zhǔn)信息外,還包含一個特殊的wheelDelta 屬性亿鲜。
  • 當(dāng)用戶向前滾動鼠標(biāo)滾輪時允蜈,wheelDelta是120的倍數(shù);當(dāng)用戶向后滾動鼠標(biāo)滾輪時蒿柳,wheelDelta 是-120 的倍數(shù)饶套。
EventUtil.addHandler(document, "mousewheel", function(event){
    event = EventUtil.getEvent(event);
    alert(event.wheelDelta);
});

(8)觸摸設(shè)備

  • 不支持dblclick事件,雙擊瀏覽器窗口放大畫面其馏。
  • 輕擊可單擊元素會觸發(fā)mousemove 事件。
  • mousemove 事件也會觸發(fā)mouseover 和mouseout 事件爆安。
  • 兩個手指放在屏幕上且頁面隨手指移動而滾動時會觸發(fā)mousewheel 和scroll 事件叛复。

4、鍵盤與文本事件

  • keydown: 當(dāng)用戶按下鍵盤上的任意鍵時觸發(fā)扔仓,若按住不放褐奥,會重復(fù)觸發(fā)。
  • keypress:當(dāng)用戶按下鍵盤上的字符鍵時觸發(fā)翘簇,若按住不放撬码,會重復(fù)觸發(fā)。按下ESC鍵也會觸發(fā)這個事件版保。
  • keyup:當(dāng)用戶釋放鍵盤上的鍵時觸發(fā)呜笑。

(1)鍵碼

var textbox = document.getElementById("myText");
EventUtil.addHandler(textbox, "keyup", function(event){
    event = EventUtil.getEvent(event);
    alert(event.keyCode);
});

(2)字符編碼

  • IE9夫否、Firefox、Chrome 和Safari 的event 對象都支持一個charCode 屬性叫胁,這個屬性只有在發(fā)生keypress事件時才包含值凰慈,而且這個值是按下的那個鍵所代表字符的ASCII 編碼。此時的keyCode通常等于0 或者也可能等于所按鍵的鍵碼驼鹅。
//跨瀏覽器取得字符編碼
var EventUtil = {
    //省略的代碼
    getCharCode: function(event){
        if (typeof event.charCode == "number"){
            return event.charCode;
        } else {
            return event.keyCode;
        }
    },
    //省略的代碼
};
var textbox = document.getElementById("myText");
EventUtil.addHandler(textbox, "keypress", function(event){
    event = EventUtil.getEvent(event);
    alert(EventUtil.getCharCode(event));
});

(3)DOM3級變化

  • DOM3級事件中的鍵盤事件微谓,不再包含charCode 屬性,而是包含兩個新屬性:key和char输钩。
  • 在按下某個字符鍵時豺型,key的值就是相應(yīng)的文本字符(如“k”或“M”);在按下非字符鍵時买乃, key 的值是相應(yīng)鍵的名(如“Shift”或“Down”)姻氨。
  • char 屬性在按下字符鍵時的行為與key 相同,但在按下非字符鍵時值為null为牍。
  • IE9 支持key 屬性哼绑,但不支持char 屬性。Safari 5 和Chrome 支持名為keyIdentifier 的屬性碉咆,在按下非字符鍵(例如Shift)的情況下與key的值相同抖韩。
  • 對于字符鍵,keyIdentifier 返回一個格式類似“U+0000”的字符串疫铜,表示Unicode 值茂浮。
var textbox = document.getElementById("myText");
EventUtil.addHandler(textbox, "keypress", function(event){
    event = EventUtil.getEvent(event);
    var identifier = event.key || event.keyIdentifier;
    if (identifier){
        alert(identifi er);
    }
});
  • 由于存在跨瀏覽器問題,因此不推薦使用key壳咕、keyIdentifier 或char席揽。

(4)textInput事件

  • 當(dāng)用戶在可編輯區(qū)域中輸入字符時,就會觸發(fā)textInput事件谓厘。
  • 這個用于替代keypress 的textInput 事件的行為稍有不同幌羞。
    • 任何可以獲得焦點的元素都可以觸發(fā)keypress事件,但只有可編輯區(qū)域才能觸發(fā)textInput事件竟稳。
    • textInput 事件只會在用戶按下能夠輸入實際字符的鍵時才會被觸發(fā)属桦,而keypress事件則在按下那些能夠影響文本顯示的鍵時也會觸發(fā)。
  • 由于textInput 事件主要考慮的是字符他爸,因此它的event對象中還包含一個data屬性聂宾,這個屬性的值就是用戶輸入的字符(而非字符編碼)。
var textbox = document.getElementById("myText");
EventUtil.addHandler(textbox, "textInput", function(event){
    event = EventUtil.getEvent(event);
    alert(event.data);
});

5诊笤、復(fù)合事件

  • 復(fù)合事件系谐,用于處理IME 的輸入序列。
  • IME(Input Method Editor讨跟,輸入法編輯器)可以讓用戶輸入在物理鍵盤上找不到的字符纪他。
  • 復(fù)合事件就是針對檢測和處理這種輸入而設(shè)計的鄙煤。有以下三種復(fù)合事件。
    • compositionstart:在IME 的文本復(fù)合系統(tǒng)打開時觸發(fā)止喷,表示要開始輸入了馆类。
    • compositionupdate:在向輸入字段中插入新字符時觸發(fā)。
    • compositionend:在IME 的文本復(fù)合系統(tǒng)關(guān)閉時觸發(fā)弹谁,表示返回正常鍵盤輸入狀態(tài)乾巧。
  • 在觸發(fā)復(fù)合事件時,目標(biāo)是接收文本的輸入字段预愤。但它比文本事件的事件對象多一個屬性data沟于,其中包含以下幾個值中的一個。
    • 如果在compositionstart事件發(fā)生時訪問植康,包含正在編輯的文本旷太;
    • 如果在compositionupdate 事件發(fā)生時訪問,包含正插入的新字符销睁;
    • 如果在compositionend 事件發(fā)生時訪問供璧,包含此次輸入會話中插入的所有字符。
var textbox = document.getElementById("myText");
EventUtil.addHandler(textbox, "compositionstart", function(event){
    event = EventUtil.getEvent(event);
    alert(event.data);
});
EventUtil.addHandler(textbox, "compositionupdate", function(event){
    event = EventUtil.getEvent(event);
    alert(event.data);
});
EventUtil.addHandler(textbox, "compositionend", function(event){
    event = EventUtil.getEvent(event);
    alert(event.data);
});
  • 要確定瀏覽器是否支持復(fù)合事件冻记,可以使用以下代碼
var isSupported = document.implementation.hasFeature("CompositionEvent", "3.0");

6睡毒、變動事件

  • DOMSubtreeModified:在DOM 結(jié)構(gòu)中發(fā)生任何變化時觸發(fā)。這個事件在其他任何事件觸發(fā)
    后都會觸發(fā)冗栗。
  • DOMNodeInserted:在一個節(jié)點作為子節(jié)點被插入到另一個節(jié)點中時觸發(fā)演顾。
  • DOMNodeRemoved:在節(jié)點從其父節(jié)點中被移除時觸發(fā)。
  • DOMNodeInsertedIntoDocument:在一個節(jié)點被直接插入文檔或通過子樹間接插入文檔之后觸發(fā)隅居。這個事件在DOMNodeInserted 之后觸發(fā)钠至。
  • DOMNodeRemovedFromDocument:在一個節(jié)點被直接從文檔中移除或通過子樹間接從文檔中移除之前觸發(fā)。這個事件在DOMNodeRemoved 之后觸發(fā)胎源。
  • DOMAttrModified:在特性被修改之后觸發(fā)棉钧。
  • DOMCharacterDataModified:在文本節(jié)點的值發(fā)生變化時觸發(fā)。
<! DOCTYPE html>
<html>
    <head>
        <title>Node Removal Events Example</title>
    </head>
    <body>
        <ul id="myList">
            <li>Item 1</li>
            <li>Item 2</li>
            <li>Item 3</li>
        </ul>
    </body>
</html>

(1)刪除節(jié)點

//假設(shè)要移除<ul>元素涕蚤,驗證以上事件發(fā)生的順序宪卿。
EventUtil.addHandler(window, "load", function(event){
    var list = document.getElementById("myList");
    EventUtil.addHandler(document, "DOMSubtreeModified", function(event){
        alert(event.type);
        alert(event.target);
    });
    EventUtil.addHandler(document, "DOMNodeRemoved", function(event){
        alert(event.type);
        alert(event.target);
        alert(event.relatedNode);
    });
    EventUtil.addHandler(list.firstChild, "DOMNodeRemovedFromDocument", 
    function(event){
        alert(event.type);
        alert(event.target);
    });
    list.parentNode.removeChild(list);
});

(2)插入節(jié)點

//假設(shè)要為<ul>添加一個<li>元素,驗證以上事件發(fā)生的順序赞季。
EventUtil.addHandler(window, "load", function(event){
    var list = document.getElementById("myList");
    var item = document.createElement("li");
    item.appendChild(document.createTextNode("Item 4"));
    EventUtil.addHandler(document, "DOMSubtreeModified", function(event){
        alert(event.type);
        alert(event.target);
    });
    EventUtil.addHandler(document, "DOMNodeInserted", function(event){
        alert(event.type);
        alert(event.target);
        alert(event.relatedNode);
    });
    EventUtil.addHandler(item, "DOMNodeInsertedIntoDocument", function(event){
        alert(event.type);
        alert(event.target);
    });
    list.appendChild(item);
});

7愧捕、HTML5事件

(1)contextmenu事件

  • 由于contextmenu 事件是冒泡的奢驯,因此可以為document指定一個事件處理程序申钩,用以處理頁面中發(fā)生的所有此類事件。
  • 這個事件的目標(biāo)是發(fā)生用戶操作的元素瘪阁。在所有瀏覽器中都可以取消這個事件撒遣。
  • 通常使用contextmenu事件來顯示自定義的上下文菜單邮偎,而使用onclick事件處理程序來隱藏該菜單。
<!DOCTYPE html>
<html>
    <head>
        <title>ContextMenu Event Example</title>
    </head>
    <body>
        <div id="myDiv">Right click or Ctrl+click me to get a custom context menu.Click anywhere else to get the default context menu.</div>
        <ul id="myMenu" style="position:absolute;visibility:hidden;
        background-color:silver">
            <li><a >Nicholas’ site</a></li>
            <li><a >Wrox site</a></li>
            <li><a >Yahoo!</a></li>
        </ul>
    </body>
</html>
EventUtil.addHandler(window, "load", function(event){
    var div = document.getElementById("myDiv");
    EventUtil.addHandler(div, "contextmenu", function(event){
        event = EventUtil.getEvent(event);
        EventUtil.preventDefault(event);
        var menu = document.getElementById("myMenu");
        menu.style.left = event.clientX + "px";
        menu.style.top = event.clientY + "px";
        menu.style.visibility = "visible";
    });
    EventUtil.addHandler(document, "click", function(event){
        document.getElementById("myMenu").style.visibility = "hidden";
    });
});

(2)beforeunload事件

  • 這個事件會在瀏覽器卸載頁面之前觸發(fā)义黎,可以通過它來取消卸載并繼續(xù)使用原有頁面禾进。
  • 這個事件的意圖是將控制權(quán)交給用戶。顯示的消息會告知用戶頁面行將被卸載(正因為如此才會顯示這個消息)廉涕,詢問用戶是否真的要關(guān)閉頁面泻云,還是希望繼續(xù)留下來。
EventUtil.addHandler(window, "beforeunload", function(event){
    event = EventUtil.getEvent(event);
    var message = "I'm really going to miss you if you go.";
    event.returnValue = message;
    return message;
});

(3)DOMCdontentLoaded事件

  • DOMContentLoaded 事件在形成完整的DOM 樹之后就會觸發(fā)狐蜕,不理會圖像宠纯、JavaScript 文件、CSS 文件或其他資源是否已經(jīng)下載完畢层释。
  • 要處理DOMContentLoaded事件婆瓜,可以為document或window添加相應(yīng)的事件處理程序(盡管這個事件會冒泡到window,但它的目標(biāo)實際上是document)
EventUtil.addHandler(document, "DOMContentLoaded", function(event){
    alert("Content loaded");
});

(4)hashchange事件

  • HTML5 新增了hashchange事件贡羔,以便在URL的參數(shù)列表(及URL中“#”號后面的所有字符串)發(fā)生變化時通知開發(fā)人員廉白。
  • 必須要把hashchange 事件處理程序添加給window對象,然后URL參數(shù)列表只要變化就會調(diào)用它乖寒。
  • 此時的event 對象應(yīng)該額外包含兩個屬性:oldURL和newURL猴蹂。這兩個屬性分別保存著參數(shù)列表變化前后的完整URL。
EventUtil.addHandler(window, "hashchange", function(event){
    alert("Old URL: " + event.oldURL + "\nNew URL: " + event.newURL);
});
  • 只有Firefox 6+宵统、Chrome和Opera支持oldURL和newURL屬性晕讲。為此,最好是使用location對象來確定當(dāng)前的參數(shù)列表马澈。
EventUtil.addHandler(window, "hashchange", function(event){
    alert("Current hash: " + location.hash);
});
  • 使用以下代碼可以檢測瀏覽器是否支持hashchange 事件瓢省。
var isSupported = ("onhashchange" in window) && (document.documentMode ===
undefined || document.documentMode > 7);

8、設(shè)備事件

(1)orientationchange事件

  • 蘋果公司為移動Safari中添加了orientationchange事件痊班,以便開發(fā)人員能夠確定用戶何時將設(shè)備由橫向查看模式切換為縱向查看模式勤婚。
  • 移動Safari 的window.orientation屬性中可能包含3個值:0表示肖像模式,90表示向左旋轉(zhuǎn)的橫向模式(“主屏幕”按鈕在右側(cè))涤伐,-90表示向右旋轉(zhuǎn)的橫向模式(“主屏幕”按鈕在左側(cè))馒胆。
EventUtil.addHandler(window, "load", function(event){
    var div = document.getElementById("myDiv");
    div.innerHTML = "Current orientation is " + window.orientation;
    EventUtil.addHandler(window, "orientationchange", function(event){
        div.innerHTML = "Current orientation is " + window.orientation;
    });
});
  • 所有iOS 設(shè)備都支持orientationchange 事件和window.orientation 屬性。

(2)MozOrientation 事件

  • Firefox 3.6 為檢測設(shè)備的方向引入了一個名為MozOrientation的新事件凝果。當(dāng)設(shè)備的加速計檢測到設(shè)備方向改變時赐稽,就會觸發(fā)這個事件。
EventUtil.addHandler(window, "MozOrientation", function(event){
    //響應(yīng)事件
});
  • 此時的event 對象包含三個屬性:x宇攻、y和z萍摊。這幾個屬性的值都介于1到-1之間,表示不同坐標(biāo)軸上的方向。
  • 如果設(shè)備向右傾斜纠俭,x值會減醒亓俊;反之冤荆,向左傾斜朴则,x值會增大。z軸檢測垂直加速度度钓简,1 表示靜止不動乌妒,在設(shè)備移動時值會減小。
  • 只有帶加速計的設(shè)備才支持MozOrientation 事件.

Warning: This experimental API was removed in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3), when support for the standard DeviceOrientationEvent was implemented. You should use that API instead.

(3)deviceorientation 事件

  • 觸發(fā)deviceorientation事件時外邓,事件對象中包含著每個軸相對于設(shè)備靜止?fàn)顟B(tài)下發(fā)生變化的信息芥被。事件對象包含以下5 個屬性。
    • alpha:在圍繞z 軸旋轉(zhuǎn)時(即左右旋轉(zhuǎn)時)坐榆,y 軸的度數(shù)差拴魄;是一個介于0 到360 之間的浮點數(shù)。
    • beta:在圍繞x 軸旋轉(zhuǎn)時(即前后旋轉(zhuǎn)時)席镀,z 軸的度數(shù)差匹中;是一個介于-180 到180 之間的浮點數(shù)。
    • gamma:在圍繞y 軸旋轉(zhuǎn)時(即扭轉(zhuǎn)設(shè)備時)豪诲,z 軸的度數(shù)差顶捷;是一個介于-90 到90 之間的浮點數(shù)。
    • absolute:布爾值屎篱,表示設(shè)備是否返回一個絕對值服赎。
    • compassCalibrated:布爾值,表示設(shè)備的指南針是否校準(zhǔn)過交播。
EventUtil.addHandler(window, "deviceorientation", function(event){
    var output = document.getElementById("output");
    output.innerHTML = "Alpha=" + event.alpha + ", Beta=" + event.beta +
    ", Gamma=" + event.gamma + "<br>";
});
  • 通過這些信息重虑,可以響應(yīng)設(shè)備的方向,重新排列或修改屏幕上的元素秦士。要響應(yīng)設(shè)備方向的改變而旋轉(zhuǎn)元素缺厉。
EventUtil.addHandler(window, "deviceorientation", function(event){
var arrow = document.getElementById("arrow");
    arrow.style.webkitTransform = "rotate(" + Math.round(event.alpha) + "deg)";
});

(4)devicemotion 事件

  • DeviceOrientation Event 規(guī)范還定義了一個devicemotion 事件,通過devicemotion 能夠檢測到設(shè)備是不是正在往下掉隧土,或者是不是被走著的人拿在手里提针。
  • 觸發(fā)devicemotion 事件時,事件對象包含以下屬性曹傀。
    • acceleration:一個包含x辐脖、y和z屬性的對象,在不考慮重力的情況下皆愉,告訴你在每個方向上的加速度嗜价。
    • accelerationIncludingGravity:一個包含x落萎、y和z屬性的對象,在考慮z軸自然重力加速度的情況下炭剪,告訴你在每個方向上的加速度。
    • interval:以毫秒表示的時間值翔脱,必須在另一個devicemotion事件觸發(fā)前傳入奴拦。這個值在每個事件中應(yīng)該是一個常量。
    • rotationRate:一個包含表示方向的alpha届吁、beta 和gamma 屬性的對象错妖。
EventUtil.addHandler(window, "devicemotion", function(event){
    var output = document.getElementById("output");
    if (event.rotationRate !== null){
        output.innerHTML += "Alpha=" + event.rotationRate.alpha + ", Beta=" +
        event.rotationRate.beta + ", Gamma=" +
        event.rotationRate.gamma;
    }
});

9、觸摸與手勢事件

(1)觸摸事件

  • 觸摸事件會在用戶手指放在屏幕上面時疚沐、在屏幕上滑動時或從屏幕上移開時觸發(fā)暂氯。
名稱 詳細(xì)
touchstart 當(dāng)手指觸摸屏幕時觸發(fā);即使已經(jīng)有一個手指放在了屏幕上也會觸發(fā)亮蛔。
touchmove 當(dāng)手指在屏幕上滑動時連續(xù)地觸發(fā)痴施。在這個事件發(fā)生期間,調(diào)用preventDefault()可以阻止?jié)L動究流。
touchend 當(dāng)手指從屏幕上移開時觸發(fā)辣吃。
touchcancel 當(dāng)系統(tǒng)停止跟蹤觸摸時觸發(fā)。
  • 每個觸摸事件的event對象都提供了在鼠標(biāo)事件中常見的屬性:bubbles芬探、cancelable神得、view、clientX偷仿、clientY哩簿、screenX、screenY酝静、detail节榜、altKey、shiftKey别智、ctrlKey 和metaKey全跨。

  • 除了常見的DOM屬性外,觸摸事件還包含下列三個用于跟蹤觸摸的屬性亿遂。
    名稱|詳細(xì)
    -|-
    touches|表示當(dāng)前跟蹤的觸摸操作的Touch 對象的數(shù)組浓若。
    targetTouchs|特定于事件目標(biāo)的Touch 對象的數(shù)組。
    changeTouches|表示自上次觸摸以來發(fā)生了什么改變的Touch 對象的數(shù)組蛇数。
  • 每個Touch 對象包含下列屬性挪钓。
    名稱|詳細(xì)
    -|-
    clientX|觸摸目標(biāo)在視口中的x 坐標(biāo)。
    clientY|觸摸目標(biāo)在視口中的y 坐標(biāo)耳舅。
    identifier|標(biāo)識觸摸的唯一ID碌上。
    pageX|觸摸目標(biāo)在頁面中的x 坐標(biāo)倚评。
    pageY|觸摸目標(biāo)在頁面中的y 坐標(biāo)。
    screenX|觸摸目標(biāo)在屏幕中的x 坐標(biāo)馏予。
    screenY|觸摸目標(biāo)在屏幕中的y 坐標(biāo)天梧。
    target|觸摸的DOM 節(jié)點目標(biāo)。

  • 使用這些屬性可以跟蹤用戶對屏幕的觸摸操作霞丧。

function handleTouchEvent(event){
//只跟蹤一次觸摸
    if (event.touches.length == 1){
    var output = document.getElementById("output");
    switch(event.type){
        case "touchstart":
            output.innerHTML = "Touch started (" + event.touches[0].clientX +
            "," + event.touches[0].clientY + ")";
            break;
        case "touchend":
            output.innerHTML += "<br>Touch ended (" +
            event.changedTouches[0].clientX + "," +
            event.changedTouches[0].clientY + ")";
            break;
        case "touchmove":
            event.preventDefault(); //阻止?jié)L動
            output.innerHTML += "<br>Touch moved (" +
            event.changedTouches[0].clientX + "," +
            event.changedTouches[0].clientY + ")";
            break;
        }
    }
}
EventUtil.addHandler(document, "touchstart", handleTouchEvent);
EventUtil.addHandler(document, "touchend", handleTouchEvent);
EventUtil.addHandler(document, "touchmove", handleTouchEvent);

(2)手勢事件

  • 當(dāng)兩個手指觸摸屏幕時就會產(chǎn)生手勢呢岗,手勢通常會改變顯示項的大小,或者旋轉(zhuǎn)顯示項蛹尝。有三個手勢事件后豫。
名稱 詳細(xì)
gesturestart 當(dāng)一個手指已經(jīng)按在屏幕上而另一個手指又觸摸屏幕時觸發(fā)。
gesturechange 當(dāng)觸摸屏幕的任何一個手指的位置發(fā)生變化時觸發(fā)突那。
gestureend 當(dāng)任何一個手指從屏幕上面移開時觸發(fā)挫酿。
  • 每個手勢事件的event對象都包含著標(biāo)準(zhǔn)的鼠標(biāo)事件屬性:bubbles、cancelable愕难、view早龟、clientX、clientY猫缭、screenX拄衰、screenY、detail饵骨、altKey翘悉、shiftKey、ctrlKey和metaKey居触。
  • 還包含兩個額外的屬性:rotation 和scale妖混。
名稱 詳細(xì)
rotation 表示手指變化引起的旋轉(zhuǎn)角度,負(fù)值表示逆時針旋轉(zhuǎn)轮洋,正值表示順時針旋轉(zhuǎn)(該值從0 開始)制市。
scale 表示兩個手指間距離的變化情況(例如向內(nèi)收縮會縮短距離);這個值從1 開始弊予,并隨距離拉大而增長祥楣,隨距離縮短而減小。
function handleGestureEvent(event){
    var output = document.getElementById("output");
    switch(event.type){
    case "gesturestart":
        output.innerHTML = "Gesture started (rotation=" + event.rotation +
        ",scale=" + event.scale + ")";
        break;
    case "gestureend":
        output.innerHTML += "<br>Gesture ended (rotation=" + event.rotation +
        ",scale=" + event.scale + ")";
        break;
    case "gesturechange":
        output.innerHTML += "<br>Gesture changed (rotation=" + event.rotation +
        ",scale=" + event.scale + ")";
        break;
    }
}
document.addEventListener("gesturestart", handleGestureEvent, false);
document.addEventListener("gestureend", handleGestureEvent, false);
document.addEventListener("gesturechange", handleGestureEvent, false);
好好學(xué)習(xí)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汉柒,一起剝皮案震驚了整個濱河市误褪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碾褂,老刑警劉巖兽间,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異正塌,居然都是意外死亡嘀略,警方通過查閱死者的電腦和手機(jī)恤溶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帜羊,“玉大人咒程,你說我怎么就攤上這事∷嫌” “怎么了帐姻?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窥淆。 經(jīng)常有香客問我,道長巍杈,這世上最難降的妖魔是什么忧饭? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮筷畦,結(jié)果婚禮上词裤,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖宾,他們只是感情好吼砂,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鼎文,像睡著了一般渔肩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拇惋,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天周偎,我揣著相機(jī)與錄音,去河邊找鬼撑帖。 笑死蓉坎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胡嘿。 我是一名探鬼主播蛉艾,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衷敌!你這毒婦竟也來了勿侯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缴罗,失蹤者是張志新(化名)和其女友劉穎罐监,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞒爬,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弓柱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年沟堡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矢空。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡航罗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屁药,到底是詐尸還是另有隱情粥血,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布酿箭,位于F島的核電站复亏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缭嫡。R本人自食惡果不足惜缔御,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妇蛀。 院中可真熱鬧耕突,春花似錦、人聲如沸评架。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纵诞。三九已至上祈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浙芙,已是汗流浹背雇逞。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留茁裙,地道東北人塘砸。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像晤锥,于是被迫代替她去往敵國和親掉蔬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1矾瘾、窗體 1女轿、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱,在應(yīng)用程序中可通過Name屬性來引用窗體壕翩。 ...
    Moment__格調(diào)閱讀 4,531評論 0 11
  • JavaScript 與 HTML 間通過事件實現(xiàn)交互蛉迹。事件——文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬間,即用戶...
    sylvia_yue閱讀 462評論 0 0
  • Web 瀏覽器中可能發(fā)生的事件有很多類型放妈。如前所述北救,不同的事件類型具有不同的信息荐操,而 DOM3 級事件規(guī)定了以下幾...
    More_5897閱讀 903評論 1 0
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,599評論 2 10
  • 粉如胭脂 白如堆雪 清香醉了山谷山坡 揚眉垂額 姿態(tài)綽約 把冬季染成春的顏色 妍而不媚 香而不膩 當(dāng)葉滿枝頭 你...
    國勝閱讀 235評論 1 1