Почему ссылки mailto в Chrome конфликтуют с запросами POST?

#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 or https ? Вам когда-либо разрешалось отправлять на страницу только один базовый запрос за раз. Нажатие на ссылку отменяет загрузку по какой-либо другой ссылке, по которой вы только что нажали ранее.

3. Извините, я понятия не имею… Возможно, Chrome просто обрабатывает их по-другому, возможно, было проще (с точки зрения разработки) заставить их работать так, как работает загрузка (например, запуск обработчика электронной почты по умолчанию).) Редактировать: Или, может быть, это то, что сказал Томалак. 😉

4. @Tomalak «Только потому, что запрос использует обработчик, отличный от http или https?» Ну да! 🙂 Это не стандартная ссылка, она не ведет себя (по крайней мере частично) как стандартная ссылка, поэтому она не должна вызывать эту проблему. На самом деле я пытался добавить к нему целевой пробел, и это работает, но это также открывает новую пустую вкладку. вздох

5. @ilia: Это полностью стандартная ссылка.

Ответ №4:

Эта проблема не позволила мне отправить событие в Google Analytics при нажатии на ссылку электронной почты.

В качестве обходного пути я изменил цель mailto: ссылки на _blank. Это приводит к тому, что браузер открывает пустую вкладку перед открытием Mail.app, но интеграция GA теперь работает.

Ответ №5:

То же самое здесь, сообщения в mixpanel были отменены. Наш обходной путь состоял в том, чтобы вызвать ссылку mailto:, используя установочное время в 1 секунду, это работает просто отлично. Неприятно, жестко, но в пятницу в 10 вечера в офисе это звучало вроде как нормально 🙂