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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...