DOM事件第二彈(UIEvent事件)

来源:http://www.cnblogs.com/cqhaibin/archive/2017/05/21/6885433.html
-Advertisement-
Play Games

此文章主要總結UIEvent相關的事件,如有不對的地方,歡迎指正。 一、uitls.js(綁定事件公共類) 主要做一些事件名的相容性處理。 二、baseEvent 2.1 相容點 2.2 一些代碼 三、焦點事件 不是所有的標簽都支持焦點事件,如div(不可編輯狀態)、span、p等這類佈局和顯示內容 ...


此文章主要總結UIEvent相關的事件,如有不對的地方,歡迎指正。

一、uitls.js(綁定事件公共類)

var fixs = {
    'focusin': {
        standard: 'focus',
        ie: 'focusin'
    },
    'focusout':{
        standard: 'blur',
        ie: 'foucsout'
    },
    'input': {
        standard: 'input',
        ie: 'propertychange'
    }
}
var uitls = {
    bindEvent: function(dom, eventType, fun, useCapture){
        var fix = fixs[eventType];
        if(document.addEventListener){
            dom.addEventListener( fix ? fix.standard : eventType, fun, useCapture);
        }else{
            dom.attachEvent('on' + ( fix ? fix.ie : eventType ), fun);
        }
    }
};

主要做一些事件名的相容性處理。

二、baseEvent

事件名 說明
load 在內容或頁面載入完成後觸發。此節點應用於document的節點上(但不能在document上綁定此事件),可以綁定元素:body、img、frame、frameset、iframe、link、script。js對象:image、windows、layer(h5的)
unload 在頁面或內容被移除時觸發。元素:body、frameset;Js對象:window。
onbeforeunload 提示用戶是否關閉當前網頁
abort 圖片載入完成之前被用戶終止時觸發,元素:img;js對象:image
error 資源載入出錯被觸發,元素:script、img、style;js對象:window,image
select 文本被選中觸發,js對象:window

2.1 相容點

  1. 當load事件應用在script元素上時,在Ie不支持,需要用onreadystatechange事件來代替(error會作為一個狀態來傳遞);
  2. script的error,在ie上也是不支持的,也是通過onreadystatechange事件來代替(狀態值)。
  3. select相關相容性參考:'做一個留言板:輸入框'

2.2 一些代碼

var img = document.getElementById('img');
var btn = document.getElementById('btn');
uitls.bindEvent(img, 'load', function(event){
    console.log('load img');
});
uitls.bindEvent(btn, 'click', function(event){
    img.src = '../../img/bck.png';
});
window.onload = function(event){
    console.log('window');
}
window.onbeforeunload = function(event){
    console.log('window onbeforeunload');
    return false;
}
window.onunload = function(evet){
    console.log('window unload');
}
img.src='../../img/a.jpg';
  1. onbeforeunload:可以控制是否向用戶提示 離開,還是留在當前頁面。

三、焦點事件

不是所有的標簽都支持焦點事件,如div(不可編輯狀態)、span、p等這類佈局和顯示內容的標簽不支持焦點事件,主要form、以及form下的標簽支持焦點事件。

事件名 說明
focus 獲得焦點,不冒泡
blur 失去焦點,不冒泡
focusin 獲得焦點,冒泡
focusout 失去焦點,冒泡
DOMFocusin 獲得焦點,不冒泡,遺留方案
DOMFocusout 失去焦點,不冒泡,遺留方案

3.1 代理事件的相容處理方案

  1. ie、opera、chrome等都支持focusin和focusout,但firefox不支持focusin和focusout。
  2. 但opera、chrome、firefox的focus和blur不支持冒泡,但支持捕獲

3.2 實現代碼

<form id="form" >
    <input type="text" />
    <input type="text" />
</form>
<script src="./uitls.js"></script>
<script>
    var _form = document.getElementById('form');
    uitls.bindEvent(_form, 'focusin', function(event){
        console.log('focusin: ' + ( event.target || event.srcElement ));
    }, true);
</script>

設置了addEventListener的第三個參數為true,表示在捕獲階段執行。

3.3 代碼觸focusin事件

我們這裡需要做一個相容方案處理,在現代瀏覽器下需要用focus來觸發,因為我們綁定是focus事件。

var inputone = document.getElementById('inputone');
var focusinEvent = document.createEvent('UIEvents');
focusinEvent.initUIEvent('focus',true,true); //後面兩個參數為true或false都沒有影響, 因為focusin發生在捕獲階段
_form.dispatchEvent(focusinEvent); //inputone也可以

四、輸入事件(oninput和onpropertychange)

實現輸入內容的動態監測。

4.1 區別與相容性

  1. oninput為現代瀏覽器的特性(ie9+都ok),只有改變控制項的value才會觸發oninput,但js改變value不會觸發oninput,並且oninput需要只能通過addEventListener註冊
  2. onpropertychange可以用attachEvent和.onpropertychanage註冊,但input為disable=true的不能執行
  3. oninput,在從瀏覽器自動下拉提示中選取時,不會觸發.

