【问题标题】:safari javascript issueSafari javascript 问题
【发布时间】:2010-10-25 20:59:03
【问题描述】:

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

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

令人惊讶的是,这在 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>

【问题讨论】:

标签: javascript safari onbeforeunload


【解决方案1】:

是的,它是 WebKit 中的 bug,不过对我来说,它似乎在当前的 Chrome 版本中已修复。

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

通常您不会注意到,因为通常您会在 form.onsubmit 上放置一个不同的处理程序,这会使 onbeforeunload 短路(因为通常如果用户单击提交表单,他们知道 他们已经更改了上面的内容,并希望保存更改)。

(顺便说一句,避免使用myForm 作为全局变量来引用id="myForm 的元素。这是一些其他浏览器现在已经实现但仅在Quirks 模式下实现的IE hack,你不要' t 想要进入 Quirks 模式。添加 &lt;!DOCTYPE&gt; 声明并使用 document.getElementById('myForm')。)

【讨论】:

  • 非常感谢的详细解释。这让我头脑清醒,但想知道是否有任何解决方法可用。这仍然是 safari/windows 5.0.2(7533.18.5) 的问题。我们的客户要求实现此功能,因为我们的应用程序支持需要用户填写的冗长输入表单。我们喜欢有一些通用的 javascript 解决方案,所以不想处理每个控件事件(即 onclick)
  • 您只需要处理每个表单的提交(onsubmit;onclick 通常是处理提交的不好的地方),使用 confirm() 编写一个标志以使 onbeforeunload 静音如果您需要确认提示。无论如何,我希望您希望这样做,因为您通常不希望在实际执行的操作是保存时不保存就离开页面的相同消息。
猜你喜欢
  • 2010-12-21
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多