2012-09-19 11 views
5

Estoy intentando escribir un método para captar los clics del usuario en el menú del sitio, pero quiero que el proceso sea silencioso para el usuario, principalmente cuando un usuario pasa el ancla etiqueta, se comportaría normalmente (mostrando el enlace que contiene). He intentado en varias maneras de hacer esto, y casi lo tengo trabajo ahora, mi código es el siguiente:Etiqueta de anclaje de HTML redirige el enlace después de la solicitud de ajax

<div class="selectNode" id="selectNode_1" style="color: rgb(229, 229, 229); background-color: rgb(47, 47, 47); "> 
    <a href="http://www.google.com" class="selectAnchor" style="color: rgb(229, 229, 229); "> 
    Google 
    </a> 
    <img class="childImage" src="icon.png"> 
</div> 

Y en jQuery, tengo:

$(".selectAnchor, .menuAnchor").click(function(event){ 
    event.stopPropagation(); 
    console.log(event.target.nodeName); 
    //event.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     url: 'http://localsite/menuRedirect.php', 
     data: {id:0, module:'Module',source:'Source'}, 
     complete: function(data){ 
     console.log("DONE"); 
     return true; 
     } 
    }); 
}); 

El enlace redirige a la página seleccionada, pero el código ajax nunca termina, por lo tanto, nunca registra el clic del usuario.

Intenté usar event.preventDefault, pero no hay forma de reanudar el evento cancelado.

Parte del problema proviene de una funcionalidad adicional, por ejemplo, la mayoría de los usuarios hacer clic derecho sobre la etiqueta de anclaje para abrir en una nueva pestaña (o utilice Control + clic o clic medio), y usar algo como

<a href="javascript:saveClick(o)">Google</a> 

no está permitido en el sitio (por razones de seguridad).

¿Alguna sugerencia de cómo se puede hacer esto?

Respuesta

13

Uso event.preventDefault, a continuación, en caso de éxito, utilice location.href = self.href

$(".selectAnchor, .menuAnchor").click(function(event){ 
    event.preventDefault(); 
    console.log(event.target.nodeName); 
    var self = this; 

    $.ajax({ 
     type: 'POST', 
     url: 'http://localsite/menuRedirect.php', 
     data: {id:0, module:'Module',source:'Source'}, 
     complete: function(data){ 
     console.log("DONE"); 
     location.href = self.href; 
     } 
    }); 
}); 

o hacer uso de la propiedad de contexto para eliminar var self = this

$(".selectAnchor, .menuAnchor").click(function(event){ 
    event.preventDefault(); 
    console.log(event.target.nodeName); 

    $.ajax({ 
     type: 'POST', 
     context: this, 
     url: 'http://localsite/menuRedirect.php', 
     data: {id:0, module:'Module',source:'Source'}, 
     complete: function(data){ 
     console.log("DONE"); 
     location.href = this.href; 
     } 
    }); 
}); 
+0

Intenté algo similar, y funciona en el caso del clic izquierdo, pero control + clic izquierdo, o medio clic abre el enlace en la misma ventana. Algunos de los enlaces también contienen target = "_ blank", por lo que este método tampoco funcionaría en ellos. – desto

+0

Si desea conservar esa funcionalidad, no hay mucho que pueda hacer. Si no evita que ocurra el evento, su solicitud de ajax no se completará. Si evita el evento, esa otra funcionalidad no se puede preservar. –

+0

¿Ha considerado hacer una página intermedia que redirige después de rastrear la salida? –

0

intenta esto

<div class="selectNode" id="selectNode_1" style="color: rgb(229, 229, 229); background-color: rgb(47, 47, 47); "> 
    <a href="#" class="selectAnchor" style="color: rgb(229, 229, 229); "> 
    Google 
    </a> 
    <img class="childImage" src="icon.png"> 
</div> 

Entonces esto en jQuery:

$(".selectAnchor, .menuAnchor").click(function(event){ 
    event.preventDefault(); 
    console.log(event.target.nodeName); 
    //event.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     url: 'http://localsite/menuRedirect.php', 
     data: {id:0, module:'Module',source:'Source'}, 
     complete: function(data){ 
     console.log("DONE"); 
     window.location = "http://www.google.com" 
     } 
    }); 
}); 
+0

He intentado algo similar, y funciona en el caso del clic izquierdo, pero el control + clic izquierdo, o el medio clic abre el enlace en la misma ventana. Algunos de los enlaces también contienen target = "_ blank", por lo que este método tampoco funcionaría en ellos. – desto

+0

@desto - editado, esto funcionará seguro, lo único es que no verá el enlace en el mouse sobre –

Cuestiones relacionadas