Heim > Web-Frontend > js-Tutorial > Hauptteil

Was sind JavaScript-Event-Stream-Events? (einführen)

青灯夜游
Freigeben: 2018-09-17 17:11:40
Original
2052 Leute haben es durchsucht

In diesem Kapitel erfahren Sie, was JavaScript-Event-Stream-Events sind. (Einführung), damit jeder verstehen kann, was JavaScript-Ereignisse und Ereignisströme sind. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

1. JavaScript-Ereignisse

Ereignisse sind bestimmte Interaktionsmomente, die in einem Dokument oder Browserfenster auftreten.

Ein Ereignis ist eine bestimmte Aktion, die vom Benutzer oder vom Browser selbst ausgeführt wird, z. B. Klicken, Laden und Mouseover sind die Namen von Ereignissen.

Ereignisse sind die Brücke zwischen JavaScript und DOM.

Wenn Sie es auslösen, werde ich es ausführen – wenn das Ereignis eintritt, wird seine Handler-Funktion aufgerufen, um den entsprechenden JavaScript-Code auszuführen und eine Antwort zu geben.

Typische Beispiele sind: Das Ladeereignis wird ausgelöst, wenn die Seite geladen wird; das Klickereignis wird ausgelöst, wenn der Benutzer auf ein Element klickt.

2. Ereignisfluss

Der Ereignisfluss beschreibt die Reihenfolge, in der Ereignisse von der Seite empfangen werden.

1. Ereignisbewusstsein

Frage: Welche Art von Element kann ein solches Ereignis erkennen, wenn Sie auf ein Seitenelement klicken?

Antwort: Wenn Sie auf ein Element klicken, klicken Sie auch auf das Containerelement des Elements oder sogar auf die gesamte Seite.

Beispiel: Es gibt drei konzentrische Kreise. Fügen Sie jedem Kreis die entsprechende Ereignisverarbeitungsfunktion hinzu und zeigen Sie den entsprechenden Text an. Wenn Sie auf den innersten Kreis klicken, klicken Sie auch auf den äußeren Kreis, sodass auch das Klickereignis des äußeren Kreises ausgelöst wird.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<style>
    #outer{
        position: absolute;
        width: 400px;
        height: 400px;
        top:0;
        left: 0;
        bottom:0;
        right: 0;
        margin: auto;
        background-color: deeppink;
    }
    #middle{
        position: absolute;
        width: 300px;
        height:300px;
        top:50%;
        left: 50%;
        margin-left: -150px;
        margin-top: -150px;
        background-color: deepskyblue;
    }
    #inner{
        position: absolute;
        width: 100px;
        height:100px;
        top:50%;
        left:50%;
        margin-left: -50px;
        margin-top: -50px;;
        background-color: darkgreen;
        text-align: center;
        line-height: 100px;
        color:white;
    }
    #outer,#middle,#inner{
border-radius:100%;
    }
</style>
<body>
<div id="outer">
   <div id="middle">
        <div id="inner">
            click me!
        </div>
    </div>
</div>
<script>
       var innerCircle= document.getElementById("inner");
        innerCircle.onclick= function () {
            alert("innerCircle");
        };
        var middleCircle= document.getElementById("middle");
        middleCircle.onclick=function(){
            alert("middleCircle");
        }
        var outerCircle= document.getElementById("outer");
        outerCircle.onclick= function () {
            alert("outerCircle");
        }
</script>
</body>
</html>
Nach dem Login kopieren

Rendering:

Was sind JavaScript-Event-Stream-Events? (einführen)

Was sind JavaScript-Event-Stream-Events? (einführen) Was sind JavaScript-Event-Stream-Events? (einführen)

2. Ereignisfluss

Wenn ein Ereignis auftritt, wird es in einer bestimmten Reihenfolge zwischen dem Elementknoten und dem Stammknoten weitergegeben. Dieser Ausbreitungsprozess ist der DOM-Ereignisstrom.

1) Zwei Ereignisflussmodelle

Die Reihenfolge der Ereignisausbreitung entspricht den beiden Ereignisflussmodellen des Browsers: erfassender Ereignisfluss und sprudelnder Ereignisfluss.

  • Blasenereignisfluss: Die Ausbreitung von Ereignissen erfolgt vom spezifischsten Ereignisziel zum am wenigsten spezifischen Ereignisziel. Das heißt, von den Blättern des DOM-Baums bis zur Wurzel. [Empfohlen]

  • Ereignisfluss erfassen: Die Weitergabe von Ereignissen erfolgt vom am wenigsten spezifischen Ereignisziel zum spezifischsten Ereignisziel. Das heißt, von der Wurzel des DOM-Baums bis zu den Blättern.

