IE загружает страницу дважды, есть ли способ это исправить? - PullRequest
1 голос
/ 15 января 2012

У меня странная ошибка, связанная с PHP, Ajax и IE.

Способ, которым настроен мой сайт, заключается в том, что корневая страница будет динамически загружать контент через jQuery $.ajax на основе хеш-тега URL.Так что http://example.com/#message/ загрузит страницу для отправки сообщения.Стандартные вещи.

При отправке этой формы сообщения я добавляю хеш-тег к запросу POST, чтобы я мог отправить пользователя обратно на страницу, откуда он пришел.В этом примере обмена сообщениями я получу $_POST['page'] = "message/" на стороне сервера.Пока отлично работает.

Я обработаю запрос и отправлю пользователя обратно на страницу.Вот здесь и начинается проблема.

То, что я делаю в своем скрипте PHP:

$_SESSION['sent'] = true;
header('Location: '. rootUrl() .'/#'. $_POST['page']);`

(rootUrl() возвращает «http://example.com» в этом случае, поэтому строкаприсоединяется к "http://example.com/#message/")

Это возвращает меня на ту же страницу сообщений, на которой ранее находился пользователь, и сценарий выглядит примерно так:

if (isset($_SESSION['sent'])) {
    echo '<p>Your message was sent!</p>';
} else {
    // show the message submit form here
}
// fully clear so the user can reload the page and send another message 
unset($_SESSION['sent']);

Теперь весь этот сценарийотлично работает во всех браузерах, кроме IE, а отлично работает во всех браузерах на не-ajax-версии (функциональность ajax была добавлена ​​благодаря прогрессивному улучшению, а страницы без ajax / ajax идентичны на 100%).

Так что же происходит в IE?Он загружает страницу с хеш-тегом дважды!Он отправляет на страницу два запроса.

Это проблема, потому что я отменяю свою переменную $_SESSION['sent'], поэтому пользователь сталкивается с тем, что он нажимает кнопку отправить, а затем его сообщение, по-видимому, самоочищается.Он обрабатывает и отправляет на стороне сервера, но пользователь не может этого знать.

Это происходит во всех версиях IE или, по крайней мере, из IE9 и ниже.

Каквременное исправление, я просто решил сделать перенаправление заголовка на не-ajax-версию страницы, которая работает как положено.

Это небольшая проблема: переход немного менее плавный, но последующие клики на сайте вернут функциональность Ajax.Тем не менее, я все еще хотел бы знать, почему IE загружает мою страницу дважды.

Единственное, что я обнаружил, хотя бы немного связанное с этой проблемой, это то, что в IE теги img с пустыми атрибутами 'src' будутотправить запрос на корневую страницу, но на моей странице есть только один тег img, и он не пустой.Поэтому я не думаю, что это проблема.

1 Ответ

0 голосов
/ 15 января 2012

Благодаря ветке Бену, указанному в комментариях, я обнаружил проблему.Это не имеет ничего общего с моим скриптом PHP или вызовами ajax.

В моем скрипте ajax, когда я загружаю новую страницу, я также устанавливаю window.location.hash.В обычных браузерах все, что это делает, это изменяет хеш, добавленный к URL в адресной строке.IE обрабатывает его так, как будто вы изменяете window.location, что вызывает загрузку страницы.

Решение : добавьте window.location.hash = window.location.hash в самый верх вашей страницы.Это все еще вызывает две загрузки страницы в IE, но по крайней мере динамически загруженные включения будут работать.

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