Поведение при перезагрузке страницы в Safari

У меня есть страница с опубликованным контентом. Когда я обновляю указанную страницу в Safari с помощью Cmd+R или кнопки обновления браузера, появляется всплывающее окно, как показано ниже: введите здесь описание изображения

Это поведение одинаково и в других браузерах (Chrome, FF и т. д.).

Но когда я пытаюсь обновить ту же страницу с помощью javascript, используя либо window.location.href = location.href, либо location.reload(), либо window.location .reload() или даже window.location.reload(true) в Safari не показывает вышеупомянутое всплывающее окно. Но это поведение отличается в Chrome, FF и т. д., где появляется одно и то же всплывающее окно.

Редактировать. Последствием того, что всплывающее окно не отображается, является то, что опубликованное содержимое не отправляется повторно, и, таким образом, поведение меняется.

Итак, теперь мой вопрос: как мне перезагрузить страницу во всех браузерах, чтобы отправленное содержимое формы было повторно отправлено.


person Anand Sainath    schedule 22.01.2013    source источник
comment
Не уверен, что вы сможете изменить поведение браузера, но рассматривали ли вы возможность использования GET вместо POST, если это возможно?   -  person sachleen    schedule 22.01.2013
comment
У меня есть, дело в том, что я публикую контент JSON. Это будет выглядеть некрасиво при использовании GET.   -  person Anand Sainath    schedule 22.01.2013


Ответы (2)


Через АЯКС

Насколько мне известно, невозможно заставить Safari повторно отправлять данные POST во время обновления. Единственный способ «исправить» эту проблему — отделить логику от документа, в котором отображается результат. На практике я имею в виду, что вы можете активировать логику, которую вы хотите, из кода, используя запрос AJAX, в то время как сам документ будет (относительно) тупой страницей.

Итак, что вы получите:

ОТПРАВИТЬ document.ext

#In whatever server side language you're using, the reason this can't be done
# purely in javascript is that POST data is only available to the server.
print "<script>"
print "POSTdata = " + JSONEscape(POSTdata) + ";"
print "var doAction = function(){"
print "  ajax('action.ext', POSTdata, function(result){});"
print "});"
print "</script>"
print "<button onclick='doAction()'>Refresh</button>"

ОТПРАВИТЬ action.ext

# all the logic you previously had in document.xxx

Результатом этого является:

  • Во всех браузерах обновление, инициированное пользователем, отправит данные POST, и логика запустится повторно.
  • Кнопка обновления всегда повторно запускает вашу логику напрямую, без перезагрузки всей страницы.

Самостоятельная отправка формы

Меня просто поразило, что другой - более простой в реализации - способ добиться этого - просто создать <form action='?' method='POST'> и в коде вызвать его функцию submit. Вам все равно нужно будет print POSTdata, но вместо вызова Ajax вы просто активируете перенаправление на ту же страницу через скрытый <form>. Преимущество этого в том, что он не требует никакой реструктуризации, хотя я лично думаю, что метод AJAX выглядел бы более аккуратно. Быстрый Google-фу показал эти ответы с подробным описанием процесса.

person David Mulder    schedule 28.05.2015
comment
Начинает казаться, что обновление запроса POST страницы на основе JS невозможно. Досадные проблемы с кросс-браузерной совместимостью! - person andrewb; 29.05.2015

Если вы действительно хотите использовать обновление страницы без подтверждения, вы должны использовать перенаправление. Таким образом, вы отправляете данные на страницу A и сохраняете информацию о публикации в сеансе или файле cookie, а затем перенаправляете страницу B для рендеринга.

Или вы можете сделать все для своей бизнес-логики на странице А и использовать страницу Б просто как страницу благодарности.

Затем вы можете обновить без подтверждения на странице B.

person sean    schedule 29.05.2015
comment
Вопрос был не в том, чтобы не показывать подтверждение, а в том, чтобы получить такое же полное поведение обновления на основе JS в Safari, как и в других браузерах. Пусть другой прочитает вопрос. - person andrewb; 29.05.2015