4.2 註意

  1. onpropertychanage事件,是屬性值發生改變就會觸發,如果我們一個動作導致兩個屬性值改變,就會觸發兩次:
<select id="sel" >
    <option value="1" >1</option>
    <option value="2" >2</option>
    <option value="3" >3</option>
    <option value="4" >4</option>
</select>
var sel = document.getElementById('sel');
uitls.bindEvent(sel, 'input', function(event){
    var target = event.target || event.srcElement;
    console.log("sel:" + target.value);
});

五、複合事件

事件名 說明
compositionstart ime輸入開始
compositionupdate ime接受輸入框值改變
compositionend ime輸入結束

說明:

  1. 這三個事件中傳入的event對象,會多一個data屬性,代表當前輸入的字元。
  2. 英文輸入狀態不會觸發這三個事件,只有非英文輸入才觸發(用輸入法來確定的)
  3. ie8-不支持此類事件

5.1 composition與input事件的結合,以及標準瀏覽與ie、edge的區別

示例代碼:

<input id="input" type="text" />
<script src="./uitls.js"></script>
<script>
    var input = document.getElementById('input');
    uitls.bindEvent(input, 'compositionstart', function(event){ //英文不行,中文可以(識別的是輸入法),開始輸入狀態
        console.log('compositionstart: ' + event.target + " " + event.data);
    });
    uitls.bindEvent(input, 'compositionend', function(event){ //輸入結束狀態
        console.log('compositionend: ' + event.target + " " + event.data)
    });
    uitls.bindEvent(input, 'compositionupdate', function(event){ //輸入過程中,
        console.log('compositionupdate: ' + event.target + " " + event.data)
    });
    uitls.bindEvent(input, 'input', function(event){
        console.log('input: ' + input.value);
    });
</script>

說明:

  1. 程式主動觸發代碼如下:
var compositionstartEvent = document.createEvent('UIEvents');
compositionstartEvent.initUIEvent('compositionstart', false, false);
input.dispatchEvent(compositionstartEvent);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 截止目前,筆者在博客園上面已經發表了3篇關於網路下載的文章,這三篇博客實現了基於socket的http多線程遠程斷點下載實用程式。筆者打算在此基礎上開發出一款分散式文件管理實用程式,截止目前,已經實現了 服務端/客戶端 的上傳、下載部分的功能邏輯。涉及到的知識點包括線程池技術、linux epoll... ...
  • 組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構。 組合模式使得用戶對單個對象和組合對象的使用具有一致性。 是一種結構型模式 使用場景: 1、用於對象的部分-整體層次結構,如樹形菜單、文件夾菜單、部門組織架構圖等; 2、對用戶隱藏組合對象與單個對象的不同,使得用戶統一地使用組合結構中的所 ...
  • 原文參考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485490&amp;idx=1&amp;sn=15197b4b53e0669e4a017e54a31fb39c&source=41#wechat_redirect 使用原生js ...
  • 本文介紹了windows系統下安裝`nvm nodejs`版本管理包。並且配置了阿裡巴巴的`nodejs`的鏡像和`npm`鏡像。並且,結合webstorm創建出了`nodejs express`項目,成功安裝依賴並運行起來。 ...
  • 微信小程式demo "github地址" 去年小程式剛發佈時特別火,趕潮流做了個demo。感覺小程式開發還是比較簡單的,主要是官方文檔寫得比較好,遺憾的是很多API需要微信認證才能使用。 由於小程式包大小限制在1M以內,所以商品圖片等資源放在了雲上,另外用Nodejs+Express寫了個簡單的AP ...
  • 1.元素浮動: 1)使用 float:left; 這樣的格式設置元素的浮動方式,屬性值可以是left,right; 2)元素設置為左浮動時,元素將從原區域浮動到瀏覽器的左側頁面;右浮動時,就會附在右側的區域,而且元素是按照第一個元素在右側的第一個位置,依次往左排列; 3)設置了浮動後,該元素相當於直 ...
  • HTML中有很多的標簽(元素),可以按照這些元素在網頁中所占的空間情況進行分類。具體可以這樣簡單的分類: 1.塊級元素:指的是在網頁中該元素獨自占據網頁的一行顯示區域,即當使用了該元素後,該元素會使下一個元素在下一行展示,也就是產生換行;根據資料的定義是:標簽的display屬性值為block; 2 ...
  • 上一篇介紹了模板引擎pug.js的用法,這一篇就主要寫後臺邏輯了。 後臺的大部分的功能都有了,只是在已經登錄的狀態下,前臺和後臺的邏輯處理還不是很完善。 先上幾張圖吧,仿舊版的簡書,改了下UI,因為沒有簡書那麼多內容,所以沒必要完全做成一樣的。 1.項目結構 app.js 是整個工程的入口 mode ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...