最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)解讀JavaScript的跨瀏覽器事件處理

 更新時(shí)間:2015年08月12日 16:17:34   作者:libuchao  
這篇文章主要介紹了JavaScript的跨瀏覽器事件處理,以全瀏覽器兼容為大致目標(biāo),需要的朋友可以參考下

一.關(guān)于獲取事件對(duì)象

FF有點(diǎn)倔強(qiáng),只支持arguments[0],不支持window.event。這次真的不怪IE,雖然把event作為window的屬性不合規(guī)范,但大家都已經(jīng)默許這個(gè)小問(wèn)題存在了,只有FF這么多年了還是特立獨(dú)行。所以,跨瀏覽器的事件對(duì)象獲取有以下兩種方式:

帶參的:

getEvent : function(event){
  return event ? event : window.event;
  //return event || window.event;//或者更簡(jiǎn)單的方式
}

無(wú)參的:

function getEvent() {
  return arguments[0] ? arguments[0] : window.event;
  //return arguments[0] || window.event;//或者更簡(jiǎn)單的方式
}

需要特別說(shuō)明一種方式:HTML的DOM0級(jí)方式 + 帶參的事件處理器,如下:

function handler(event){
  //do something
}
<!-- HTML的DOM0級(jí)方式 -->
<button id="btn" onclick="handler(event);">按鈕</button>

上面這種方式是全瀏覽器兼容的,但依賴HTML的DOM0級(jí)方式的缺點(diǎn)很明顯,所以沒(méi)能成為像前兩種那樣的主流方法,而JS的DOM0級(jí)方式 + 帶參的事件處理器,如下:

function handler(event){
  //do something
}
btn.onclick = handler;//JS的DOM0級(jí)方式
//btn.onclick = function(event){/*do something*/}//或者匿名函數(shù),效果同上

這種方式不是全瀏覽器兼容的,[IE8-]不支持,IE9+未知,F(xiàn)F,Chrome支持。一直以為HTML的DOM0級(jí)事件處理和JS的DOM0級(jí)事件處理是等價(jià)的,現(xiàn)在做了很多實(shí)驗(yàn)才發(fā)現(xiàn)二者是有區(qū)別的

二.關(guān)于獲取事件源

event.srcElement是[IE8-]唯一的方式,IE9+未知,其它瀏覽器都支持標(biāo)準(zhǔn)的event.target方式

三.關(guān)于阻止事件默認(rèn)行為

event.preventDefault()是標(biāo)準(zhǔn)方法,但[IE8-]不支持,IE自己的方式是event.returnValue = false;

四.關(guān)于停止事件傳播

event.stopPropagation()是標(biāo)準(zhǔn)方法,IE又有意見(jiàn)了,他要這么玩:event.cancelBubble = true;這里需要特別注意了,因?yàn)閏ancel是屬性而不是方法,與標(biāo)準(zhǔn)相差甚遠(yuǎn),容易記錯(cuò)

五.關(guān)于事件處理器的添加和移除

DOM0級(jí)方式

ele.onclick = handler;ele.onclick=null;最古老的一種方式

優(yōu)點(diǎn):全瀏覽器兼容

缺點(diǎn):同一事件只能綁定/解綁一個(gè)事件處理器

DOM2級(jí)方式

ele.add/removeEventListener(eventType, handler, catch);

