2009-12-24 80 views
1

如果您确定要关闭/刷新您输入的某些表单的页面,Safari有一项功能可提示您。这在大多数情况下都很有用,但在这种情况下,它正在扰乱我。如何避免Safari中的未保存表单警告

我劫持了某些表单上的“submit”事件并通过XMLHttpRequest发送给服务器。然而,Safari并不知道,所以当我想关闭这个标签时,它会显示那个表单值已经改变的该死的警告。

我知道如何在OS X中关闭它,但我不想那样做。我想在我正在构建的特定网页上关闭它,并为所有使用Safari的用户关闭它。当然,必须有一些JavaScript方式 - 我不在乎它是否专有于webkit。

更新:我试过了,但没有效果。 Safari首先警告未保存的数据,然后触发“beforeunload”事件。

if (Prototype.Browser.WebKit) 
    window.addEventListener('beforeunload', function(e) { 
    forms.invoke('reset') 
    }) 
+0

这些字段中的数据已准确提交后有什么好处? – 2009-12-24 15:40:41

+0

表单字段是UI的一部分。用户可以编辑一些字段,提交更改,然后再次编辑,提交并重复。但是,如果他关闭标签页,Safari会警告他们他们会丢失未保存的数据,这可能不是真的。 – mislav 2009-12-26 15:44:09

回答

0

我看到周围,这是具有仅隐藏的输入形式consisiting,和一群不与表格相关联的输入元件的剩下的唯一方式。提交时,您从元素中获取值,发出请求并重置内部表单。您甚至可以通过DOM将输入元素移出表单,以便它甚至可以优雅地降级。

大量的工作和有点hacky,但只要我能看到唯一的选择,如果你不能改变工作流程。

1

我不知道Safari那么深,但如果你只是提交值而不需要它们,为什么不简单地重置窗体呢?我希望没有改变=没有警告。

如果您不想马上重设,您甚至可以尝试将重置命令挂钩到unbeforeunload事件以在关闭页面时执行此操作。不管这种方式是否有效,取决于Safari何时检查更改后的表格 - 在调用unload之前或之后。

+0

这是一个好主意 - 我只是尝试过,但它不起作用:(更新后的解释 – mislav 2009-12-24 04:26:16

+0

提交后直接重置表单不是一个选项吗? – 2009-12-24 15:47:48

+0

这将是糟糕的用户体验 - 用户可以通过编辑记录几个表单域并仅提交更改以查看那些相同的域被重置为其初始值。 – mislav 2009-12-26 15:42:17

1

这就是应用程序行为,所以一定不能有任何修改它的JavaScript方法。每个WebKit特定功能都记录得非常好,而且我从来没有见过类似的东西。如果你真的担心这个问题,请清理你的表单栏。

http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariWebContent/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002079-SW1

http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariHTMLRef/Introduction.html#//apple_ref/doc/uid/30001261

0

在绑定提交后,尝试从Javascript窗体标记中删除actionmethod属性。通过这种方式,Safari不应再将输入视为真实表单的一部分。