Sök…


parametrar

Parameter Beskrivning
typ String definierar namnet på händelsen att lyssna på.
lyssnare Function utlöses när händelsen inträffar.
alternativ Boolean att ställa in capture, om Object du kan ställa in följande egenskaper på det, märker du att objektalternativet stöds svagt.
1. fånga En boolean som indikerar att händelser av denna typ skickas till den registrerade lyssnaren innan de skickas till någon EventTarget under den i DOM-trädet.
2. en gång En boolesisk som indikerar att lyssnaren bör åberopas högst en gång efter att ha lagt till. Om det är sant, kommer lyssnaren att tas bort automatiskt när den åberopas.
3. passiv En boolean som indikerar att lyssnaren aldrig kommer att ringa preventDefault (). Om det gör det, bör användaragenten ignorera det och generera en konsolvarning.

Anmärkningar

Händelsernas ursprung

Händelser börjar inte med det du utlöser händelsen på.

Händelser börjar inte med det du utlöser händelsen på (till exempel en knapp).

Istället

Den berör varje element i sin väg och informerar varje element om att en händelse händer. Händelser går också upp igen när de når sin destination och informerar elementen igen om dess förekomst.

Fånga & bubbla

Som vi lärt oss börjar händelser från toppen av DOM-trädet, informerar varje nod i sin väg ner till sin destination, går sedan tillbaka upp när den når sin destination, informerar också varje element som den berör på sin väg upp om dess förekomst.

Händelser som går ner i DOM-trädet är i infångningsfasen , händelser som går upp på DOM-trädet är i den bubblande fasen .

Som standard lyssnar händelser på i den bubblande fasen. För att ändra detta kan du ange vilken fas händelsen lyssnar på genom att ange den tredje parametern i addEventListener-funktionen. (kodexempel i fångstsektionen )

Introduktion

Definition:

Vid beräkning är en händelse en handling eller händelse som erkänns av programvara som kan hanteras av programvaran. Datorhändelser kan genereras eller utlöses av systemet, av användaren eller på andra sätt. Definitionskälla

ange bildbeskrivning här

HTML-händelser är "saker" som händer med HTML-element. JavaScript kan "reagera" på dessa händelser. via Event Listeners . Dessutom kan anpassade händelser utlösas med dispatchEvent . Men detta är bara en introduktion, så låt oss komma igång!

Grundläggande händelse lyssnare

För att lyssna på händelser ringer du target.addEventListener(type, listener);

function loadImage() {
  console.log('image code here!');
}
var myButton = document.querySelector('#my-button');
myButton.addEventListener('click', loadImage);

Detta utlöser loadImage varje gång my-button klickar på my-button .

Event lyssnarna kan bifogas till valfri nod i DOM-trädet. för att se en fullständig lista över alla händelser som nativt utlöses i webbläsaren: gå hit MDN-länk för fullständig händelselista

Ta bort evenemangets lyssnare

Metoden removeEventListener () tar bort händelseshanterare som har bifogats med metoden addEventListener ():

element.removeEventListener("mousemove", myFunction);

Allt (händelsens namn, funktion och alternativ) i removeEventListener måste matcha den uppsättningen när du lägger till händelse lyssnaren till elementet.

. Bind med removeListener

om du använder .bind på funktionen när du lägger till en händelse lyssnare kommer det att förhindra att funktionen tas bort, för att faktiskt ta bort händelsenListener kan du skriva:

function onEvent() {
   console.log(this.name);
}

var bindingOnEvent = onEvent.bind(this);

document.addEventListener('click', bindingOnEvent);

...

document.removeEventListener('click', bindingOnEvent);

lyssna på en händelse bara en gång

Tills en once alternativet stöds i stort måste vi ta bort den jämna lyssnaren manuellt när händelsen utlöses för första gången.

Den här lilla hjälpen hjälper oss att uppnå detta:

Object.prototype.listenOnce = Object.prototype.listenOnce ||
  function listenOnce(eventName, eventHandler, options) {
      var target = this;
      target.addEventListener(eventName, function(e) {
          eventHandler(e);
          target.removeEventListener(eventName, eventHandler, options);
      }, options);
  }

var target = document.querySelector('#parent');
target.listenOnce("click", clickFunction, false);

* Det är inte en bra praxis att knyta funktioner till prototypen Objekt, därför kan du ta bort den första raden i den här koden och lägga till ett mål till den som en första parametern.

Väntar på att dokumentet laddas

En av de mest använda händelserna väntar på att dokumentet har laddats, inklusive både skriptfiler och bilder. loaddocument används för detta.

document.addEventListener('load', function() {
   console.log("Everything has now loaded!");
});

