2011-02-01 14 views
1

私はjqueryでフォーム提出をキャッチしています。インターネットエクスプローラで提出するフォームを停止

この送信ハンドラは、Internet Explorerを除くすべてのブラウザで機能し、送信するだけです。

どうすれば修正できますか?

$('#editForm').live('submit', function() { 
     var data = []; 
     var finalForm = $(this).serializeArray(); 
     var differences = 0; 
     for (var i in initialForm) { 
      if (!objectsAreSame(initialForm[i], finalForm[i])) { 
       data[differences] = finalForm[i]; 
       differences++; 
      } 
     } 
     console.log('diff: ', differences); 
     if (differences > 0) { 
      $.ajax({ 
       url: site_url + 'ajax/contact', 
       type: 'POST', 
       data: { 
        id: finalForm[0].value, 
        method: 'editContact', 
        data: JSON.stringify(data) 
       }, 
       success: function(data) { 
        console.log(data); 
        $('#contact' + finalForm[0].value).hide("drop", {direction: 'up'}, 500, function() { 
         $('#contact' + finalForm[0].value).replaceWith(data); 
         $('#contact' + finalForm[0].value).show("drop", {direction: 'up'}, 500, function() { 
          $(document).trigger('close.facebox'); 
         }); 
        }); 
        return false; 
       } 
      }); 
     } 
     return false; 
    }); 


そのものハンドラを提出... はストレートオフリターン偽を行うことは何もしませんアップ配線ではないように見えます...

+0

「ライブ」を使用している理由はありますか?私はそれが問題だと思う。必要がない場合は、通常のバインドに置き換えてください。 –

+0

IEにスクリプトエラーはありますか?私はいくつかの問題に遭遇しました.IEは、他のブラウザより構文が少し複雑で、スクリプトを決して実行しないようにし、フォームは正常に動作します。 –

+0

連絡先の横にある編集ボタンをクリックすると、フォームが動的に生成されるため、私はライブを使用しています。 – Hailwood

答えて

0

は、すべてのコードの最初に読むには十分きれいではありません。とにかく下にこのI4 ways to better jQuery coding

を読んでいくつかのヒントが

  • あるconsole.log()
  • returnステートメント場所
  • 値(差)をキャッチするためにIEのデバッガを使用してくださいチェック
  • の使用を削除しますif(...){ }の代わりにif(..){ }else{ }ステートメント

最後に、私はそれがこのように書かれるべきだと思う。最初の返信文がどこにあるか確認してください

$('#editForm').live('submit', function() { 
    var data = []; 
    var finalForm = $(this).serializeArray(); 
    var differences = 0; 
    for (var i in initialForm) { 
     if (!objectsAreSame(initialForm[i], finalForm[i])) { 
      data[differences] = finalForm[i]; 
      differences++; 
     } 
    } 
    console.log('diff: ', differences); 
    if (differences > 0) { 
     $.ajax({ 
      url: site_url + 'ajax/contact', 
      type: 'POST', 
      data: { 
       id: finalForm[0].value, 
       method: 'editContact', 
       data: JSON.stringify(data) 
      }, 
      success: function(data) { 
       console.log(data); 
       $('#contact' + finalForm[0].value).hide("drop", {direction: 'up'}, 500, function() { 
        $('#contact' + finalForm[0].value).replaceWith(data); 
        $('#contact' + finalForm[0].value).show("drop", {direction: 'up'}, 500, function() { 
         $(document).trigger('close.facebox'); 
        }); 
       });     
      } 
     }); 
     return false; 
    } 
    return false; 
}); 
4

あなたのコードからすべてのconsole.log()の呼び出しを削除します。これにより、IEでエラーが発生し、return falseは呼び出されません。

+0

+1良い点、本当にあなたのコンソールメッセージを保持したいのであれば(実際には正常に開発するためだけにあるはずですが)、IEを使ってテストしてください:if(window.console)console.log(data);例えば。 – Scoobler

+0

を使用して8を使用すると、f12を押すとコンソールがある開発ツールが表示されます8D – Hailwood

+0

しかし、console.logsを削除しても差異はありません – Hailwood

1

関数に追加します。IEでテストし、falseを返します。また、preventDefault()が呼び出されているかどうかをテストし、そこにある場合はそれを呼び出します。また、関数にイベントを渡す$('#editForm').live('submit', function(e)にあなたの関数呼び出しを変更:

// For IE: 
if ($.browser.msie) e.returnValue = false; 
// Otherwise: 
if(e.preventDefault) e.preventDefault(); 
+0

これはjQueryの使用目的を打ち破っています.jQueryはすでにブラウザ間の違いを洗い出しています。 – Stephen

+0

には何の効果もありません:( – Hailwood

関連する問題