Pergunta

Eu tenho um clique de rastreando a função Ajax (chama a WebMethod em um .aspx página), e eu preciso chamá -lo quando o usuário clicar em um link.

Infelizmente, estou usando window.location = "newUrl" Para alterar a página, que parece fazer com que a chamada do AJAX falhe. Existe uma maneira de contornar isso?

Não preciso obter nenhuma informação de volta da chamada do Ajax, só preciso garantir que o WebMethod é chamado.

Estou ciente de que poderia apenas redirecionar para o success() ou failure() ligações, mas então eu teria que esperar pelo clickTracking() Método a ser executado, que leva ~ 1s. Isso não é aceitável pelo contrato na especificação do projeto e, portanto, não é uma solução viável.

Foi útil?

Solução

Em vez de usar o Ajax, por que você não envia o usuário para uma página ASPX que registra o clique e depois envia o location Chefe para redirecionar para o novo URL? Por exemplo, no link clique, o seguinte ocorreria:

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

redirect.aspx então lidaria com o rastreamento e o redirecionamento para o novo URL. Essa é praticamente a única maneira de fazer isso sem esperar que uma solicitação de Ajax seja concluída antes de enviar o usuário a caminho.

Veja também: Redirecionando os usuários para outra página (MSDN)

Provavelmente vale a pena notar que você vê esse método todos os dias em muitos sites. Mais comumente, eles são encontrados em anúncios. Um link de anúncios do Adsense se parece com o seguinte:

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 qualquer maneira (eu o derrubei um pouco). Quando você clica nele, você pousa em http://www.google.com/aclk, que o redireciona para o site final depois de rastrear o clique.

Outras dicas

Eu só preciso garantir que o webMethod seja chamado.

Se o acima for realmente importante, você pode fazer o seguinte:

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

Haverá alguma latência a partir de quando a página será redirecionada. Isso pode ou não ser aceitável, dependendo do seu aplicativo e da latência média de seus usuários para o seu host.


EDITAR:

Além do novo comentário abaixo, infelizmente o window.location A mudança interromperá sua solicitação de Ajax.

Para links internos: Você pode rastrear seus links assim que os usuários pousarem na nova página, em vez de quando clicarem no hiperlink.

Para links externos: Eu usaria um método de redirecionamento do lado do servidor, como Andy E sugeriu em outra resposta.

Use um <iframe> invólucro para embrulhar suas páginas. Então, quando você tiver uma solicitação de Ajax, passe a solicitação para o invólucro e navegue no <iframe>. Fazer isso dará a você a capacidade de ter uma solicitação perfeitamente assíncrona, mantendo a capacidade de resposta do aplicativo.

É verdade que você também não está mudando a barra de endereços e matando efetivamente seu SEO, mas essa é a troca de ter uma arquitetura ruim. O fato de sua função de rastreamento de cliques levar cerca de um segundo é simplesmente assustadora. Talvez você deva iniciá -lo em um tópico assíncrono no servidor e apenas servir os dados ao cliente com um thread separado (System.Threading). Isso aliviaria os problemas que você está enfrentando.

Caso contrário, você pode ter assíncrono, confiável, ou "Não hackeado". Escolha dois.

EDITAR

Meu mal, você também pode executar seu pedido de Ajax como pop -up:

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

Ainda não é uma boa ideia, mas vai funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top