2010-10-25 134 views
1

附加的javascript在Safari浏览器中不起作用。safari javascript问题

此脚本在导航离开当前页面之前显示一条确认消息。

令人惊讶的是,这是第一次在safari中工作(但不是在随后的提交过程中)。

场景:

  • 用户进行一些更改,然后按提交按钮
  • 确认消息显示给用户
  • 用户决定按下取消按钮退后同一页面
  • 但后记用户上无法再次调用提交。
  • 提交按钮不起作用。

P.S:此代码完美适用于其他浏览器,即IE7/8,FireFox。

function checksave() { 
    if (formIsDirty(myForm)) { 
    return "The form has been changed..."; 
    } 
} 

function formIsDirty(form) { 
    for (var i = 0; i < form.elements.length; i++) { 
    var element = form.elements[i]; 
    var type = element.type; 
    if (type == "checkbox" || type == "radio") { 
    if (element.checked != element.defaultChecked) { 
    return true; 
    } 
    } 
    else if (type == "hidden" || type == "password" || type == "text" || 
    type == "textarea") { 
    if (element.value != element.defaultValue) { 
    return true; 
    } 
    } 
    else if (type == "select-one" || type == "select-multiple") { 
    for (var j = 0; j < element.options.length; j++) { 
    if (element.options[j].selected != 
    element.options[j].defaultSelected) { 
     return true; 
    } 
    } 
    } 
    } 
    return false; 
} 

<body OnBeforeUnload ="return checksave();"> 
<form id="myForm" > 
    <table border="1"> 
    <tr> <td>Enter Text:</td><td><input id="text1" type="text" value=""/> <br/> </td></tr> 
    <tr> <td><input id="button1" type="submit" value="Submit1"/> <br/> </td> <td><input id="button2" type="submit" value="Submit2"/> <br/> </td></tr> 
    </table> 
</form> 
</body> 
+0

在这里回答? http://stackoverflow.com/questions/803887/can-i-pop-up-a-confirmation-dialog-when-the-user-is-closing-the-window-in-safari – Mantar 2010-10-25 12:08:04

回答

0

啊,这是在WebKit的一个bug,但一个似乎被固定在目前的Chrome版本我。

似乎当表单提交从beforeunload提示被取消时,页面上的所有表单都成为不可提交(submit事件仍然会触发但提交无法导航),直到页面上的任何表单域被更改。 (这与你自己的形式变化检查无关,浏览器本身会阻止导航,直到它发现变化,或许某种形式多次提交预防技巧出错了,或者什么?)

通常你不会注意到,因为通常你会在form.onsubmit上放置一个不同的处理器,这会使onbeforeunload短路(因为一般情况下,如果用户点击提交表单,他们会知道他们已经改变了一些东西,并且想要以保存更改)。

(顺便说一句,避免使用myForm为全局变量与id="myForm引用的元素,这是一个IE浏览器黑客,其他一些浏览器现在已经实现,但只有在Quirks模式,你希望在怪癖模式。添加一个<!DOCTYPE>声明和使用document.getElementById('myForm')。)

+0

Appriciate 非常适合你详细的解释。这清除了我的想法,但是想知道是否有可用的解决方法。这仍然是safari/windows 5.0.2(7533.18.5)的一个问题。我们的客户要求实现这个功能,因为我们的应用程序支持需要由用户填写的lenthy输入表单。我们喜欢有一些通用的JavaScript解决方案,所以不想处理每个控件事件(即onclick) – Kannan 2010-10-25 15:05:21

+0

您只需要处理每个表单的提交('onsubmit';'onclick'通常是处理提交的不好的地方) ,如果你需要确认提示,使用'confirm()'写一个标志来消除'onbeforeunload'。我希望你仍然希望这样做,因为当你实际上正在保存的时候,你通常不需要关于离开页面而不保存的信息。 – bobince 2010-10-25 15:28:30