Поведения за презареждане на страницата в 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)


Чрез AJAX

Доколкото ми е известно, няма начин да принудите 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-fu показа тези отговори с подробно описание на процеса.

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

Ако наистина искате да използвате опресняване на страницата без потвърждение, трябва да използвате пренасочване. Така че публикувате данни на страница A и запазвате информацията за публикацията в сесия или бисквитка и след това пренасочвате страница B за изобразяване.

Или можете да направите всичко за вашата бизнес логика на страница A и да използвате страница B просто като страница за благодарност.

След това можете да опресните без потвърждение на страница B.

person sean    schedule 29.05.2015
comment
Въпросът не беше да не се показва потвърждението, а да се получи същото пълно поведение на базирано на JS опресняване в Safari, както при други браузъри. Нека друг прочете въпроса. - person andrewb; 29.05.2015