Quiero controlar si se puede hacer clic en un enlace o si se debe mostrar un error (según el resultado de una llamada ajax).
<a class="lnkCustomer" href="http://localhost/viewcustomer" target="_blank" data-customerno="237">View</a>Llego al punto en el que puedo configurar el enlace como "permitido hacer clic":
// Authorized anchor.data("authorized", true);Sin embargo, cuando ejecuto este código, el enlace aún no se abre. Idealmente, una vez que se completa la llamada ajax, debería invocar el evento de clic. Creo que el problema está en esta línea.
// Trigger Anchor anchor.click();Este es el código completo:
<script type="text/javascript"> $(".lnkCustomer").click(function(e) { var customerNo = $(this).data('customerno'); var anchor = $(this); // Check for authorized if (anchor.data("authorized")) { return true; } $.ajax( { url: 'http://localhost/checkcustomer', type: 'POST', dataType: 'json', data: { customerNo: customerNo }, cache: false, success: function (result) { if (result.success) { // Authorize anchor.data("authorized", true); // Trigger Anchor anchor.click(); } else { // Show a message in a alert or div alert('Not authorized'); } } }); // Default to false (Do not process anchor) return false; }); </script>Notas: estoy usando class en lugar de id en el ancla porque tengo varios enlaces que activarán este evento. Sin embargo, como puede ver, esto no debería ser un problema ya que siempre me refiero al objeto individual:
var anchor = $(this);No puede abrir una nueva pestaña sin las ventanas emergentes habilitadas o el clic del usuario para ese evento. No puede retrasarlo con promesas o invocar un evento de clic confiable.
Si desea verificar que un usuario pueda hacer clic en su enlace, realice la solicitud de API en la carga de la página y almacene el resultado.
O convierta su enlace en un botón con un proceso de dos clics para verificar y luego abrir.
Hay una respuesta simple: no puede activar un clic si no proviene de un evento confiable (cambio, clic, doble clic, mouseup, reinicio, envío).
Aquí está intentando activar un clic después de una solicitud AJAX (asíncrona), que no está permitida.
Más información aquí .
Como se sugirió, podría reemplazarlo por window.open(href, '_blank'); pero cuidado, también podría estar bloqueado por los parámetros del navegador.
Desafortunadamente, como mencionaron otros, href no se puede retrasar. Encontré una solución alternativa para adaptarse al escenario particular. Creé una página intermedia cuando el usuario hace clic en href. Esta página luego realiza la solicitud ajax (lado del servidor), si se valida, continúa y muestra el recurso. De lo contrario, muestra un error y permanece en la página intermedia.