Die Idee der Ereigniserfassung besteht darin, dass weniger spezifische Knoten Ereignisse früher empfangen sollten und die spezifischsten Knoten Ereignisse zuletzt empfangen sollten.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="myDiv">Click me!</div>
</body>
</html>
Nach dem Login kopieren

Im obigen HTML-Code wird auf das

-Element auf der Seite geklickt.

Im sprudelnden Ereignisstrom lautet die Klickereignis-Weitergabesequenz

-》 < ;body> – 》 – 》document

Im Erfassungsereignisstrom ist die Reihenfolge der Weitergabe von Klickereignissen document – ​​》 – 》 – 》

Hinweis:

  • Alle modernen Browser unterstützen Event-Bubbling, es gibt jedoch geringfügige Unterschiede in der spezifischen Implementierung:

    IE5 In .5 und früheren Versionen überspringt das Event-Bubbling das -Element (springt direkt vom Text zum Dokument).

    IE9, Firefox, Chrome und Safari blasen das Ereignis bis zum Fensterobjekt.

  • 2), IE9, Firefox, Chrome, Opera und Safari unterstützen alle die Ereigniserfassung. Obwohl der DOM-Standard erfordert, dass Ereignisse vom Dokumentobjekt weitergegeben werden, erfassen diese Browser Ereignisse vom Fensterobjekt.

  • 3). Da alte Browserversionen dies nicht unterstützen, nutzen nur wenige Menschen die Ereigniserfassung. Es wird empfohlen, Event-Bubbling zu verwenden.

2) DOM-Ereignisfluss

Der DOM-Standard übernimmt Capture + Bubbling. Beide Ereignisströme lösen alle Objekte im DOM aus, beginnend mit und endend mit dem Dokumentobjekt.

Was sind JavaScript-Event-Stream-Events? (einführen)

Der DOM-Standard schreibt vor, dass der Ereignisfluss drei Phasen umfasst: die Ereigniserfassungsphase, die Zielphase und die Ereignisblasenphase.

  • Ereigniserfassungsphase: Das eigentliche Ziel (

    ) empfängt während der Erfassungsphase keine Ereignisse. Das heißt, während der Erfassungsphase stoppt das Ereignis vom Dokument zum . Im Bild oben ist es 1~3.

  • befindet sich in der Zielphase: Ereignisse treten auf und werden auf

    verarbeitet. Die Ereignisbehandlung wird jedoch als Teil der Bubbling-Phase betrachtet.

  • Bubbling-Phase: Das Ereignis breitet sich zurück auf das Dokument aus.

Hinweis:

  • 尽管“DOM2级事件”标准规范明确规定事件捕获阶段不会涉及事件目标,但是在IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两次机会在目标对象上面操作事件

  • 并非所有的事件都会经过冒泡阶段 。所有的事件都要经过捕获阶段和处于目标阶段,但是有些事件会跳过冒泡阶段:如,获得输入焦点的focus事件和失去输入焦点的blur事件。

两次机会在目标对象上面操作事件例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<style>
    #outer{
        position: absolute;
        width: 400px;
        height: 400px;
        top:0;
        left: 0;
        bottom:0;
        right: 0;
        margin: auto;
        background-color: deeppink;
    }
    #middle{
        position: absolute;
        width: 300px;
        height:300px;
        top:50%;
        left: 50%;
        margin-left: -150px;
        margin-top: -150px;
        background-color: deepskyblue;
    }
    #inner{
        position: absolute;
        width: 100px;
        height:100px;
        top:50%;
        left:50%;
        margin-left: -50px;
        margin-top: -50px;;
        background-color: darkgreen;
        text-align: center;
        line-height: 100px;
        color:white;
    }
    #outer,#middle,#inner{
        border-radius:100%;
    }
</style>
<body>
<div id="outer">
    <div id="middle">
        <div id="inner">
            click me!
        </div>
    </div>
</div>
<script>
    var innerCircle= document.getElementById("inner");
    innerCircle.addEventListener("click", function () {
        alert("innerCircle的click事件在捕获阶段被触发");
    },true);
    innerCircle.addEventListener("click", function () {
        alert("innerCircle的click事件在冒泡阶段被触发");
    },false);
    var middleCircle= document.getElementById("middle");
    middleCircle.addEventListener("click", function () {
        alert("middleCircle的click事件在捕获阶段被触发");
    },true);
    middleCircle.addEventListener("click", function () {
        alert("middleCircle的click事件在冒泡阶段被触发");
    },false);
    var outerCircle= document.getElementById("outer");
    outerCircle.addEventListener("click", function () {
        alert("outerCircle的click事件在捕获阶段被触发");
    },true);
    outerCircle.addEventListener("click", function () {
        alert("outerCircle的click事件在冒泡阶段被触发");
    },false);
</script>
</body>
</html>
Nach dem Login kopieren

运行效果就是会陆续弹出6个框,为说明原理我整合成了一个图:

Was sind JavaScript-Event-Stream-Events? (einführen)

3、事件流的典型应用事件代理

传统的事件处理中,需要为每个元素添加事件处理器。js事件代理则是一种简单有效的技巧,通过它可以把事件处理器添加到一个父级元素上,从而避免把事件处理器添加到多个子级元素上。

1)事件代理

事件代理的原理用到的就是事件冒泡和目标元素,把事件处理器添加到父元素,等待子元素事件冒泡,并且父元素能够通过target(IE为srcElement)判断是哪个子元素,从而做相应处理。关于target更多内容请参考javaScript事件(四)event的公共成员(属性和方法) 下面举例来说明。

传统事件处理,为每个元素添加事件处理器,代码如下:

<body>
<ul id="color-list">
<li>red</li>
<li>orange</li>
<li>yellow</li>
<li>green</li>
<li>blue</li>
<li>indigo</li>
<li>purple</li>
</ul>
<script>
(function(){
    var colorList=document.getElementById("color-list");
    var colors=colorList.getElementsByTagName("li");
    for(var i=0;i<colors.length;i++)
    {
        colors[i].addEventListener(&#39;click&#39;,showColor,false);
    };
    function showColor(e)
    {
        e=e||window.event;
        var targetElement=e.target||e.srcElement;
        alert(targetElement.innerHTML);
    }
})();
</script>
</body>
Nach dem Login kopieren

事件代理的处理方式,代码如下:

<body>
<ul id="color-list">
<li>red</li>
<li>orange</li>
<li>yellow</li>
<li>green</li>
<li>blue</li>
<li>indigo</li>
<li>purple</li>
</ul>
<script>
(function(){
    var colorList=document.getElementById("color-list");
    colorList.addEventListener(&#39;click&#39;,showColor,false);
    function showColor(e)
    {
        e=e||window.event;
        var targetElement=e.target||e.srcElement;
        if(targetElement.nodeName.toLowerCase()==="li"){
        alert(targetElement.innerHTML);
        }
    }
})();
</script>
</body>
Nach dem Login kopieren

2)事件代理的好处

总结一下事件代理的好处:

  • 将多个事件处理器减少到一个,因为事件处理器要驻留内存,这样就提高了性能。想象如果有一个100行的表格,对比传统的为每个单元格绑定事件处理器的方式和事件代理(即table上添加一个事件处理器),不难得出结论,事件代理确实避免了一些潜在的风险,提高了性能。

  • DOM更新无需重新绑定事件处理器,因为事件代理对不同子元素可采用不同处理方法。如果新增其他子元素(a,span,div等),直接修改事件代理的事件处理函数即可,不需要重新绑定处理器,不需要再次循环遍历。

3)事件代理的问题:【update20170502】

代码如下:事件代理同时绑定了li和span,当点击span的时候,li和span都会冒泡。

<li><span>li中的span的内容</span></li>

<script>
    $(document).on(&#39;click&#39;, &#39;li&#39;, function(e){
        alert(&#39;li li&#39;);
    });

    $(document).on(&#39;click&#39;, &#39;span&#39;, function(e){
        alert(&#39;li span&#39;);
    })
</script>
Nach dem Login kopieren

解决办法:

方法一:span的事件处理程序中阻止冒泡

$(document).on(&#39;click&#39;, &#39;span&#39;, function(e){
        alert(&#39;li span&#39;);
        e.stopPropagation();
    })
Nach dem Login kopieren

方法二:li的事件处理程序中检测target元素

$(document).on(&#39;click&#39;, &#39;li&#39;, function (e) {
        if (e.target.nodeName == &#39;SPAN&#39;) {
            e.stopPropagation();
            return;
        }
        alert(&#39;li li&#39;);
    });
Nach dem Login kopieren

4)事件代理的一个有趣应用【update20170502】

点击一个列表时,输出对应的索引

<script>
    var ul=document.querySelector(&#39;ul&#39;);
    var lis=ul.querySelectorAll(&#39;ul li&#39;);
    ul.addEventListener(&#39;click&#39;, function (e) {
        var target= e.target;
        if(target.nodeName.toUpperCase()===&#39;LI&#39;){
            alert([].indexOf.call(lis,target));
        }
    },false)
</script>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWas sind JavaScript-Event-Stream-Events? (einführen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage