2012-06-19 17 views
15

Si comienzo un clic con jquery que hace window.open(), está bloqueado por el bloqueador de elementos emergentes, si hago el clic manualmente la ventana no está bloqueada. ¿Cómo difiere el navegador entre los dos?¿cómo distingue el navegador la diferencia entre el clic del usuario y el clic programático?

+1

Aquí hay un [jsfiddle] (http://jsfiddle.net/twMSG/1/) para demostrar. Intentará aparecer en la carga de página pero se bloqueará. Llamar al evento 'click' programmatically hace que se bloquee, pero si lo llamas dentro de otro evento de clic que atraviesa. – sachleen

Respuesta

6

La aplicación de Firefox de esto es discutido extensamente en this bug y this other bug tiene algunos antecedentes más interesantes, incluyendo qué extremos sitios pasará a través con el fin de imponer una ventana emergente no deseado en los usuarios confiados (en este caso: llamar window.open() de dentro de una imagen load evento). Si busca alrededor de Bugzilla, encontrará que la gente de Mozilla tomó varios años para que todo funcione correctamente, por ejemplo here's a bug from 2001.

La forma en que funciona actualmente es la siguiente: Cuando Firefox recibe un evento de clic del sistema operativo, para una cierta cantidad de tiempo window.open() está activado en JavaScript (busque en dom.disable_open_click_delayabout:config). Si llama al evento click() desde el código sin que el usuario haga clic en el siguiente paso, la habilitación de window.open() nunca ocurre, aunque la llamada al window.open() tendrá éxito to stop sites detecting that you have popup blocking enabled.

No estoy seguro de cómo otros navegadores implementan esto, pero me sorprendería si fuera muy diferente.

1

Creo que llamar a click a través de jQuery realmente no activa un clic en el elemento, sino que llama a la función que escucha el clic. Entonces, aunque está llamando al click(), en realidad está llamando a una función.

Cuando el usuario hace clic, es un clic real.

Ejemplo:

var handler = function() { 
    alert('hi'); 
}; 

$('#example').on('click', handler); 
$('#example').click(); // really just calls handler(); 
+0

¿Es eso también cierto para el javascript nativo .click()? – nbrooks

+1

Algo interesante a tener en cuenta: si usted, como usuario, hace algo que da como resultado el código de clic que se está ejecutando, todavía lo hace. Esto incluye hacer clic en algo que llame al evento 'click'. O incluso un evento de pulsación de tecla puede llamarlo y funcionará. – sachleen

+0

Es difícil predecir cómo el navegador implementa esta verificación ya que no hay nada en la especificación que dicte cuándo se debe solicitar al usuario. http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 – Fenton

0

código nativo del navegador controla el evento real clic del ratón (del sistema operativo) y crea el objeto de evento navegador. En ese punto en el código nativo del navegador, el navegador sabe que este evento fue creado con un clic real del mouse.

Supongo que hay algunos datos ocultos (no accesibles desde javascript) adjuntos al evento que permiten al navegador realizar un seguimiento de si el evento se inició con un clic real del mouse o no, aunque podría haber otros mecanismos de implementación también.

Cuestiones relacionadas