2010-02-12 23 views
6

Tengo una función AJAX de seguimiento de clics (llama a WebMethod en una página .aspx), y debo llamarla cuando el usuario hace clic en un enlace.window.location change failed Llamada AJAX

Desafortunadamente, estoy usando window.location = "newUrl" para cambiar la página, lo que parece hacer que falle la llamada AJAX. ¿Hay alguna forma de evitar esto?

No necesito obtener ninguna información de la llamada AJAX, solo necesito asegurarme de que se llame al WebMethod.

Soy consciente de que solo yo podría redirigir las llamadas success() o failure(), pero entonces habría que esperar a que el método clickTracking() para funcionar, lo que lleva a ~ 1s. Eso no es aceptable según el acuerdo en las especificaciones del proyecto, por lo que no es una solución viable.

+0

@Ed: ¿Sus usuarios realmente tendrán una latencia de ~ 1s para su host. Esa puede ser una estimación muy conservadora. Yo apuntaría a 100ms. –

+0

@Daniel Tenemos un acuerdo de aproximadamente 1s en la mayoría de las páginas de respuesta completa; en la práctica, esperan mucho menos, y el método de seguimiento hace cosas sorprendentemente costosas en el tiempo (esto puede simplificarse en una fecha posterior). Basta con decir que esperar a que el método se complete no es una opción viable, de ahí el uso de AJAX en primer lugar. –

Respuesta

3

En lugar de utilizar AJAX, ¿por qué no simplemente envía al usuario a una página ASPX que registra el clic y luego envía el encabezado location para redirigir a la nueva url? Por ejemplo, en el enlace clic, podría ocurrir lo siguiente:

window.location = "/redirect.aspx?track=true&url=" + encodeURIComponent(newUrl); 

redirect.aspx entonces manejar tanto el seguimiento y la reorientación de la nueva URL. Esa es prácticamente la única forma en que puede hacerlo sin esperar a que se complete una solicitud AJAX antes de enviar al usuario en su dirección.

Consulte también: Redirecting Users to Another Page (MSDN)

probablemente vale la pena señalar que vea este método todos los días en muchos sitios. Más comúnmente, se encuentran en los anuncios. Un enlace de anuncio de AdSense se ve así:

http://www.google.com/aclk 
    ?sa=L&ai=C6DnFKnl1S5zhKoSBjAeqyKzKBPOD_2ehlIXfD9WsvQsQAVDQzK______ 
    8BYLvOuYPQCsgBAaoEGU_Q8k4OJin9jMDXAD6KQ_2Dsv7xyokLxRY 
    &num=1&ggladgrp=13269254452699041863&gglcreat=8511532373602616220 
    &sig=AGiWqtwzFm2sTimBuQpkD5kazyRNkkqH3w 
    &q=http://www.amazon.co.uk/s/%3Fie%3DUTF8%26keywords%3Dhello%2Bworld 

ish, de todos modos (lo derribé un poco). Cuando hace clic en él, aterriza en http://www.google.com/aclk, que lo redirecciona al sitio final después de rastrear el clic.

+0

Todavía no es totalmente asincrónico, así que tendré que esperar que se complete el método de clic, lo que daña el tiempo de carga. –

+2

@Ed Woodcock: No creo que sea posible hacer esto de manera asincrónica sin abrir una nueva ventana. Tan pronto como navegue desde la página, se cancelarán todas las solicitudes actuales. La mejor solución IMO es la que la mayoría de los sitios usan 'yourpage.aspx -> redirect.aspx -> result url'. –

+0

Sí, lo he usado antes, y no es una mala solución, sin embargo, esperaba que hubiera algún tipo de solución mágica de un solo disparo. Uno pensaría que ahora lo habría, dado lo importante que es la minería de datos como una opción de marketing empresarial. –

2

Solo necesito asegurarme de que se llama al WebMethod .

Si lo anterior es muy importante, puede hacer lo siguiente:

function onLinkClicked() { 
    $.ajax({ 
     url: 'WebMethod.aspx', 
     success: function(data) { 
      window.location = "newUrl"; 
     } 
    }); 
} 

Habrá un poco de latencia desde cuando la página se redirigirá. Esto puede o no ser aceptable, dependiendo de su aplicación y de la latencia promedio de sus usuarios a su host.


EDIT:

En relación con el nuevo comentario más abajo, por desgracia, el cambio window.location interrumpirá su solicitud AJAX.

Para enlaces internos: Es posible que desee rastrear sus enlaces tan pronto como los usuarios lleguen a la nueva página, en lugar de cuando hacen clic en el hipervínculo.

Para enlaces externos: Utilizaría un método de redirección del lado del servidor, como Andy E suggested in another answer.

+0

Ejem. Voy a editar la pregunta con este: ¡los tiempos de redireccionamiento de 1 segundo + página no son aceptables! –

+0

Y con la frase "asegúrese de que se llame", me refiero a asegurarse de que la llamada llegue al método web, no esperar a que vuelva. –

+0

@Ed: Desafortunadamente, la cosa es que nunca se puede estar seguro de que haya terminado, a menos que espere su devolución :) –

0

Use un contenedor para envolver sus páginas. Luego, cuando tenga una solicitud AJAX, pase la solicitud hasta el contenedor y navegue por el . Hacer esto le dará la capacidad de tener una solicitud perfectamente asíncrona sin dejar de mantener la capacidad de respuesta de la aplicación.

De acuerdo, tampoco está cambiando la barra de direcciones y está eliminando efectivamente su SEO, pero esa es la compensación por tener una mala arquitectura. El hecho de que su función de seguimiento de clics demore alrededor de un segundo es simplemente espantoso. Tal vez debería iniciarlo en un subproceso asíncrono en el servidor y simplemente servir los datos al cliente con un hilo separado (System.Threading). Eso aliviaría los problemas que estás experimentando.

De lo contrario, puede tener asíncrono, fiable o "no hackeado juntos". Elige dos.

EDITAR

Mi mal, también puede ejecutar la petición de AJAX como una ventana emergente:

window.open(url,'ajax','height=0,width=0'); 

Todavía no es una buena idea, pero que va a trabajar.

+0

No estoy seguro de poder soportar tener todo un sitio web envuelto en un iFrame, esas cosas son malas. Además, Google * los odia * con fines de SEO. –

+0

@Ed Bueno, realmente no tienes muchas opciones. Como dije, puedes tener dos de las tres opciones.Creo que esta es una oportunidad para trabajar en el código de back-end más que una oportunidad para hackear código de front-end. – mattbasta