7

私は1つの入力と1つのボタンを持っています。入力からぼかして入力が変更された場合、price() 関数を呼び出す必要があります。また、ボタンをクリックすると、 price() 関数が呼び出される必要があります。

問題は、ユーザーが入力値を変更してボタンをクリックすると、price() 関数が 2 回呼び出されることです。私はこれが起こることを望んでいません。

入力時に変数「inPriceFunction」をtrueに設定し、設定されていないか確認してから入力するという昔ながらの方法を試してみました。2 つのイベント (ぼかしとクリック) がまったく同時に実行され、if と変数セットが発生する時間がなかったため、これは機能しませんでした。

どうすればそれを回避できますか?

私が試したこと:

<div>
    <input type=text onchange="price();" />
</div>
<button onclick="price();" />test</button>
<script>
called = 0;
function price() {
    if(called == true){
        return;
    } else {
        called = true;
    }
    console.log("called");
    called=false;
}
</script>
4

5 に答える 5

3

アンダースコアはあなたをカバーしています: http://underscorejs.org/#throttle

  • throttle指定した時間内に関数が 2 回呼び出されるのを防ぎます。
  • once関数が2回呼び出されるのを防ぎます。
于 2013-05-17T14:20:33.760 に答える
1

これは、仕事をするjsfiddleです。もちろん、グローバル変数は使用しないでください。

http://jsfiddle.net/SZe26/

var clicktimer = null;

function clickfunc() {
    var BLOCK_TIME = 500;
    function handleclick() {
        console.log("Pressed!");
    }

    if (clicktimer) {
        console.log("Skipping handling of click!");
    } else {
        handleclick();
        clicktimer = setTimeout(function() {
            clicktimer = null;
        }, BLOCK_TIME);
    }
}
于 2013-05-17T14:13:53.113 に答える
0

このようなタイムアウトを追加します

function schedludePrice() {

   if(myTimeOut){
      clearTimeout(myTimeOut);
   }
   myTimeOut = setTimeout('price()', 10);

}

このようにして、blur イベントとクリック イベントによって関数が短時間に 2 回呼び出された場合、Price 関数は 1 回だけ呼び出されます。

于 2013-05-17T13:02:25.810 に答える
0

これを処理する最も簡単な方法は、Price が呼び出されるたびに日時を保存し、それを使用して最近呼び出されたかどうかを確認することです。

if (refDate > new Date(10000 + (new Date())) { // 1  second delay?
    return;
}

refDate = new Date();

ただし、Date への 2 つの呼び出しがまったく同じ日付を返す可能性があります (したがって、日付操作は必要ありません)。

于 2013-05-17T13:02:40.300 に答える