1

Я осуществляю отслеживание кликов с разных страниц в нашей корпоративной интрасети, чтобы добавить некоторые очень необходимые популярные ссылки на популярные источники («самые популярные ссылки в вашем отделе за последние 24 часа» и т. Д.)JavaScript/jQuery: Как убедиться, что событие отслеживания перекрестных доменов прошло успешно, прежде чем пользователь покинет страницу?

Я использую jQuery's .live() для привязки к событию mousedown для всех элементов ссылки на странице, фильтрации события, а затем с помощью запроса псевдо-ajax с различными данными на внутренний сервер перед возвратом true, так что пожары ссылка действия:

$("#contentarea a").live("mousedown", function(ev) { 
    // 
    // detect event, find closest link, process it here 
    // 
    $.ajax({ 
     url: 'my-url', 
     cache: false, 
     dataType: 'jsonp', 
     jsonp: 'cb', 
     data: myDataString, 
     success: function() { 
      // silence is golden -- server does send success JSONP but 
      // regardless of success or failure, we allow the user to continue 
     } 
    }); 

    return true; // allow event to continue, user leaves the page. 
} 

Как вы можете догадаться из сказанного выше, у меня есть ряд ограничений:

  • Внутренний сервер отслеживания находится на другом поддомене с вызывающей страницы. Я не могу обойти это. Вот почему я использую JSONP (и GET) в отличие от собственно AJAX с POST. Я не могу реализовать прокси AJAX, поскольку веб-серверы не имеют исходящего доступа к сети для скриптов.
  • Это, вероятно, не имеет отношения к делу, но в интересах полного раскрытия содержание и сценарий находятся внутри «основного содержимого» iframe (и это не изменится. Скорее всего, в конечном итоге переместите прослушиватель событий в родительский кадр для отслеживания его ссылок и всего дочернего контента, но шаг 1 заставит его работать правильно в упрощенном случае «1 дочернее окно»). Родитель и ребенок - это тот же домен.
  • Внутренний интерфейс IIS/ASP (опять же, ограничение - не спрашивайте!), Поэтому я не могу сразу разблокировать фоновый процесс или иным образом прекратить ответ, но продолжать обрабатывать, как я мог лучшая платформа

Несмотря на все это, по большей части, система работает - я нажимаю ссылки на странице, и они отображаются в базе данных довольно легко.

Однако он не является надежным - для большого количества ссылок, особенно для ссылок за пределами площадки, у которых их цель установлена ​​на «_top», они не отображаются. Если ссылка открыта в новой вкладке или окне, она регистрирует ОК.

Я исключили ошибки сценария - это, кажется, что либо:

(а) запрос никогда не делает его к заднему концу времени; или

(b) запрос делает это, но ASP обнаруживает, что клиент отключается вскоре после этого и, поскольку он является запросом GET, не обрабатывает его.

Я подозреваю (b), так как латентность на сервере очень быстрая, и многие ссылки регистрируются в порядке. Если я вставил всплывающее окно предупреждения после того, как событие заработает, или установите для возвращаемого значения значение false, щелчок будет зарегистрирован OK.

Любые советы о том, как я могу это решить (в контексте, что я не могу изменить свои ограничения)? Я не могу сделать запрос GET синхронным, поскольку это не так AJAX.

Q: Было бы лучше работать, если бы я отправлял запрос POST в ASP? Если (b) является виновником, будет ли он вести себя по-разному для POST и GET? Если это так, я могу использовать скрытую форму iframe/form для отправки данных. однако я подозреваю, что это будет медленнее и более неуклюже, и, возможно, все еще не успеет. Я не смог бы прослушать, если запрос завершится, потому что он является междоменным.

Q: Могу ли я просто добавить задержку к скрипту после того, как будет отправлен запрос GET? Как это сделать однопоточным способом? Мне нужно вернуть true из моей функции, чтобы гарантировать, что событие по умолчанию в конечном итоге срабатывает, поэтому я не могу использовать setTimeout(). Будет ли жесткая петля ждать «успеха», чтобы стрелять и установить некоторую переменную работу? Я беспокоюсь, что это слишком сильно замерзнет, ​​и ответ будет замедлен. Я предполагаю, что плагин jQuery delay() - это тоже цикл?

Или что-то еще я не думал о том, чтобы быть виновником?

Мне не нужна пуленепробиваемая надежность. Если все ссылки одинаково привлекательны в 95% случаев, это нормально. Однако прямо сейчас некоторые ссылки уловимы в 100% случаев, в то время как другие недоступны - что не собирается сокращать его за то, что я хочу достичь.

Заранее спасибо.

ответ

0

Решено!

Короткий ответ: надежного способа выполнения этого кросс-домена с запросом GET нет. Я пробовал все виды, включая хранение события и попытку повторного воспроизведения события позже, и всевозможные хаки, чтобы попытаться заставить это работать.

Я тогда пробовал плотно петли, и они также были ненадежны.

Наконец, я просто дал и использовал динамически созданную форму, которая отправила результаты, с целью, заданной скрытым iFrame.

То, что работает надежно - кажется, браузер делает паузу, чтобы завершить свой запрос POST, прежде чем двигаться дальше, и ASP награждает POST. Оказывается, это не «неуклюжий». Конечно, из-за модели безопасности браузера я не вижу результата ... но в данном случае это не имеет значения.

Я сейчас пинаю себя, что сначала не пробовал этот вариант.

0

Я бы попытался вернуть false из обработчика событий ссылки, вспомнить URL-адрес и перейти только тогда, когда запрос JSONP преуспеет. Надеюсь, он не должен добавлять слишком много латентности. Учитывая, что вы находитесь в интранете, все может быть в порядке.

+0

Спасибо, я подумал об этом. Проблема в том, что некоторые из ссылок имеют связанные с ними события javascript (например, show in thickbox). Есть ли способ сохранить все событие, а затем запустить его позже? Обратите внимание, что они не являются событиями onclick, они также динамически применяются с использованием jQuery. – Jhong

0

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

$(window).unload(function(event) { 
    // tracking code here 
}); 
+0

Спасибо - хорошая мысль. Но, учитывая, что мне все еще нужно возвращать истину, и не может отправить запрос синхронно, не будет ли это продолжаться «отрезанием»? Также некоторые ссылки открываются в новых окнах или в полноэкранном всплывающем окне. Я предполагаю, что они не будут запускать window.onunload, и мне тоже нужно их отслеживать. – Jhong

+0

Да, 'разгрузка' может и не быть событием для вас. Не имея возможности отправлять его синхронно, единственный вариант, о котором я могу думать, - это своего рода цикл задержки, чтобы искусственно замедлить ваш код. Но это менее желательно. – kingjeffrey

+0

Думаю, мне придется попробовать это. Просто немного боюсь запереть системы людей. Многие пользователи по-прежнему находятся на IE6 на довольно старых ноутбуках. Если цикл в ожидании завершения запроса или таймаута, будут ли выполняться фоновые потоки? У меня есть некоторые анимации на странице и т. Д., Было бы здорово, если бы они продолжались в полсекунды или так требуется для моего цикла. – Jhong