Я осуществляю отслеживание кликов с разных страниц в нашей корпоративной интрасети, чтобы добавить некоторые очень необходимые популярные ссылки на популярные источники («самые популярные ссылки в вашем отделе за последние 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% случаев, в то время как другие недоступны - что не собирается сокращать его за то, что я хочу достичь.
Заранее спасибо.
Спасибо, я подумал об этом. Проблема в том, что некоторые из ссылок имеют связанные с ними события javascript (например, show in thickbox). Есть ли способ сохранить все событие, а затем запустить его позже? Обратите внимание, что они не являются событиями onclick, они также динамически применяются с использованием jQuery. – Jhong