jQuery getJSON вызывает при выходе из веб-страницы, не работает на Chrome 6 и Safari 5 (работает в Chrome 5) - PullRequest
0 голосов
/ 10 сентября 2010

Проблема:

  1. Прикрепить событие клика по ссылке на странице (скажем, ссылка на http://google.com/)

  2. Попробуйте выполнить AJAX или getJSON (Специфичный для JQuery вызов) из функции, связанной с этим событием нажатия

  3. Вызов AJAX или getJSON никогда не завершается (даже если мы добавим явную паузу в полсекунды)

Пример HTML-страницы: http://paraschopra.com/temp/bah.html

Пример регистратора сервера (для проверки счетчиков): http://paraschopra.com/temp/count.txt

Файл bah.html связывается с простым регистратором PHP через getJSON, еслиВы нажимаете на ссылку ABC. Регистратор увеличивает число в count.txt. Вы поймете, что в Chrome 6 (и Safari) сервер никогда не связывается, в то время как в FF, IE, Chrome 5 сервер связывается. Это ошибка илиЧто? Есть ли обходной путь прямо сейчас?

Кстати, работает на всех других браузерах: FF, IE и т. д.

Ответы [ 4 ]

3 голосов
/ 10 сентября 2010

Это ошибка - но не в новых браузерах. :-) Что вы делаете, это устанавливаете асинхронный вызов Ajax, после чего страница разрывается из-за того, что была нажата ссылка, по которой вы переходите на новую страницу. Ваш звонок никогда не завершается, потому что страница исчезла.

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

  1. Сделать вызов Ajax синхронным (blech). Это делает для заметной задержки для пользователя.

  2. Отмените действие по умолчанию для ссылки, а затем самостоятельно измените расположение окна после завершения вызова (обрыв). Все еще заметная задержка для пользователя И это мешает «открыть в новом окне», «открыть в новой вкладке» и т. Д.

  3. Подход ко всей проблеме по-другому. Обычный способ состоит в том, чтобы ссылка шла на страницу, которая затем перенаправлялась на фактическое целевое местоположение. (Это то, что Google делает, например, в группах Google и других местах.) Это то, что я бы сделал для обычной веб-страницы (приложения для интрасети разные), не в последнюю очередь потому, что она абсолютно надежна и работает, даже если Пользователь отключил JavaScript в своем браузере.

Вы найдете много вопросов и ответов по этой теме здесь, в StackOverflow, если вы будете искать вопросы о действиях во время событий unload и beforeunload.

Я не был бы полностью удивлен, узнав, что есть способ привлечь веб-работников к этой проблеме, но я ожидаю, что многие из компромиссов будут одинаковыми, и веб-работники в настоящее время поддерживаются только небольшим количеством браузеров (включая Chrome).

0 голосов
/ 10 сентября 2010

что вам нужно сделать, это изменить свой код следующим образом:

$('a').live('click', function()
{
     var location = $(this).attr('href');
     $.getJSON("http://paraschopra.com/temp/count.php",function(){ /*Point 1*/
         document.location = location; /*point 2*/
     });
     /*Point 3*/
     return false;
});

Если вы посмотрите на мои комментарии внутри, вы увидите, что при нажатии на ссылку активируется функция из живого, поэтому процессорпереходит к первому пункту и инициализирует функцию json, НО она не ожидает успешного завершения вызова json и переходит к точке 3, что означает, что обратный вызов для click a завершен, и затем следует ссылка.*

в моей версии мы добавили обратный вызов в geJSON и вернули false, так что когда точка 2 пропускается до завершения обратного вызова click, мы возвращаем false, чтобы остановить переход браузера на google.com ... затемкогда данные json, наконец, успешно отправили эхо-запрос, инициируется вызов по адресу POINT 2 ... и мы программно отправляем браузер на URL ссылки ...

и еще один момент - вам не нужна функция liveпотому что вы не отслеживаете новые элементы, добавленные в дом.

0 голосов
/ 10 сентября 2010

Кстати, я просто нахожу этот отчет об ошибке: https://bugs.webkit.org/show_bug.cgi?id=26817, где сообщается:

Я думаю, что эта ошибка WONTFIX <- <strong>ОБНОВЛЕНИЕ: теперь ее ИСПРАВЛЕНО ИСПРАВЛЕНО

Почему? Как это вообще ошибка? Это должна быть особенность.

Также найдено https://bugs.webkit.org/show_bug.cgi?id=30457, которое предполагает загрузку изображения, переживает выгрузку страницы . У кого-нибудь есть опыт, действительно ли это работает? Если это так, похоже, у нас есть решение.

0 голосов
/ 10 сентября 2010

вам лучше сделать что-то вроде:

<a href="counter.php?url=http%3A%2F%2Fwww.google.de%2F">klick</a>

затем используйте counter.php, чтобы записать URL-адрес и количество кликов и перейти к данному URL-адресу, просто установив заголовок файла с помощью php f.e.

быстро и без сбоев;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...