2012-03-25 11 views
0

私はAJAX呼び出しでその内容を自動保存する要素を持っています。現在、内容が変更されるたびにオートセーブ機能が呼び出されます。しかし、これを少し制限してサーバー要求の数を減らしたいと思います。次のコードを編集する最良の方法は何でしょうか?save()はn秒に一度しか呼び出されません。JQueryで過度の関数呼び出しを防ぐ方法

$("#editorInstance").contentChange(function() { 
    save(); 
}); 

答えて

3

あなたが別のライブラリを気にしない場合は、アンダースコアがこれを扱うことができるthrottle methodがあります

スロットル_.throttle(function, wait)

が作成し、新しいを返し、渡されたのバージョンを絞ります繰り返し呼び出されたときには、実際に呼び出す関数は、たいていミリ秒ごとに1回だけ元の関数を呼び出します。あなたが追いつくよりも速く起こるレート制限イベントに役立ちます。これは私がそれを解決する方法です

var throttled = _.throttle(updatePosition, 100); 
$(window).scroll(throttled); 
2

あなたはのsetTimeout()あなたはそれが保存されているエディタを無効にすることができます

var init; 
$("#editorInstance").contentChange(function() { 
    init = setTimeOut(save, 60000); //After a minutes 
}); 

//Do you forget to clear the timeout too 
function save() { 
    clearTimeOut(init); 
    //Remaining function 
} 

かを、使用して、関数の実行を遅らせることができます。

$("#editorInstance").contentChange(function() { 
    $(this).attr('disabled', true); 
    save(); 
    $(this).removeAttr('disabled'); 
}); 
+1

は、おそらくあなたは、 'てclearTimeout()'新しい 'のsetTimeoutを追加する前に()'を追加する必要があります。 https://developer.mozilla.org/en/DOM/window.clearTimeout#Example – sissonb

+0

@sissonb、確かに、私は答えを更新しました。 :) – Starx

1

$("#editorInstance").contentChange(function() { 
    if(!window.saveTimeout) 
     window.saveTimeout = setTimeOut(save(), 60000); 
    else 
     clearTimeout(window.saveTimeout); 
     window.saveTimeout = setTimeOut(save(), 60000); 
}); 
関連する問題