2017-03-23 13 views
0

電子メールを作成するフォームでは、タイマーを使用して変更を自動保存します。これは正常に動作します。しかし、フォームが提出されると、特にIE11でレースが行われるようです。送信時に、送信が行われる前に自動保存をオフにします。本番環境では、ドラフトを保存してフォームを送信するためにサーバーへの同時呼び出しが行われます。提出時にフォームの自動保存をオフにする

var timeoutId; 
var deleted = false; 

// setup a call to onFormChange when a change happens 
$('form input, form textarea').on('input propertychange change', function() { 
    onFormChange(); 
}); 

function onFormChange() { 
    // call saveDraft 1 second after changes happen 
    clearTimeout(timeoutId); 
    timeoutId = setTimeout(function() {saveDraft();}, 1000); 
} 

// saveDraft saves the current form state in the draft. 
function saveDraft() { 
    if (deleted == true) { 
    // don't save because we're done 
    return; 
    } 
    var fromval = $("#from").val(); 
    var subject = $("#subject").val(); 
    var body = $("#body").val(); 

    // 
    // upload is done here using $.post() 
    // 
} 

$('form').submit(function(e){ 
    // stop saving drafts when we do a submit 
    deleted = true; 
    if($(this).hasClass('form-submitted')){ 
    e.preventDefault(); 
    return; 
    } 
    $(this).addClass('form-submitted'); 
}); 
+0

「clearTimeout(timeoutId);」で自動保存を無効にしたようですか、間違っていますか?送信ハンドラ内で自動保存を無効にしようとしますか? – David

+1

XHRリクエストが提出された後に処理中である可能性があります。あなたの '$。post 'をグローバル変数に設定し、' deleted = true'と同じ場所で 'myVar.abort()'を呼び出して保留中のドラフト保存要求をキャンセルしてみてください。 – sheng

+0

@David 'deleted' varがこれを処理します – sheng

答えて

2

フォームを送信するときにタイマーを停止します。

$('form').submit(function(e){ 
    // stop saving drafts when we do a submit 
    deleted = true; 
    if($(this).hasClass('form-submitted')){ 
    e.preventDefault(); 
    return; 
    } 
    $(this).addClass('form-submitted'); 
    clearTimeout(timeoutId); 
}); 
+0

ああ、それを逃しました。タイマーに気付くため+1。したがって、最適な解決策は、タイムアウトをクリアし、保留中のXHRをキャンセルすることです。 – sheng

関連する問題