和IE方式:ele.attach/detachEvent(‘on'+eventType, handler);

優(yōu)點(diǎn):支持綁定/解綁多個(gè)事件處理器

缺點(diǎn):需要做兼容性判斷。需要注意的是:標(biāo)準(zhǔn)方式中最后一個(gè)參數(shù)表示是否在事件捕獲階段綁定/解綁,IE不支持事件捕獲,所以也就沒(méi)有第三個(gè)參數(shù)了

注意:IE方式不僅方法名與標(biāo)準(zhǔn)不同,參數(shù)中事件類(lèi)型還要加上on,否則綁定無(wú)效但不報(bào)錯(cuò)

六.跨瀏覽器的事件處理

//跨瀏覽器的事件處理器添加方式
var EventUtil = {
  addHandler : function(elem, type, handler){
    if(elem.addEventListener){
      elem.addEventListener(type, handler, false);
    }
    else if(elem.attachEvent){
      elem.attachEvent("on" + type, handler);//添加多個(gè)同一類(lèi)型的handler時(shí),IE方式的規(guī)則是最后添加的最先觸發(fā)
    }
    else{
      if(typeof elem["on" + type] === 'function'){
        var oldHandler = elem["on" + type];
        elem["on" + type] = function(){
          oldHandler();
          handler();
        }
      }
      else{
        elem["on" + type] = handler;//支持添加多個(gè)事件處理器
      }
    }
  },

  getEvent : function(event){
    return event ? event : window.event;
  },

  getTarget : function(event){
    return event.target || event.srcElement;
  },

  preventDefault : function(event){
    if(event.preventDefault){
      event.preventDefault();
    }
    else{
      event.returnValue = false;
    }
  },

  removeHandler : function(elem, type, handler){
    if(elem.removeEventListener){
      elem.removeEventListener(type, handler, false);
    }
    else if(elem.detachEvent){
      elem.detachEvent("on" + type, handler);
    }
    else{
      elem["on" + type] = null;//不支持移除單一事件處理器,只能全部移除
    }
  },

  stopPropagation : function(event){
    if(event.stopPropagation){
      event.stopPropagation();
    }
    else{
      event.cancelBubble = true;
    }
  },

  getRelatedTarget : function(event){
    if(event.relatedTarget){
      return event.relatedTarget;
    }
    else if(event.toElement && event.type == "mouseout"){
      return event.toElement;
    }
    else if(event.fromElement && event.type == "mouseover"){
      return event.fromElement;
    }
    else{
      return null;
    }
  },

  /*IE8點(diǎn)擊左鍵和中鍵都是0;FF無(wú)法識(shí)別中鍵;Chrome正常*/
  getButton : function(event){//返回0,1,2 - 左,中,右
    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;
          break;
        case 2:case 6:
          return 2;
          break;
        case 4:
          return 1;
          break;
        default:
          break;
      }
    }
  },

  /*只能檢測(cè)keypress事件,返回值等于將要顯示的字符編碼*/
  /*IE和Chrome只有能顯示的字符鍵才觸發(fā),F(xiàn)F其它鍵也能觸發(fā),返回值為0*/
  getCharCode : function(event){
    if(typeof event.charCode == "number"){
      return event.charCode;
    }
    else{
      return event.keyCode;
    }
  }
};

綜合示例

如果項(xiàng)目中沒(méi)有使用諸如 jQuery 之類(lèi)的庫(kù),如何方便地為元素綁定事件,并兼容各種瀏覽器呢?下面這個(gè)簡(jiǎn)單的 Utility 應(yīng)該可以考慮。

var eventUtility = {
  addEvent : function(el, type, fn) {
    if(typeof addEventListener !== "undefined") {
      el.addEventListener(type, fn, false);
    } else if(typeof attachEvent !== "undefined") {
      el.attachEvent("on" + type, fn);
    } else {
      el["on" + type] = fn;
    }
  },

  removeEvent : function(el, type, fn) {
    if(typeof removeEventListener !== "undefined") {
      el.removeEventListener(type, fn, false);
    } else if(typeof detachEvent !== "undefined") {
      el.detachEvent("on" + type, fn);
    } else {
      el["on" + type] = null;
    }
  },

  getTarget : function(event) {
    if(typeof event.target !== "undefined") {
      return event.target;
    } else {
      return event.srcElement;
    }
  },

  preventDefault : function(event) {
    if(typeof event.preventDefault !== "undefined") {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
  }
};

使用方法示例:

var eventHandler = function(evt) {
  var target = eventUtility.getTarget(evt),
    tagName = target.tagName;

  if(evt.type === "click") {
    if(tagName === "A" || tagName === "BUTTON") {
      alert("You clicked on an A element, and the innerHTML is " + target.innerHTML + "!");
      eventUtility.preventDefault(evt);
    }
  } else if(evt.type === "mouseover" && tagName === "A") {
    alert("mouseovered " + target.innerHTML);
  }

};

eventUtility.addEvent(document, "click", eventHandler);
eventUtility.addEvent(document, "mouseover", eventHandler);

eventUtility.removeEvent(document, "mouseover", eventHandler);


相關(guān)文章

  • JavaScript中變量的用法

    JavaScript中變量的用法

    這篇文章介紹了JavaScript中變量的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 10分鐘掌握XML、JSON及其解析

    10分鐘掌握XML、JSON及其解析

    最近一段時(shí)間,個(gè)人綜合了之前對(duì)XML、JSON的一些了解,參考了相關(guān)資料,再結(jié)合視頻的代碼,把自己的一些思考融入了這篇總結(jié)文檔中,同時(shí)嘗試用通俗詼諧的語(yǔ)言風(fēng)格來(lái)闡述,期望能給感興趣的讀者帶來(lái)幫助
    2016-10-10
  • 詳解JavaScript中的表單驗(yàn)證

    詳解JavaScript中的表單驗(yàn)證

    這篇文章主要介紹了JavaScript中的表單驗(yàn)證,是JS在前端和服務(wù)器端通信部分相關(guān)的重要知識(shí),需要的朋友可以參考下
    2015-06-06
  • javascript學(xué)習(xí)筆記(十一) 正則表達(dá)式介紹

    javascript學(xué)習(xí)筆記(十一) 正則表達(dá)式介紹

    javascript學(xué)習(xí)筆記之正則表達(dá)式介紹,需要的朋友可以參考下
    2012-06-06
  • JavaScript DOM元素尺寸和位置

    JavaScript DOM元素尺寸和位置

    這篇文章主要介紹了JavaScript DOM元素尺寸和位置,需要的朋友可以參考下
    2015-04-04
  • JavaScript 對(duì)任意元素,自定義右鍵菜單的實(shí)現(xiàn)方法

    JavaScript 對(duì)任意元素,自定義右鍵菜單的實(shí)現(xiàn)方法

    本篇文章是對(duì)在JavaScript中對(duì)任意元素,自定義右鍵菜單的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 詳談js的變量提升以及使用方法

    詳談js的變量提升以及使用方法

    在本專(zhuān)欄中小編給大家整理了關(guān)于js的變量提升以及使用方法的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。
    2018-10-10
  • JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記3 js簡(jiǎn)單數(shù)據(jù)類(lèi)型

    JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記3 js簡(jiǎn)單數(shù)據(jù)類(lèi)型

    數(shù)據(jù)類(lèi)型是編程語(yǔ)言的磚瓦,是所有你能想象到的復(fù)雜抽象的基礎(chǔ),在現(xiàn)代編程語(yǔ)言中,除了語(yǔ)言本身內(nèi)置的一些簡(jiǎn)單數(shù)據(jù)類(lèi)型外,基本上都提供了用于自定義數(shù)據(jù)類(lèi)型的語(yǔ)言機(jī)制(在C中也可以利用結(jié)構(gòu)體來(lái)實(shí)現(xiàn)),這些機(jī)制在一定程度上也決定了該語(yǔ)言的流行度和生命力
    2012-10-10
  • JavaScript變量的作用域全解析

    JavaScript變量的作用域全解析

    這篇文章主要介紹了JavaScript變量的作用域的基本知識(shí),是JavaScript入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • javascript中var與let、const的區(qū)別詳解

    javascript中var與let、const的區(qū)別詳解

    這篇文章主要介紹了javascript中var與let、const的區(qū)別詳解,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

尼勒克县| 雷波县| 紫金县| 阜宁县| 吉首市| 兴业县| 托克逊县| 牟定县| 侯马市| 英吉沙县| 乌拉特前旗| 会东县| 金溪县| 泰安市| 云霄县| 五峰| 酒泉市| 嘉鱼县| 余姚市| 唐山市| 芦山县| 稷山县| 苍山县| 临泽县| 富裕县| 沐川县| 达尔| 开江县| 焉耆| 日喀则市| 顺昌县| 德庆县| 剑川县| 岳普湖县| 广州市| 龙州县| 白银市| 拜泉县| 岳西县| 永州市| 临泽县|