safari javascript问题

时间:2010-10-25 12:01:39

标签: javascript safari onbeforeunload

附加的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>

1 个答案:

答案 0 :(得分:0)

是的,它在WebKit中是bug,但似乎在我当前的Chrome版本中修复了。

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

通常你不会注意到,因为通常你会在form.onsubmit上放置一个不同的处理程序,这会使onbeforeunload短路(因为一般来说,如果用户点击提交表单,他们< em>知道他们已经改变了一些东西,并希望保存更改。

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

相关问题