在按下“返回”按钮后,IE8用错误的数据填充表单字段

时间:2012-09-24 17:17:11

标签: php html forms internet-explorer-8

我需要的是:

  • 用户加载页面(输入为空)
  • 用户提供一些输入并提交
  • 输入具有新值
  • 用户导航回来
  • 输入具有以前的值

我的php文件如下所示:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
    <form id="formTest" name="formTest" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" autocomplete="off">
        <select id="selectTest" name="selectTest">
            <option value=0 <?php if(isset($_POST['selectTest']) && $_POST['selectTest']==0){echo 'selected=\'selected\'';} ?>>Select an option...</option>
            <option value=1 <?php if(isset($_POST['selectTest']) && $_POST['selectTest']==1){echo 'selected=\'selected\'';} ?>>Option 1</option>
            <option value=2 <?php if(isset($_POST['selectTest']) && $_POST['selectTest']==2){echo 'selected=\'selected\'';} ?>>Option 2</option>        
        </select>
        <br/>
        <input id="inputTest" name="inputTest" type="text" value="<?php if(isset($_POST['inputTest'])){echo htmlentities($_POST['inputTest']);} ?>" />          
        <br/>
        <input type="submit" value="OK" />
    </form>
    <?php
        print_r($_POST);
    ?>
</body>
</html>

正如您在提交后可以看到表单“记住”其数据。当用户点击浏览器的“后退”按钮时,会出现此问题。虽然POST数组具有先前状态的值,但浏览器使用下一个状态的数据填充字段(使用提交后的数据)。

虽然我可以通过关闭表单的自动完成属性在Chrome和Firefox中解决此问题,但这在IE8中没有结果。

任何建议都会非常感谢!

2 个答案:

答案 0 :(得分:1)

听起来您希望表单始终显示您在PHP中回显的值?一个快速而又脏的修复方法是在页面加载时重置表单:

<body onload="document.forms[0].reset();">

您可能需要更新不同页面结构的onload属性,或者如果您的实际应用程序使用jQuery并且您为表单提供ID,则可以更优雅地执行此操作。

我相信有一种方法可以关闭IE中的自动填充/历史每个字段。我必须谷歌那个。编辑:好的,我做了...看起来你有IE正在寻找的表单属性。我不认为这实际上是一个自动完成问题,因为后退按钮试图重新创建页面的最后状态...包括用户所做的更改,特别是填写字段。

这是在文档准备就绪时重置表单的jQuery方法(包括后退按钮)...奇怪的是,jQuery没有实现表单的reset()方法,所以[0]可以获得原始DOM元件。把这些线条添加到你的头上;如果可用,请替换服务器上的本地jquery:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
$(function(){$("#formTest")[0].reset();});
</script>

答案 1 :(得分:0)

如果您通过某种持久性结构运行它们(会话范围可以想到),您可以将其设置为表单上的条件。因此,如果它没有看到表单变量(这是用于传递和查询表单内容的帖子)。因此该语句将替换post isset,而是检查struct'session'(或其他一些范围)是否存在,如果是,则填充。合理?我希望这会有所帮助。