webApi(二)事件高級(jí)

事件高級(jí)

1 綁定和解綁事件

1.1 綁定事件

給元素添加事件,稱為注冊(cè)事件或者綁定事件抄课。注冊(cè)事件有兩種方式:傳統(tǒng)方式和方法監(jiān)聽(tīng)注冊(cè)方式

(1)傳統(tǒng)注冊(cè)方式: 利用 on 開(kāi)頭的事件 onclick
特點(diǎn):注冊(cè)事件唯一性窑睁,同一個(gè)元素同一個(gè)事件只能設(shè)置一個(gè)處理函數(shù)跺讯,最后注冊(cè)的處理函數(shù)將會(huì)覆蓋前面注冊(cè)的處理函數(shù)
(2)addEventListener 方法監(jiān)聽(tīng)注冊(cè)方式: addEventListener() 方法
特點(diǎn):同一個(gè)元素同一個(gè)事件可以注冊(cè)多個(gè)監(jiān)聽(tīng)器按注冊(cè)順序依次執(zhí)行

方法和參數(shù)

eventTarget.addEventListener(type, listener, useCapture)漩绵;

  • type:事件類型字符串拴泌,比如 click 魏身、mouseover 蚪腐,注意這里不要帶 on
  • listener:事件處理函數(shù),事件發(fā)生時(shí),會(huì)調(diào)用該監(jiān)聽(tīng)函數(shù)
  • useCapture:可選參數(shù),是一個(gè)布爾值,默認(rèn)是 false。
btn.addEventListener('click', function() {
    alert('hello world');
});

1.2 解綁事件

傳統(tǒng)的監(jiān)聽(tīng)解綁用eventTarget.onclick = null;, 方法監(jiān)聽(tīng)注冊(cè)方式用removeEventListener

eventTarget.removeEventListener(type, listener, useCapture)

<body>
    <div>點(diǎn)我</div>
    <div>點(diǎn)我</div>

    <script>
        var divList = document.getElementsByTagName('div');
        divList[0].onclick = function() {
            alert(111);
            this.onclick = null;
        }

        divList[1].addEventListener('click', fun);
        function fun() {
            alert(222);
            this.removeEventListener('click', fun);
        }
    </script>
</body>

1.3 DOM 事件流

事件發(fā)生時(shí)會(huì)在元素節(jié)點(diǎn)之間按照特定的順序傳播醇坝,這個(gè)傳播過(guò)程即 DOM 事件流。

比如我們給一個(gè)div 注冊(cè)了點(diǎn)擊事件,DOM 事件流分為3個(gè)階段:

  • 捕獲階段: 由 DOM 最頂層節(jié)點(diǎn)開(kāi)始,然后逐級(jí)向下傳播到到最具體的元素接收的過(guò)程
  • 當(dāng)前目標(biāo)階段
  • 冒泡階段 : 事件開(kāi)始時(shí)由最具體的元素接收壶唤,然后逐級(jí)向上傳播到到 DOM 最頂層節(jié)點(diǎn)的過(guò)程
在這里插入圖片描述

注意:

  • JS 代碼中只能執(zhí)行捕獲或者冒泡其中的一個(gè)階段
  • onclick 和 attachEvent 只能得到冒泡階段
  • addEventListener第三個(gè)參數(shù)如果是 true,表示在事件捕獲階段。用事件處理程序批幌;如果是 false(不寫默認(rèn)就是false)荧缘,表示在事件冒泡階段調(diào)用事件處理程序
  • 實(shí)際開(kāi)發(fā)中我們很少使用事件捕獲,我們更關(guān)注事件冒泡
  • 有些事件是沒(méi)有冒泡的拦宣,比如 onblur截粗、onfocus、onmouseenter鸵隧、onmouseleave
  • 事件冒泡有時(shí)候會(huì)帶來(lái)麻煩绸罗,有時(shí)候又會(huì)幫助很巧妙的做某些事件

下面是先son后father, 因?yàn)槭敲芭莸?/p>