Ibland försöker du komma åt ett DOM-objekt innan det laddas, vilket orsakar nollpekare. Dessa är riktigt svåra att felsöka. För att undvika detta, använd document DOMContentLoaded händelse istället. DOMContentLoaded ser till att HTML-innehållet har laddats och initialiserats utan att vänta på andra externa resurser.

document.addEventListener('DOMContentLoaded', function() {
   console.log("The document contents are now available!");
});

Händelseobjekt

För att få åtkomst till händelseobjektet, inkludera en event i händelse lyssnarens återuppringningsfunktion:

var foo = document.getElementById("foo");
foo.addEventListener("click", onClick);

function onClick(event) {
  // the `event` parameter is the event object
  // e.g. `event.type` would be "click" in this case
};

e.stopPropagation ();

HTML:

<div id="parent">
   <div id="child"></div>
</div>

Javascript:

var parent = document.querySelector('#parent');
var child = document.querySelector('#child');

child.addEventListener('click', function(e) {
   e.stopPropagation();
   alert('child clicked!');
});

parent.addEventListener('click', function(e) {
   alert('parent clicked!');
});

Eftersom barnet stoppar händelseförökningen och händelserna lyssnas på under bubbelfasen kommer bara klickning på barnet att utlösa barnet. utan att stoppa spridningen kommer båda händelserna att utlösas.


e.preventDefault ();

event.preventDefault() stoppar standardåtgärden för ett element från att hända.

Till exempel:

  • Förhindra att en skicka-knapp skickar in ett formulär
  • Förhindra att en länk följer URL: en
var allAnchorTags = document.querySelector('a');

allAnchorTags.addEventListener('click', function(e){
    e.preventDefault();
    console.log('anchor tags are useless now! *evil laugh*');
});

e.target vs e.currentTarget

e.currentTarget Identifierar det aktuella målet för händelsen, eftersom händelsen går igenom DOM. Den hänvisar alltid till det element som händelseshanteraren har kopplats till i motsats till event.target som identifierar det element som händelsen inträffade på.

med andra ord

e.target returnerar det som utlöser händelseförmedlaren

e.currentTarget returnerar det du tilldelade din lyssnare till.

HTML:

<body>
   <button id="my-button"></button>
</body>

Javascript:

var body = document.body;
body.addEventListener( 'click', function(e) {
    console.log('e.target', e.target);
    console.log('e.currentTarget', e.currentTarget);
});

om du klickar på my-button ,

  • e.target är my-button
  • e.currentTarget kommer att vara body

Händelse bubblar och fångar

Händelser som avfyras på DOM-element påverkar inte bara elementet de riktar sig till. Någon av målets förfäder i DOM kan också ha en chans att reagera på händelsen. Tänk på följande dokument:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
  <p id="paragraph">
    <span id="text">Hello World</span>
  </p>
</body>
</html>

Om vi bara lägger till lyssnare till varje element utan några alternativ, utlöser du ett klick på spännvidden ...

document.body.addEventListener('click', function(event) {
  console.log("Body clicked!");
});
window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph clicked!");
});
window.text.addEventListener('click', function(event) {
  console.log("Text clicked!");
});

window.text.click();

... då kommer händelsen att bubbla upp genom varje förfader och utlösa varje klickhanterare på vägen:

Text clicked!
Paragraph clicked!
Body clicked!

Om du vill att en av dina hanterare ska stoppa händelsen från att utlösa fler hanterare kan den ringa event.stopPropagation() . Om vi till exempel ersätter vår andra händelseshanterare med detta:

window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph clicked, and that's it!");
  event.stopPropagation();
});

Vi skulle se följande utdata, med body är click handler aldrig utlöses:

Text clicked!
Paragraph clicked, and that's it!

Slutligen har vi möjligheten att lägga till händelse lyssnare som utlöser under " capture " istället för att bubbla. Innan en händelse bubblar upp från ett element genom sina förfäder, "fångas" det först ner till elementet genom dess förfäder. En fångar lyssnar läggs till genom att ange true eller {capture: true} som det tredje argumentet som tillval till addEventListener . Om vi lägger till följande lyssnare till vårt första exempel ovan:

document.body.addEventListener('click', function(event) {
  console.log("Body click captured!");
}, true);
window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph click captured!");
}, true);
window.text.addEventListener('click', function(event) {
  console.log("Text click captured!");
}, true);

Vi får följande utgång:

Body click captured!
Paragraph click captured!
Text click captured!
Text clicked!
Paragraph clicked!
Body clicked!

Som standard lyssnar händelser på i den bubblande fasen. För att ändra detta kan du ange vilken fas händelsen lyssnar på genom att ange den tredje parametern i addEventListener-funktionen. (För att lära dig att fånga och bubbla, kolla kommentarer )

