15

¿Es posible emular event capturing en Internet Explorer?Emular modelo de captura de eventos W3C en IE

Un ejemplo:

 
<a>one</a> 
<a>two</a> 
<a>three3</a> 

<script> 
var links = document.getElementsByTagName("A"); 
for (var i=0; i < links.length; i++) { 
    links[i].onclick = function(){ 
    alert("clicked"); 
    }; 
} 
</script>

Quiero evitar que todos estos eventos de clic de disparo. Puedo hacer eso con un único observador de eventos:

document.addEventListener("click", function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
}, true);

¿Cómo puedo hacer lo mismo en IE? IE < 9 no es compatible con addEventListener. Es compatible con attachEvent, pero no tiene la opción useCapture.

He encontrado setCapture method, pero no parece relacionado con el modelo de captura W3.

Respuesta

5

Generalmente no se puede debido al event order. En IE, los eventos comenzarán a burbujear desde el elemento objetivo sin la fase de captura, por lo que no podrás capturarlos de antemano.

Sólo hay una cosa que puede hacer, y es única posible si se logran todo los controladores de eventos.

  1. Escribe un envoltorio para addEvent con el parámetro de captura
  2. Si se requiere la captura haga lo siguiente

    1. Registrar una sencilla burbujeante caso, con una función que
    2. va todo el camino hasta la cadena principal, guardando todos los elementos a un Array
    3. Travels hacia atrás este Array invocar el controlador de evento original en cada uno de los elementos
1

IE tiene un elemento.Método setCapture() que usted puede encontrar útil http://msdn.microsoft.com/en-us/library/ms536742(v=vs.85).aspx Se permite dirigir todos los eventos del ratón al elemento que llama setCapture()

+0

favor dejar un comentario cuando usted Downvote! Hasta donde yo sé, la única forma de emular la fase de captura es usar setCapture. El OP no parece querer usarlo, pero no hay otra manera. Por favor, demuéstrame que estoy equivocado si quieres votar por mí. –

+1

Sospecho que esto se restregó porque OP estaba preguntando cómo lidiar con las fases de eventos de captura frente a burbujeo en IE, por lo que puede bloquear elementos secundarios para que no reciban eventos. No hay forma de usar el método '.setCapture()' para lo que está tratando de hacer, no "emula la fase de captura" en absoluto, solo afecta la orientación de los eventos del mouse durante un arrastre. – natevw

2

setCapture se utiliza para retener algo de acción relacionado con el ratón fuera de la ventana del navegador

y se utiliza para implementar algún tipo de fricción & gota

si mouseDown un elemento y va a ir con su puntero fuera de la ventana del navegador se detiene el evento MouseMove para trabajar

si setCapture() el evento MouseMove continuará trabajar afuera la ventana del navegador

https://developer.mozilla.org/en/DOM/element.setCapture

y el método relacionado para liberar la captura

https://developer.mozilla.org/en/DOM/document.releaseCapture

es así, no tiene nada en común con el modelo de eventos de captura y, no hay forma conocida de emularlo ¡en Internet Explorer de forma estándar!

Espero que esto ayude!

0
function myFunction(e) { 
    if (!e) var e = window.object;//legacy event object 
    if (e.preventDefault) e.preventDefault();//prevent firing in W3C model 
    return false; //exit event, no firing, listener must registered to anchor tag 
}  
var x = document.getElementsByTagName("A"); 

if (x.item(0).addEventListener) { 
    for (var i = 0, l = x.length; i < l; i++) { 
     x.item(i).addEventListener("click",myFunction,false); 
    } 
}//W3C model 
else if (x.item(0).attachEvent) { 
    for (var i = 0, l = x.length; i < l; i++) { 
     x.item(i).attachEvent("onclick",myFunction); 
     } 
    }// legacy browsers 
0

La mejor manera si sólo utiliza burbujeante por los clics:

if (document.addEventListener) document.addEventListener("click", function(e){e.preventDefault();},false); 
else if (document.attachEvent) document.attachEvent("onclick", function(){window.event.returnValue = false;}); 
Cuestiones relacionadas