2011-04-14 12 views

Respuesta

10

Según MDC, el tercer parámetro es:

useCapture
Si true, useCapture indica que el usuario desea iniciar captura. Después de iniciar la captura , todos los acontecimientos de la especificada tipo serán enviados a la registrada listener antes de ser enviado a cualquier EventTarget s por debajo en el árbol DOM. Los eventos que son burbujeando hacia arriba a través del árbol no dispararán un oyente designado a captura de uso. Ver DOM Level 3 Events para una explicación detallada.

+11

No sé tanto sobre JavaScript, así que estoy teniendo problemas para obtener esta respuesta. En realidad, no sé qué es useCapture? ¿Podrías decirme algo al respecto? –

+1

@BikashChandraMondal echa un vistazo a la respuesta a continuación. – libra

+9

Por favor explique, no solo copie/pegue. –

-6

Determina si se captura el evento.

Más información here

178

he comprobado MDN también, pero todavía no entendía lo que el useCapture era para, por lo que esta respuesta es para los que todavía no lo consigue después de haber comprobado la documentación oficial.

Así que en primer lugar, ocurre lo siguiente en casi todos los navegadores:

En todos los navegadores, excepto IE < 9, hay dos etapas de procesamiento de eventos.

El evento va primero hacia abajo - que se llama captura, y luego burbujas hasta. Este comportamiento está estandarizado en la especificación W3C.

lo que significa que independientemente de lo que establezca el useCapture, estas dos fases de evento siempre existen.

Esta imagen muestra cómo funciona.

enter image description here

Según este modelo, el evento:

Captura abajo - a través de 1 -> 2 -> 3.

Bubbles arriba - a través de 3 -> 2 -> 1

Luego viene su pregunta. El 3er parámetro llamado useCapture indica en cuál de las dos fases desea que su manejador maneje el evento.

useCapture = true

El controlador se encuentra en la fase de captura. Los eventos llegarán antes de llegar a sus hijos.

useCapture = false.

El controlador está configurado en la fase de burbujeo. Los eventos llegarán después de llegar a sus hijos.

lo que significa que si se escribe código como este:

child.addEventListener("click", second); 
parent.addEventListener("click", first, true); 

al hacer clic elemento secundario, first método será llamado antes second.

Por defecto, la bandera useCapture se establece en falsa que significa controlador sólo se llamará durante el evento burbujeante fase.

Para obtener información detallada, click this reference link y this.

+7

Muy buena y completa respuesta. Lo entiendo mucho mejor que ahora. – 0x499602D2

+10

Muy buena explicación. El toque humano, eso es lo que hace la diferencia. –

+1

Realmente aprecio esta explicación. – neilsimp1

1

@ La respuesta de Libra es muy buena, simplemente hay algunas personas como yo que entienden mejor la interacción del código con la máquina.
Así que la siguiente secuencia de comandos debería estar explicando la propagación del evento. Lo que estoy tratando de hacer sobre la base de este description schema es:
Siguiendo evento fluya hacia abajo y hasta la siguiente jerarquía:

<window> 
<document> 
<body> 
<section> 
<div> 
<paragraph> 
<span> 

En aras de la simplicidad vamos a empezar en el cuerpo hasta el elemento span registro manipuladores para la fase de captura y retroceden hasta el elemento del cuerpo que registra los manejadores para la fase de burbujeo. Entonces, el resultado sería nodo por nodo la dirección tomada por el evento desde el principio hasta el final. Por favor, haga clic en "Mostrar consola" en el panel derecho del fragmento a acceder a los registros

function handler(e){ 
 
     /* logs messages of each phase of the event flow associated with 
 
     the actual node where the flow was passing by */ 
 

 
     if (e.eventPhase == Event.CAPTURING_PHASE){ 
 
      console.log ("capturing phase :\n actual node : "+this.nodeName); 
 
     } 
 
     if (e.eventPhase == Event.AT_TARGET){ 
 
      console.log("at target phase :\n actual node : "+this.nodeName); 
 
     } 
 
     if (e.eventPhase == Event.BUBBLING_PHASE){ 
 
      console.log ("bubbling phase :\n actual node : "+this.nodeName); 
 
     } 
 
    } 
 

 
    /* The following array contains the elements between the target (span and you can 
 
    click also on the paragraph) and its ancestors up to the BODY element, it can still 
 
    go up to the "document" then the "window" element, for the sake of simplicity it is 
 
    chosen to stop here at the body element 
 
    */ 
 

 
    arr=[document.body,document.getElementById("sectionID"), 
 
    document.getElementById("DivId"),document.getElementById("PId"), 
 
     document.getElementById("spanId")]; 
 

 
    /* Then trying to register handelers for both capturing and bubbling phases 
 
    */ 
 
     function listener(node){ 
 
      node.addEventListener(ev, handler, bool)  
 
      /* ev :event (click), handler : logging the event associated with 
 
      the target, bool: capturing/bubbling phase */ 
 
     } 
 
     ev="click"; 
 
     bool=true; // Capturing phase 
 
     arr.forEach(listener); 
 
     bool=false; // Bubbling phase 
 
     /* Notice that both capturing and bubbling 
 
     include the at_target phase, that's why you'll get two `at_target` phases in 
 
     the log */ 
 
     arr.forEach(listener);
 p { 
 
      background: gray; 
 
      color:white; 
 
      padding: 10px; 
 
      margin: 5px; 
 
      border: thin solid black 
 
     } 
 
     span { 
 
      background: white; 
 
      color: black; 
 
      padding: 2px; 
 
      cursor: default; 
 
     }
<section ID="sectionID"> 
 
      <div id="DivId"> 
 
       <p id="PId"> 
 
       Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis <span id="spanId">CLICK ME </span> imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq. 
 
       </p> 
 
      </div> 
 
    </section>

Aviso que los eventos tales como el enfoque no burbujean, lo que hace que todavía sens mayoría de los eventos hacer burbujas.

Cuestiones relacionadas