Javascript事件筆記

事件在DOM結構中傳播的順序叫事件流,分三個階段:事件捕獲、事件發生、事件冒泡

現代瀏覽器事件冒泡一直冒到window身上,事件捕獲也延伸到window開始

事件級別

  • HTML事件 onclick = "showAlert(event)"
  • DOM0級事件 div.onclick = function(){}
  • DOM2級事件 addEventListen

事件的分類

UI事件、焦點事件、鼠標事件、滾輪事件、文本事件、鍵盤事件、設備事件。

UI事件指的是那些不一定與用戶操作有關的事件。包括:
  • load 當頁面完全加載后(包括所有圖像、Javascript文件、CSS文件等外部資源)就會觸發window身上的load事件。當我們為image圖像指定事件時,需要先指定事件,然后設置 src 才能在圖像加載完畢觸發事件,否則不能生效。
  • unload window身上
  • abort
  • error window身上
  • select 表單元素
  • resize window身上
  • scroll window和body身上觸發,有兼容性問題,
焦點事件
  • focus 不冒泡
  • blur 不冒泡
  • focusin 冒泡
  • focusout 冒泡
鼠標事件與滾輪事件
  • click
  • dbclick
  • mousedown
  • mouseenter 鼠標光標從元素外部首次移動到元素范圍之內時觸發,不冒泡,而且移動到后代元素上也不觸發
  • mouseleave 在位于元素上方的鼠標光標移動到元素范圍之外時觸發,不冒泡,而且光標移動到后代元素上不會觸發
  • mousemove 光標在元素內部移動時重復地觸發。
  • mouseout 在鼠標指針位于一個元素上方,然后用戶將其移入另一個元素時觸發。一個元素可能位于前一個元素的外部,也可能是這個元素的子元素
  • mouseover 在鼠標指針位于一個元素外部,然后用戶將其首次移入另一個元素邊界之內觸發
  • mouseup

客戶區座標

  • event.clientX
  • event.clientY
  • event.pageX IE8下需要采用折衷方案計算出來scrollLeft 和scrollTop
  • event.pageY
  • event.screenX
  • event.screenY
iOS 和 Andriod 特殊處理
  • 不支持dbclick
  • 輕擊可單擊元素會觸發mousemove事件。如果此操作會導致內容滾變化,將不再有其他事件法身滾;如果屏幕沒有因此變化,那么一次會發生mousedown mouseup click 事件。輕擊不可單擊的元素不會觸發任何事件??蓡螕舻脑刂改切┑究僧a生默認操作的元素,或這那些已經被指定了onclick事件處理程序的元素。
  • mousemove事件也會觸發mouseover 和 mouseout 事件
  • 兩個手指放在屏幕上且頁面隨手指移動二滾動時會觸發mousewheel 和 scroll事件。
鍵盤事件
  • keydown 按下任意鍵時觸發,一直按下,一直觸發,文本框變化前
  • keypress 按下任意鍵時觸發,一直按下,一直觸發,文本框變化前
  • keyup
  • textInput 用戶在可編輯區域中輸入字符時觸發,退格鍵,button身上的都不能觸發

contentmenu事件 在呼出快捷菜單時觸發,具體可以參見范例。

DOMContentLoaded事件 DOM樹加載完畢后觸發,document身上或者window身上

pageshow 在頁面onload之后觸發,切換標簽從緩存中讀取時也會觸發
pagehide

hashchange URL的參數列表發生變化時通知開發人員。window對象

設備事件
  • orientationchange事件 window身上,蘋果ios系統 0 90 -90
  • deviceorientation xyz軸,
觸摸手勢事件
  • touchstart 冒泡

  • touchmove 冒泡

  • touchend 冒泡

  • touchcancel 冒泡

  • 以上事件的事件對象中不僅包括clientX等參數,還包括touches targetTouchs changeTouches等屬性

  • touches 表示當前跟蹤的觸摸操作的Touch對象的數組

  • targetTouchs 特定與事件目標的Touch對象數組

  • changeTouches 表示自上此觸摸以來發生了什么改變的Touch對象的數組

手勢事件

  • gesturestart 當一個手指已經安在屏幕上,另一個手指有觸摸屏幕時觸發
  • gesturechange 當觸摸屏上任意一個手指位置發生變化時觸發
  • gestureend 當任何一個手指從屏幕上面移開時觸發

事件委托

  • 利用事件冒泡和target來獲取對應的元素
  • 移除事件處理程序
//scroll事件的觸發
EventUtil.addHandler(window,"scroll",function (event) {
  if(document.compatMode == "CSS1Compat"){
    alert(document.documentElement.scrollTop);
  }else {
    alert(document.body.scrollTop);
  }
})

//計算IE8下pageX和pageY

//修改鍵

//快捷菜單范例
//跨瀏覽器事件解決方案
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] = hanlder;
    }
  },
  //移除事件
  removeHandler: function (element, type, hanlder) {
    if(element.removeEventListener){
      element.removeEventListener(type,handler,false);
    }else if(element.detachEvent){
      element.detachEvent("on" + type, hanlder);
    } else {
      element["on" + type] = null;
    }
  },
  //獲取事件對象
  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;
    }
  },
  //事件發生時阻止事件冒泡和捕獲
  stopPropagation: function (event) {
    if(event.stopPropagation){
      event.stopPropagation();
    }else {
      event.cancelBubble = true;
    }
  },
  //當事件為mouseover和mouseout時,事件對象中會有相關元素,這里就是獲取相關元素
  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;
    }
  },
  //獲取鼠標點擊時,用的是哪個按鍵
  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;
      }
    }
  },
  //獲取鼠標滾輪滾動的方向,120為向上滾,-120為向下滾
  getWheelDelta: function (event) {
    if(event.wheelDelta){
      return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta: event.wheelDelta)
    } else {
      return -event.detail * 40;
    }
  },
  //獲取按鍵的編碼
  getCharCode: function (event) {
    if(typeof event.charCode == "number"){
      return event.charCode;
    }else {
      return event.keyCode;
    }
  },
  //獲取剪切板內容
  getClipboardText: function (event) {
    var clipboardData = (event.clipboardData || window.clipboardData);
    return clipboardData.getData("text");
  },
  //設置剪切板內容
  setClipboardText: function (event) {
    if(event.clipboardData){
      return event.clipboardData.setData("text/plain",value);
    } else if (window.clipboardData){
      return window.clipboardData.setData("text",value);
    }
  }
};
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現的。 ??事件,就是文檔或瀏覽器窗口中發生的一些特...
    霜天曉閱讀 3,516評論 1 11
  • JavaScript 與 HTML 之間的交互是通過事件實現的。事件,就是文檔或瀏覽器窗口中發生的一些特定的交互瞬...
    LemonnYan閱讀 693評論 0 4
  • 事件類型 Web 瀏覽器中可能發生的事件有很多類型UI事件:當用戶與界面上的元素交互時觸發。焦點事件:當元素獲得或...
    shanruopeng閱讀 927評論 0 0
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數據類型 5種簡單數據類型:Unde...
    RickCole閱讀 5,144評論 0 21
  • 事件 http://www.w3school.com.cn/jsref/dom_obj_event.asp Jav...
    CMPEAX閱讀 384評論 0 0