Quiero mostrar un diálogo de JQuery condicionalmente en el evento de clic de un hipervínculo.
Tengo un requisito como en condition1 abrir un diálogo de JQuery y si condition1 no se satisface, navegue a la página como se hace referencia en la etiqueta 'href' de cuyo evento de clic está en cuestión.
Puedo llamar a una función en el evento de clic del enlace. Esta función ahora verifica dicha condición ejecutando otra URL (que ejecuta mi controlador Spring y devuelve la respuesta).
Todo funciona perfectamente con solo window.open bloqueado por el bloqueador de ventanas emergentes.
$('a[href*=/viewpage?number]').live('click', function(e) {
e.preventDefault();
redirectionURL = this.href;
pageId= getUrlVars(redirectionURL)["number"];
$.getJSON("redirect/" + pageId, {}, function(status) {
if (status == null) {
alert("Error in verifying the status.");
} else if(!status) {
$("#agreement").dialog("open");
} else {
window.open(redirectionURL);
}
});
});
Si e.preventDefault();
elimino del código, el bloqueador de popup no bloquea la página, sin embargo, para la condición 1, abre el diálogo y abre la página 'href'.
Si resuelvo uno, crea problemas para otro. No puedo hacer justicia a ambas condiciones simultáneamente.
¿Podría ayudarme a resolver este problema, por favor?
Una vez que esto se resuelve, tengo otro problema que resolver, es decir, la navegación en el evento OK del diálogo :)
fuente
Respuestas:
Los bloqueadores de ventanas emergentes normalmente solo permitirán
window.open
si se usan durante el procesamiento de un evento de usuario (como un clic). En su caso, está llamandowindow.open
más tarde , no durante el evento, porque$.getJSON
es asincrónico.Tienes dos opciones:
Haz algo más, en lugar de
window.open
.Haga que la llamada ajax sea sincrónica, que es algo que normalmente debe evitar como la plaga, ya que bloquea la interfaz de usuario del navegador.
$.getJSON
es equivalente a:... y para que pueda
$.getJSON
sincronizar su llamada asignando sus parámetros a lo anterior y agregandoasync: false
:Una vez más, no defiendo las llamadas ajax sincrónicas si puede encontrar otra forma de lograr su objetivo. Pero si no puede, ahí lo tiene.
A continuación, se muestra un ejemplo de código que no supera la prueba debido a la llamada asincrónica:
Ejemplo en vivo | Fuente en vivo(los enlaces en vivo ya no funcionan debido a cambios en JSBin)Y aquí hay un ejemplo que funciona, usando una llamada sincrónica:
Ejemplo en vivo | Fuente en vivo(los enlaces en vivo ya no funcionan debido a cambios en JSBin)fuente
puede llamar a window.open sin bloquear el navegador solo si el usuario realiza alguna acción directamente. El navegador envía una bandera y determina la ventana abierta por la acción del usuario.
Entonces, puedes probar este escenario:
fuente
myWindow.postMessage
), pero debido a la restricción de Safaris de no ejecutar JavaScript en segundo plano, la ventana principal nunca puede enviar ese cambio de ubicación.Tuve este problema y no tenía mi URL lista hasta que la devolución de llamada devolviera algunos datos. La solución fue abrir una ventana en blanco antes de iniciar la devolución de llamada y luego establecer la ubicación cuando regrese la devolución de llamada.
fuente
action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup)
Entonces no puedo abrir una ventana de antemano (para mantener su referencia, etc.) si más adelante no la usaré, ¿verdad?prueba esto, funciona para mí,
Es un violín para esto http://jsfiddle.net/safeeronline/70kdacL4/1/
fuente
Windows debe crearse en la misma pila (también conocida como microtask ) que el evento iniciado por el usuario, por ejemplo, una devolución de llamada de clic, para que no se puedan crear más tarde, de forma asincrónica.
Sin embargo, puede crear una ventana sin una URL y luego puede cambiar la URL de esa ventana una vez que la sepa , ¡incluso de forma asincrónica!
Los navegadores modernos abrirán la ventana con una página en blanco (a menudo llamada
about:blank
), y suponiendo que su tarea asíncrona para obtener la URL sea bastante rápida, la UX resultante es en su mayoría buena. Si, en cambio, desea representar un mensaje de carga (o cualquier cosa) en la ventana mientras el usuario espera, puede usar URI de datos .fuente
Este código me ayuda. Espero que esto ayude a algunas personas
fuente
Intente usar un elemento de enlace y haga clic en él con javascriipt
y el guion
Úselo así
fuente
La observación de que el usuario tenía que iniciar el evento me ayudó a descubrir la primera parte de esto, pero incluso después de eso, Chrome y Firefox seguían bloqueando la nueva ventana. La segunda parte fue agregar target = "_ blank" al enlace, que se mencionó en un comentario.
En resumen: debe llamar a window.open desde un evento iniciado por el usuario, en este caso haciendo clic en un enlace, y ese enlace debe tener target = "_ blank".
En el siguiente ejemplo, el enlace usa class = "button-twitter".
fuente
esto funcionó para mí.
fuente
Estoy usando este método para evitar el bloqueador de ventanas emergentes en mi código React. también funcionará en todos los demás códigos javascript.
Cuando esté realizando una llamada asíncrona al hacer clic en un evento, simplemente abra una ventana en blanco primero y luego escriba la URL en ella cuando se complete una llamada asíncrona.
sobre el éxito de la llamada asíncrona, escriba lo siguiente
fuente