element.addEventListener(eventName, eventHandler, useCapture)

useCapture: true betyder att lyssna på händelsen när det går ner i DOM-trädet. false betyder att lyssna på händelsen medan den går upp i DOM-trädet.

window.addEventListener("click", function(){alert('1: on bubble')}, false);
window.addEventListener("click", function(){alert('2: on capture')}, true);

Varningslådorna dyker upp i denna ordning:

  • 2: vid fångst
  • 1: på bubbla

Ärenden i verklig värld

Capture Event kommer att skickas före Bubble Event, därför kan du se till att en händelse lyssnas på först om du lyssnar på den i dess fångningsfas.

om du lyssnar på en klickhändelse på ett förälderelement och ett annat på dess barn kan du lyssna på barnet först eller föräldern först, beroende på hur du ändrar parametern useCapture.

i bubblande, barnhändelse kallas först, i fångst, förälder först

i bubblande, barnhändelse kallas först, i fångst, förälder först

HTML:

<div id="parent">
   <div id="child"></div>
</div>

Javascript:

child.addEventListener('click', function(e) {
   alert('child clicked!');
});

parent.addEventListener('click', function(e) {
   alert('parent clicked!');
}, true);

Att ställa in riktigt för förälderhändelsenListener utlöser först föräldrarens lyssnare.

I kombination med e.stopPropagation () kan du förhindra att händelsen utlöser lyssnaren till barnhändelsen / eller föräldern. (mer om det i nästa exempel)

Delegation av evenemang

Arrangemangsdelegering är en process som gör att vi kan undvika att lägga till händelselister till specifika noder; istället läggs händelse lyssnaren till föräldernoden. Denna mekanism använder händelseförökningen / bubblan för att hantera en händelse vid en högre nivåelement / nod i DOM istället för att använda elementet på vilket händelsen har sitt ursprung. Tänk till exempel att vi måste lägga till händelser för följande listelement:

<ul id="container">
    <li id="item-1" class="new">Item 1</li>
    <li id="item-2">Item 2</li>
    <li id="item-3">Item 3</li>
</ul>

Vi behöver lägga till click hanterare och i princip kan vi lägga lyssnare till varje element med hjälp av en slinga, men föreställa sig att vi vill lägga till element dynamiskt. Så vi registrerar alla händelseshanterare när DOM laddas och efter att DOM initierar och registrerar alla händelseshanterare för varje element kommer det nyinförda elementet i UL ovan inte att svara på klick eftersom det elementet inte fanns i DOM när vi har registrerat klickhändelserna.

Så för att övervinna detta problem kan vi utnyttja delegationen av evenemanget. Vilket innebär att vi istället för att registrera lyssnarna till varje li element själva, kan vi binda händelsets lyssnare till det överordnade UL elementet till exempel:

document.getElementById("container").addEventListener("click", function(e) {
    console.log("List item " e.target.id, " was clicked!");
});

Eftersom händelsen förökas (bubblar uppåt) som standard, klickar du på något LI element kommer UL elementet att avfyra samma händelse också. I det här fallet kan vi använda e parametern i funktionen, som faktiskt är händelseobjektet och det innehåller användbar information om händelsen inklusive det ursprungliga elementet, som initierade händelsen. Så vi kan till exempel använda något av följande:

document.getElementById("container").addEventListener("click", function(e) {

    // If UL itself then no action is require
    if(e.target.nodeName == 'UL') return false;

    if(e.target.classList.contains('new')) {
        console.log("List item " e.target.id, " was clicked and it's new!");
    }
});

Så det är uppenbart att e (Event Object) tillåter oss att undersöka källelementet (e.target) och vi kan enkelt injicera nya element till UL efter att DOM har laddats och den enda delegerade händelseshanteraren hanterar alla klickhändelser inom moder- UL som också är mindre minneskrävande eftersom vi bara förklarade en funktion för alla element.

Aktivera anpassade händelser

CustomEvent API tillåter utvecklare att skapa anpassade händelser och utlösa dem på DOM-noder och skicka data längs vägen.

event = new CustomEvent(typeArg, customEventInit);

typArg - DOMString som representerar namnet på händelsen.

customEventInit - är valfria parametrar (som kommer att skickas som e i följande exempel).

Du kan bifoga eventListeners till document eller något HTML-element.

När en anpassad händelse har lagts till och bundits till element (eller dokument) kanske man vill avfyra den manuellt från javascript.

document.addEventListener("event-name", function(e) {
  console.log(e.detail); // logs custom object passed from the event.
});

var event = new CustomEvent("event-name", { "param-name": "param-value" });
document.dispatchEvent(event);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow