1

附加的 javascript 在 safari 中不起作用。

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

令人惊讶的是,这在 safari 中第一次起作用(但不是在随后的提交期间)。

设想:

  • 用户进行一些更改并按下提交按钮
  • 向用户显示的确认消息
  • 用户决定按取消按钮以留在同一页面上
  • 但后记用户无法再次调用提交。
  • 提交按钮不起作用。

PS:此代码与其他浏览器如 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>
4

1 回答 1

0

是的,这是 WebKit 中的一个错误,尽管对我来说,它似乎在当前的 Chrome 版本中已修复。

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

通常你不会注意到,因为通常你会放置一个不同的处理程序form.onsubmit来短路onbeforeunload(因为通常如果用户单击提交表单,他们知道他们已经更改了一些内容,并且想要保存改变)。

(顺便说一句,避免使用myForm作为全局变量来引用元素id="myForm。这是一些其他浏览器现在已经实现的 IE hack,但仅限于 Quirks 模式,并且您不想处于 Quirks 模式。添加<!DOCTYPE>声明并使用document.getElementById('myForm')。)

于 2010-10-25T12:59:03.883 回答