Изменение window.location не удается AJAX-вызов - PullRequest
6 голосов
/ 12 февраля 2010

У меня есть функция отслеживания кликов AJAX (вызывает WebMethod на странице .aspx), и мне нужно вызывать ее, когда пользователь нажимает на ссылку.

К сожалению, я использую window.location = "newUrl" для изменения страницы, что, похоже, приводит к сбою вызова AJAX. Есть ли способ обойти это?

Мне не нужно получать какую-либо информацию от вызова AJAX, мне просто нужно убедиться, что WebMethod вызван.

Я знаю, что я мог бы просто перенаправить вызовы success() или failure(), но тогда мне пришлось бы ждать запуска метода clickTracking(), который занимает ~ 1s. Это не приемлемо соглашением в спецификации проекта и поэтому не является жизнеспособным решением.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

Вместо использования AJAX, почему бы вам просто не отправить пользователя на страницу ASPX, которая записывает щелчок, а затем отправляет заголовок location для перенаправления на новый URL-адрес? Например, при нажатии на ссылку произойдет следующее:

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

redirect.aspx будет обрабатывать как отслеживание, так и перенаправление на новый URL. Это практически единственный способ сделать это, не дожидаясь завершения запроса AJAX, прежде чем отправлять пользователя в путь.

См. Также: Перенаправление пользователей на другую страницу (MSDN)

Вероятно, стоит отметить, что вы видите этот метод каждый день на многих сайтах. Чаще всего они встречаются в рекламе. Рекламная ссылка AdSense выглядит следующим образом:

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

В любом случае (я его немного сбил). Когда вы нажимаете на него, вы попадаете на http://www.google.com/aclk,, который перенаправляет вас на конечный сайт после отслеживания клика.

2 голосов
/ 12 февраля 2010

Мне просто нужно убедиться, что WebMethod называется.

Если вышесказанное действительно важно, вы можете сделать следующее:

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

Будет определенная задержка с момента перенаправления страницы. Это может или не может быть приемлемо, в зависимости от вашего приложения и средней задержки от ваших пользователей к вашему хосту.


EDIT:

В дополнение к новому комментарию, приведенному ниже, к сожалению, изменение window.location прервет ваш запрос AJAX.

Для внутренних ссылок: Вы можете отслеживать свои ссылки, как только пользователи попадают на новую страницу, а не когда они нажимают на гиперссылку.

Для внешних ссылок: Я бы использовал метод перенаправления на стороне сервера, как Энди Е предложил в другом ответе .

0 голосов
/ 12 февраля 2010

Используйте обертку <iframe>, чтобы обернуть ваши страницы. Затем, когда у вас есть AJAX-запрос, передайте его в оболочку и перейдите по <iframe>. Это даст вам возможность получить совершенно асинхронный запрос при сохранении отзывчивости приложения.

Конечно, вы также не меняете адресную строку и не убиваете своего SEO, но это компромисс для плохой архитектуры. Тот факт, что ваша функция отслеживания кликов занимает около секунды, просто ужасен. Возможно, вам следует запустить его в асинхронном потоке на сервере и просто передать данные клиенту в отдельном потоке (System.Threading). Это облегчит проблемы, с которыми вы столкнулись.

В противном случае вы можете иметь асинхронный , надежный или "не взломанный вместе" . Выберите любые два.

EDIT

Боже мой, вы также можете запустить запрос AJAX в виде всплывающего окна:

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

Это все еще не очень хорошая идея, но она будет работать.

...