#javascript #ajax #google-chrome #jquery
#javascript #ajax #google-chrome #jquery
Вопрос:
Я не совсем уверен, что вопрос правильный, но вот ситуация. У меня есть веб-страница с двумя запросами POST, которые открыты в течение некоторого времени (предполагается, что ответ придет не сразу), пока я могу делать другие вещи на странице. У меня также есть ссылка mailto на странице. По какой-то причине в Chrome, когда я нажимаю на эту ссылку, два запроса немедленно возвращают ошибку. Я также заметил, что консоль в Chrome отображает ссылку mailto как событие запроса GET (при нажатии на нее). Что здесь происходит? Даже если Chrome рассматривает ссылки mailto как запросы, почему они должны конфликтовать с любыми другими запросами на странице?
В Firefox ссылка mailto никак не влияет на запросы, они просто продолжают работать и ждут ответа сервера. Кроме того, сама ссылка, похоже, не является запросом какого-либо рода. Кстати, mailto открывает окно сообщений Outlook (и эта часть отлично работает в Chrome, просто запросы завершаются ошибкой).
Также на всякий случай я использую jQuery $.ajax для инициирования запросов.
Было указано, что, возможно, Chrome обрабатывает ссылку mailto как обычную, по крайней мере частично, и поэтому имеет некоторые побочные эффекты. Тогда возникает вопрос, как мне объединить ссылку mailto с запросом на странице? Я не могу заменить ссылку формой.
Комментарии:
1. Публикация кода может быть более полезной.
2. Не уверен, что я могу опубликовать, что помогло бы. Ссылка mailto совершенно обычная. И запросы $.ajax также совершенно просты, фактически они начинались как копирование-вставка с сайта jQuery. Единственная необычность в них заключается в том, что ответ приходит не сразу. Они оба отправляются в domready и просто сидят там, ожидая ответа сервера.
3. Это также отменяет запросы GET (например, если у вас есть логика для отслеживания событий).
Ответ №1:
Недавно я столкнулся с этой проблемой. На самом деле это происходит с mailto: или любым другим URI приложения в Chrome. Решение, которое я использовал, заключалось в загрузке URL-адреса в iframe:
$('body').append('<iframe id="mailto-launcher"></iframe>');
$('#mailto-launcher').get(0).contentWindow.location.href = 'mailto:?subject=test';
Вы также можете оформить этот iframe так, чтобы он отображался вне страницы (используя абсолютное позиционирование и т.д.). Это запустит почтовый клиент и по-прежнему сохранит AJAX-запросы вашего документа в рабочем состоянии.
Ответ №2:
Служба поддержки Google Analytics предлагает фиксировать переходы по ссылке, отправлять запрос в GA, ждать 100 мс, а затем обновлять URL. 100 мс должно быть достаточно для завершения отслеживания запроса. https://support.google.com/analytics/answer/1136920?hl=en
Пример неуклюжий, ниже приведена модифицированная версия, которая автоматически обрабатывает все ссылки (также созданные с помощью javascript / загруженные с помощью AJAX):
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
function trackOutboundLink(event){
var url = event.currentTarget.href;
try {
_gaq.push(['_trackEvent', 'Outbound Links' , url]);
} catch(err){}
setTimeout(function() {
document.location.href = url;
}, 100);
return false;
}
$(document).on('click', 'a[href]', trackOutboundLink);
</script>
Ответ №3:
Не уверен, но возможно, что Chrome рассматривает нажатие на mailto
ссылки как переход на новую страницу.
Имеет все побочные эффекты, но ни один из реальных эффектов (например, перезагрузка страницы).
Комментарии:
1. Хммм, это действительно может быть так. Но это было бы немного глупо, не так ли. Почему это должно так обрабатываться?
2. @ilia: Почему бы и нет? Просто потому, что запрос использует обработчик, отличный от
http
orhttps
? Вам когда-либо разрешалось отправлять на страницу только один базовый запрос за раз. Нажатие на ссылку отменяет загрузку по какой-либо другой ссылке, по которой вы только что нажали ранее.3. Извините, я понятия не имею… Возможно, Chrome просто обрабатывает их по-другому, возможно, было проще (с точки зрения разработки) заставить их работать так, как работает загрузка (например, запуск обработчика электронной почты по умолчанию).) Редактировать: Или, может быть, это то, что сказал Томалак. 😉
4. @Tomalak «Только потому, что запрос использует обработчик, отличный от http или https?» Ну да! 🙂 Это не стандартная ссылка, она не ведет себя (по крайней мере частично) как стандартная ссылка, поэтому она не должна вызывать эту проблему. На самом деле я пытался добавить к нему целевой пробел, и это работает, но это также открывает новую пустую вкладку. вздох
5. @ilia: Это полностью стандартная ссылка.
Ответ №4:
Эта проблема не позволила мне отправить событие в Google Analytics при нажатии на ссылку электронной почты.
В качестве обходного пути я изменил цель mailto: ссылки на _blank. Это приводит к тому, что браузер открывает пустую вкладку перед открытием Mail.app, но интеграция GA теперь работает.
Ответ №5:
То же самое здесь, сообщения в mixpanel были отменены. Наш обходной путь состоял в том, чтобы вызвать ссылку mailto:, используя установочное время в 1 секунду, это работает просто отлично. Неприятно, жестко, но в пятницу в 10 вечера в офисе это звучало вроде как нормально 🙂