Tengo un temporizador en mi JavaScript que necesita emular haciendo clic en un enlace para ir a otra página una vez que transcurre el tiempo. Para hacer esto estoy usando la click()
función de jQuery . Lo he usado $().trigger()
y window.location
también, y puedo hacerlo funcionar según lo previsto con los tres.
He observado algunos comportamientos extraños click()
y estoy tratando de entender qué sucede y por qué.
Estoy usando Firefox para todo lo que describo en esta pregunta, pero también estoy interesado en lo que otros navegadores harán con esto.
Si no he usado $('a').bind('click',fn)
o $('a').click(fn)
para configurar un controlador de eventos, llamar no $('a').click()
parece hacer nada. No llama al controlador predeterminado del navegador para este evento, ya que el navegador no carga la nueva página.
Sin embargo, si configuro un controlador de eventos primero, entonces funciona como se esperaba, incluso si el controlador de eventos no hace nada.
$('a').click(function(){return true;}).click();
Esto carga la nueva página como si hubiera hecho clic en el mismo.
Entonces mi pregunta es doble: ¿Es este comportamiento extraño porque estoy haciendo algo mal en alguna parte? ¿Y por qué las llamadas no click()
hacen nada con el comportamiento predeterminado si no he creado un controlador propio?
EDITAR:
Como Hoffman determinó cuándo intentó duplicar mis resultados, el resultado que describí anteriormente en realidad no sucede. No estoy seguro de qué causó los eventos que observé ayer, pero hoy estoy seguro de que no fue lo que describí en la pregunta.
Entonces, la respuesta es que no puede hacer "falsos" clics en el navegador y que todo lo que hace jQuery es llamar a su controlador de eventos. Todavía puede usar window.location
para cambiar de página, y eso funciona bien para mí.
Respuestas:
Interesante, esta es probablemente una "solicitud de función" (es decir, un error) para jQuery. El evento click de jQuery solo activa la acción click (llamada evento onClick en el DOM) en el elemento si vincula un evento jQuery al elemento. Debe ir a las listas de correo de jQuery ( http://forum.jquery.com/ ) y reportar esto. Este podría ser el comportamiento deseado, pero no lo creo.
EDITAR:
Hice algunas pruebas y lo que dijiste está mal, incluso si unes una función a una etiqueta 'a', todavía no te lleva al sitio web especificado por el atributo href. Prueba el siguiente código:
Nunca va a google.com a menos que haga clic directamente en el enlace (con o sin el código comentado). También tenga en cuenta que incluso si vincula el evento de clic al enlace, aún no se vuelve púrpura una vez que hace clic en el botón. Solo se vuelve púrpura si hace clic directamente en el enlace.
Investigué un poco y parece que el .click no debe funcionar con las etiquetas 'a' porque el navegador no admite "clic falso" con javascript. Quiero decir, no puedes "hacer clic" en un elemento con javascript. Con las etiquetas 'a' puede activar su evento onClick, pero el enlace no cambiará de color (al color del enlace visitado, el valor predeterminado es púrpura en la mayoría de los navegadores). Por lo tanto, no tendría sentido hacer que el evento $ (). Click funcione con las etiquetas 'a' ya que el acto de ir al atributo href no forma parte del evento onClick, sino que está codificado en el navegador.
fuente
Otra opción es, por supuesto, usar solo JavaScript de vainilla:
fuente
Si observa el código de la
$.click
función, apuesto a que hay una declaración condicional que verifica si el elemento tiene oyentes registrados para elclick
evento antes de que continúe. ¿Por qué no solo obtener elhref
atributo del enlace y cambiar manualmente la ubicación de la página?EDITAR: Esta es la razón por la cual no hace clic, desde la
trigger
función, fuente jQuery para la versión 1.3.2:Después de llamar a los controladores (si hay alguno) jQuery desencadena un evento en el objeto. Sin embargo, solo llama a controladores nativos para eventos de clic si el elemento no es un enlace. Supongo que esto se hizo a propósito por alguna razón. Sin embargo, esto debería ser cierto independientemente de si un controlador de eventos está definido o no, por lo que no estoy seguro de por qué en su caso, adjuntar un controlador de eventos provocó
onClick
que se llamara al controlador nativo . Tendrás que hacer lo que hice y pasar por la ejecución para ver dónde se llama.fuente
Los controladores de clics en las etiquetas de anclaje son un caso especial en jQuery.
Creo que puede confundirse entre el evento onclick del ancla (conocido por el navegador) y el evento click del objeto jQuery que envuelve la noción del DOM de la etiqueta del ancla.
Puede descargar la fuente jQuery 1.3.2 aquí .
Las secciones relevantes de la fuente son las líneas 2643-2645 (he dividido esto en varias líneas para que sea más fácil de comprender):
fuente
JS / jQuery no admite el comportamiento predeterminado de los enlaces "cliqueados" mediante programación.
Lo que puede hacer es crear un formulario y enviarlo. De esta manera, no tiene que usar
window.location
owindow.open
, que a menudo están bloqueados como ventanas emergentes no deseadas por los navegadores.Este script tiene 2 métodos diferentes: uno que intenta abrir 3 pestañas / ventanas nuevas (abre solo 1 en IE y Chrome, más información a continuación) y otro que activa un evento personalizado al hacer clic en el enlace.
Aquí es cómo:
HTML
jQuery (script.js)
Lo que hace es para cada elemento de enlace:
Ahora tiene una nueva pestaña / ventana de carga
"https://google.nl"
(o cualquier URL que desee, simplemente reemplácela). Desafortunadamente, cuando intentas abrir más de una ventana de esta manera, obtienes unaPopup blocked
barra de mensajes cuando intentas abrir la segunda (la primera todavía está abierta).Aquí encontrará más información sobre cómo llegué a este método:
Abrir una nueva ventana / pestaña sin usar
window.open
owindow.location.href
fuente
Active un elemento de hipervínculo que esté dentro del elemento que desea conectar a jquery .click ()
En su script, se conecta al contenedor principal en el que desea el evento de clic. Luego, utiliza la metodología estándar de jquery para encontrar el elemento (tipo, clase, id) y disparar el clic. Lo que sucede es que jquery ingresa una función recursiva para disparar el clic y se rompe la función recursiva tomando la función de evento 'e' y stopPropagation () y devuelve falso porque no desea que jquery haga nada más que disparar el enlace.
La solución alternativa es envolver los contenedores en el elemento y colocarlos como contenedores dentro en lugar de 's. Configure los tramos para mostrar el bloque de acuerdo con los estándares w3c.
fuente
Puede usar jQuery para seleccionar el objeto jQuery para ese elemento. Luego, obtenga el elemento DOM subyacente y llame a su
click()
método.por id
o use jQuery para hacer clic en un montón de enlaces por clase CSS
fuente
No hace nada porque no se han vinculado eventos al evento. Si recuerdo correctamente, jQuery mantiene su propia lista de controladores de eventos que están vinculados a NodeLists para el rendimiento y otros fines.
fuente
Si necesita esta función para un caso o muy pocos casos. (toda su aplicación no requiere esta función) Prefiero dejar jQuery como está (por muchas razones, incluida la posibilidad de actualizar a versiones más nuevas, CDN, etc.) y tener la siguiente solución:
fuente
Para abrir el hipervínculo en la misma pestaña, use:
fuente