<body>
    <div class="father">
        <div class="son"></div>
    </div>

    <script>
        var son = document.querySelector('.son');
        var parent = son.parentElement;
        son.addEventListener('click', function() {
            alert('son');
        });

        parent.addEventListener('click', function() {
            alert('father');
        });
    </script>
</body>

是先f(wàn)ather后son, 因?yàn)槭敲芭莸?/p>

<body>
    <div class="father">
        <div class="son"></div>
    </div>

    <script>
        var son = document.querySelector('.son');
        var parent = son.parentElement;
        son.addEventListener('click', function() {
            alert('son');
        }, true);

        parent.addEventListener('click', function() {
            alert('father');
        }, true);
    </script>
</body>

2 事件對(duì)象

2.1 什么是事件對(duì)象

代碼里的event 就是事件對(duì)象,我們還喜歡的寫成 e 或者 evt

        div.onclick = function(event) {
            console.log(event);
        }
        div.addEventListener('click', function(event) {
            console.log(event);
        })

event 對(duì)象代表事件的狀態(tài)豆瘫,比如鍵盤按鍵的狀態(tài)珊蟀、鼠標(biāo)的位置、鼠標(biāo)按鈕的狀態(tài)

事件對(duì)象有兼容性問(wèn)題外驱,ie678通過(guò)windows.event, 兼容性寫法:e = event || windows.event

2.2 事件對(duì)象的常見(jiàn)屬性和方法

在這里插入圖片描述

例如育灸,阻止鏈接跳轉(zhuǎn)

      // 阻止默認(rèn)行為腻窒,讓鏈接不跳轉(zhuǎn),或讓提交按鈕不提交
        var a = document.querySelector('a');
        a.addEventListener('click', function(e) {
            // 阻止跳轉(zhuǎn)行為
            e.preventDefault();
        })

阻止鏈接冒泡
e.stopPropagation()

2.3 事件委托(代理磅崭、委派)

原理:不是每個(gè)子節(jié)點(diǎn)單獨(dú)設(shè)置事件監(jiān)聽(tīng)器儿子,而是事件監(jiān)聽(tīng)器設(shè)置在其父節(jié)點(diǎn)上,然后利用冒泡原理影響設(shè)置每個(gè)子節(jié)點(diǎn)

    <ul>
        <li>知否知否砸喻,應(yīng)是綠肥紅瘦</li>
        <li>知否知否柔逼,應(yīng)是綠肥紅瘦</li>
        <li>知否知否,應(yīng)是綠肥紅瘦</li>
        <li>知否知否割岛,應(yīng)是綠肥紅瘦</li>
        <li>知否知否卒落,應(yīng)是綠肥紅瘦</li>
    </ul>

如果要點(diǎn)擊每個(gè) li 都會(huì)彈出對(duì)話框,以前需要給每個(gè) li 注冊(cè)事件蜂桶,是非常辛苦的儡毕,而且訪問(wèn) DOM 的次數(shù)越多,這就會(huì)延長(zhǎng)整個(gè)頁(yè)面的交互就緒時(shí)間扑媚。利用事件委托可以給 ul 注冊(cè)點(diǎn)擊事件腰湾,然后利用事件對(duì)象的 target 來(lái)找到當(dāng)前點(diǎn)擊的 li,因?yàn)辄c(diǎn)擊 li疆股,事件會(huì)冒泡到 ul 上费坊,ul 有注冊(cè)事件,就會(huì)觸發(fā)事件監(jiān)聽(tīng)器

    <script>
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            alert('知否知否旬痹,應(yīng)是綠肥紅瘦');
            e.target.style.backgroundColor = 'pink';
        })
    </script>

2.4 常用的鼠標(biāo)事件

2.4.1 基礎(chǔ)鼠標(biāo)事件
在這里插入圖片描述
2.4.2 禁止鼠標(biāo)選中文字和右鍵菜單
    <script>
        // 禁用右鍵菜單
        document.addEventListener('contextmenu', function(e) {
            e.preventDefault();
        });
        document.addEventListener('selectstart', function(e) {
            e.preventDefault();
        });
    </script>
