Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Browser Safari和Chrome后退按钮在表单中隐藏和提交值_Browser_Webkit - Fatal编程技术网

Browser Safari和Chrome后退按钮在表单中隐藏和提交值

Browser Safari和Chrome后退按钮在表单中隐藏和提交值,browser,webkit,Browser,Webkit,以下问题同时发生在Safari和Chrome上,因此可能是WebKit问题 页面A:一个需要您登录才能查看的页面,包含一个具有type=submit按钮、name=submit和value=A的表单 B页:另一页 页面C:要求用户登录页面,包含一个带有type=submit按钮、name=submit和value=C的表单 用户访问A页,然后访问B页。然后空闲,用户的登录会话超时。用户点击后退按钮返回A页。浏览器将用户重定向到C页 在Safari和Chrome上,当呈现C时,C页上的表单有typ

以下问题同时发生在Safari和Chrome上,因此可能是WebKit问题

页面A:一个需要您登录才能查看的页面,包含一个具有type=submit按钮、name=submit和value=A的表单

B页:另一页

页面C:要求用户登录页面,包含一个带有type=submit按钮、name=submit和value=C的表单

用户访问A页,然后访问B页。然后空闲,用户的登录会话超时。用户点击后退按钮返回A页。浏览器将用户重定向到C页

在Safari和Chrome上,当呈现C时,C页上的表单有type=submit按钮,name=submit,但值显示为“a”

如果在C页上重新加载,则“C”将显示为name=submit按钮的值

类型=隐藏的输入字段也会出现同样的问题;当用户点击后退按钮时,它们的值也会从其他表单更改为其他值。同样,这个问题也会在没有重定向的情况下出现,只需提交,然后返回。在这种情况下,上一页呈现的隐藏和提交CGI变量的值不正确

到目前为止,我能想到的唯一修复方法是在加载第C页后,使用Javascript重置type=hidden和type=submit变量值,以确保这些值是正确的。但这并不干净,也不是普遍适用的

除了WebKit修复此错误外,是否有人找到了更好的解决方法


谢谢。

我不确定,但请尝试在所有表单中添加autocomplete='off'

<form .... autocomplete = 'off'>

经过大量挖掘,我找到了答案。好吧,不是答案,但为什么会这样。我希望这能为其他人节省一些时间

当前基于WebKit的浏览器(截至2010年3月16日),例如Safari和Chrome,存在以下缺陷。也许有人可以看看。谢谢

错误1:如果一个页面a有多个表单元素F1和F2,并且第一个表单F1(按HTML中的显示顺序)的自动完成设置为“关闭”(即),但F2的自动完成设置为“打开”(默认行为),那么在离开页面a导航后,点击浏览器返回按钮返回到页面a,F1和F2可能无法正确自动完成。特别是,如果F1和F2都有相同名称和类型的输入元素,例如N和T(即),那么当使用“后退”按钮导航回A页时,F1.N的值将用F2.N的值自动完成

错误2:首先,浏览器点击页面A,服务器返回一个包含表单元素F1和F2的HTML页面(两个表单都将“自动完成”设置为on)。然后,用户导航离开A页,然后使用浏览器返回按钮返回A页。在第二次访问页面A时,WebKit向服务器发出另一个请求A(这与FireFox的行为不同,FireFox在返回按钮上没有向服务器发出添加请求)。如果服务器返回不同的HTML页面(例如,因为用户会话已注销),表单元素F3和F4与F1和F2不同,但由具有相同名称和类型的输入元素组成,则F3和F4将使用F1和F2输入元素值自动完成,即使输入元素类型为hidden和submit

变通

错误1:永远不要使用autocomplete=“off”,除非您为同一HTML页面上的所有表单设置了此选项

错误2:具体情况,没有好的通用解决方案。我们找到了一个可接受的解决方法,包括隐藏表单,以确保A页的两个版本具有相似的表单;第一个版本有F1、F2、F3,第二个版本有F1、F2'和F3,其中F2'是F2的隐藏版本。如果我们不包括F2',那么页面A的第二个版本是F1,F3和F3将自动使用F2的元素值完成,即使对于F3中的隐藏和提交元素也是如此

WebKit代码分析

这两个错误发生在代码的同一部分,但可能被视为两个独立的错误。代码位于WebKit代码树的WebCore子目录中

错误1:在Document::formElementsState中,启用了自动完成功能(通过HTMLInputElement::saveFormControlState检查)的输入元素的状态保存在向量中。但是,在HtmlFormControllementWithState::finishParsingChildren中,无论autocomplete是启用还是禁用,每个表单元素都会从前面提到的向量恢复状态。这导致错误1

Bug 1修复:这应该是一个相当直接的修复-如果元素关闭了autocomplete,finishParsingChildren不应该恢复状态

免责声明:我不在Mac上开发。我只使用它,我们开发了一个网站。我今天只是浏览WebKit代码。因此,我没有创建或测试补丁

错误2。这要复杂得多

我假设在与自动完成无关的设计决策中,WebKit被设计为在用户使用“后退”按钮返回历史页面a时重新获取页面a

(我也有兴趣听到这个消息)

从根本上说,WebKit错误地假设第二次获取页面A会产生与第一次获取相同的HTML,或者至少是相同的表单集。如果情况并非如此,则自动完成逻辑不再产生正确/预期的行为

当WebKit保存页面的状态时,它调用Document::formElementsState,它只创建一个成对的映射,并将每个输入元素的名称+类型和值对放入映射中。如果两个单独表单中的两个输入元素具有相同的名称和类型,则两个值都将保存

例如,假设页面A有形式F1和F2,F1有名称为a1和a2的输入元素,类型为t1和t2,值分别为v1和v2。F2的输入元素名为a3和a2,类型为t1和t2,值分别为v3和v4。WebKit将此页面的状态保存为(JSON格式)

{“a1,t1”:[v1],“a2,t2”:[v2,v4],“a3,t1”:[v3]}

如果用户使用浏览器后退按钮重新访问页面,WebKit将尝试