追記:現在(60.0.3112.101)ではChromeのアップデートによりpostパラメータが取れるようになったため、この対応をしなくても正常動作します。Goggleさん・・・
Google ChromeでPOSTパラメータをF5更新で引き継ぐ
postで開いたページをGoogle ChromeでF5更新をするとpostパラメータが空になってしまう・・・
いつの間にこんな仕様変更が・・・
Googleさんやってくれましたね・・・
という事で対策しました。
Before
index.php
<html>
<body>
<form method="post" action="./">
<input type="text" value="test" name="a" />
<input type="submit" value="submit" />
</form>
<?php var_dump($_POST) ?>
</body>
</html>
この状態では、submitした後にF5更新すると$_POSTが空になってしまう。
After
index.php
<html>
<body>
<form method="post" action="./">
<input type="text" value="test" name="a" />
<input type="submit" value="submit" />
</form>
<?php var_dump($_POST) ?>
<?php
echo f5reloadForm();
function f5reloadForm()
{
$result = '';
if (!empty($_POST)) {
$result .= '<form method="post" id="reload_form" action="">';
foreach ($_POST as $key => $value) {
$result .= makeTag($key, $value);
}
$result .= '</form>';
$result .= PHP_EOL;
$result .= <<<JS
<script language="JavaScript"><!--
window.document.onkeydown = function (event)
{
if (event.keyCode == 116) {
var target = document.getElementById("reload_form");
target.action = location.href;
target.submit();
return false;
}
}
//--></script>
JS;
}
return $result;
}
function makeTag($key, $value)
{
$result = '';
if (is_array($value)) {
foreach ($value as $k => $v) {
$result .= makeTag(sprintf('$s[%s]', $key, $k), $v);
}
} else {
$result = sprintf('<input name="%s" value="%s" type="hidden" />', $key, $value);
}
return $result;
}
?>
</body>
</html>
F5更新用の擬似formを作ってpostパラメータ全てをhiddenに格納。
F5を押したときに擬似formをsubmitする事でF5更新と同等の挙動をするようにしました。
欠点
- Ctrl+F5が実質使えない
- ブラウザのリロードボタンは対策できていない
対策は不十分ですが、何も対策できていないより良いよね♪