2.4.3 鼠標(biāo)事件對(duì)象

event對(duì)象代表事件的狀態(tài)附井,跟事件相關(guān)的一系列信息的集合。現(xiàn)階段主要是用鼠標(biāo)事件對(duì)象PointerEvent 和鍵盤事件對(duì)象 KeyboardEvent两残。

2.4.3.1 e.target和this區(qū)別

e.target返回的是觸發(fā)事件的對(duì)象永毅, this返回的是綁定事件對(duì)象

    <script>
        // e.target返回的是觸發(fā)事件的對(duì)象, this返回的是綁定事件對(duì)象
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            console.log(e.target);   // li
            console.log(this);    // ul
        })
    </script>
2.4.3.2 鼠標(biāo)事件對(duì)象屬性
在這里插入圖片描述
2.4.3.3 跟隨鼠標(biāo)的天使
    <style>
        img {
            position: absolute;
        }
    </style>
<body>
    <img src="images/angel.gif">

    <script>
        var img = document.querySelector('img');
        document.addEventListener('mousemove', function(e) {
            var x = e.pageX;
            var y = e.pageY;
            img.style.left = x - 50 + 'px';
            img.style.top = y - 40 + 'px';
        })
    </script>
</body>

2.5 常用的鍵盤事件

2.5.1 常用的鍵盤事件
  • keyup : 某個(gè)鍵盤彈起時(shí)
  • keydown: 某個(gè)鍵盤按下時(shí)
  • keypress: 非功能鍵按下時(shí)

三個(gè)鍵盤事件執(zhí)行順序是:keydown -- keypress --- keyup

<body>
    <script>
        document.addEventListener('keyup', function() {
            console.log('鍵盤彈起');
        });
        document.addEventListener('keydown', function() {
            console.log('鍵盤按下');
        });
        document.addEventListener('keypress', function() {
            console.log('非功能鍵按下');
        });
    </script> 
</body>
2.5.2 鍵盤事件對(duì)象

keyCode: 返回該鍵的ascall值

  • keyup和keydown的keyCode不區(qū)分大小寫人弓,'a'和'A'都是65
  • keypress的keyCode區(qū)分大小寫沼死,'a'是65, 'A'是97
  • 在我們實(shí)際開(kāi)發(fā)中,我們更多的使用keydown和keyup崔赌, 它能識(shí)別所有的鍵(包括功能鍵)
2.5.3 模擬京東按鍵輸入內(nèi)容

當(dāng)按下 s 鍵意蛀, 光標(biāo)就定位到搜索框

<body>
    <div class="search">
        <input placeholder="打印機(jī)">
        <button>搜索</button>
    </div>

    <script>
        var input = document.querySelector('input');
        document.addEventListener('keyup', function(e) {
            if(e.keyCode === 83) {
                input.focus();
            }
        })
    </script>
</body>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市健芭,隨后出現(xiàn)的幾起案子县钥,更是在濱河造成了極大的恐慌,老刑警劉巖慈迈,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件若贮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)兜看,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門锥咸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人细移,你說(shuō)我怎么就攤上這事搏予。” “怎么了弧轧?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵雪侥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我精绎,道長(zhǎng)速缨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任代乃,我火速辦了婚禮旬牲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搁吓。我一直安慰自己原茅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布堕仔。 她就那樣靜靜地躺著擂橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摩骨。 梳的紋絲不亂的頭發(fā)上通贞,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音恼五,去河邊找鬼昌罩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唤冈,可吹牛的內(nèi)容都是我干的峡迷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼你虹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彤避?” 一聲冷哼從身側(cè)響起傅物,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琉预,沒(méi)想到半個(gè)月后董饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年卒暂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啄栓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡也祠,死狀恐怖昙楚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诈嘿,我是刑警寧澤堪旧,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站奖亚,受9級(jí)特大地震影響淳梦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昔字,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一爆袍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧作郭,春花似錦螃宙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芹助,卻和暖如春堂湖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背状土。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工无蜂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒙谓。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓斥季,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親累驮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酣倾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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