1

添付のJavaScriptはSafariでは機能しません。

このスクリプトは、現在のページから移動する前に確認メッセージを表示します。

驚くべきことに、これはサファリで初めて機能します(ただし、その後の送信中は機能しません)。

シナリオ:

  • ユーザーが変更を加えて送信ボタンを押す
  • ユーザーに表示される確認メッセージ
  • ユーザーがキャンセルボタンを押して同じページに戻ることにしました
  • しかし、afterwordユーザーはsubmitを再度呼び出すことができません。
  • 送信ボタンが機能しません。

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バージョンで修正されているようです。

アンロード前のプロンプトからフォームの送信がキャンセルされると、ページのsubmitフォームフィールドが変更されるまで、ページ上のすべてのフォームが送信不能になります(イベントは引き続き発生しますが、送信はナビゲートされません)。(これは、独自のフォーム変更チェックとは関係ありません。ブラウザ自体が、変更に気付くまでナビゲーションをブロックします。フォームの複数送信防止のトリックがうまくいかなかったのではないでしょうか?)

form.onsubmit通常は、短絡する別のハンドラーを配置するため、気付かないでしょうonbeforeunload(通常、ユーザーがフォームをクリックして送信している場合、ユーザーはフォームに何かを変更したことを認識しており、変化する)。

(ちなみに、myForm要素を参照するためのグローバル変数としての使用は避けてくださいid="myForm。これは、他の一部のブラウザが実装しているIEハックですが、Quirksモードでのみ実行され、Quirksモードにはなりたくありません<!DOCTYPE>。宣言を追加して使用しますdocument.getElementById('myForm')。)

于 2010-10-25T12:59:03.883 に答える