2016-09-14 10 views
1

をトリガするために停止するために何かを待ち、ユーザーが日を変更した場合、あまりにも速くJavaScriptが機能するために、正しい日付を誘発しないことを除いてすべては、完璧です。私はずるいツール<a href="http://darsa.in/sly/" rel="nofollow">darsa.in</a>で作成した日付ピッカーを使用している機能に

が行うための方法はあります:

if (datepicker not active for x seconds) 

または変数を作成し、その変数がx時間中に変化しない場合にのみ機能を起動する方法はありますか? JSに時間を与える必要があるので、ユーザーが目標とする日付になるまで関数をトリガーしません。

いくつかのコードは、以下に従います。

日ピッカーの変更の日は、私はHTMLの中にすべての一致をロードするloadDateMatches()呼び出します。しかし、あなたが変更した場合、例えば、非常に迅速に1日目と5日目の間に、それは私が持っているまで機能loadDateMatches()をトリガしませへの道を探しています一日数3

に試合をロード停止することがあります日付を変えずにしばらくしていた。

days.on('active', function (eventName) { 
    activeDate= this.rel.activeItem; 
    var logDate = new Date(d.getFullYear(), 0, activeDate + first + 1); 
    var startTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 0, 0, 0); 
    DayBarConditions.startTime = startTime.getTime()/1000; 
    var endTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 23, 59, 59); 
    DayBarConditions.endTime = endTime.getTime()/1000; 
    if (typeof loadDateMatches == 'function') { 
     loadDateMatches(); 
    } 
}); 
+0

あなたは何をしようとしているのかを人々が見られるようにいくつかのコードを追加できますか? – httpNick

+0

私はそれを追加しましたが、とにかく私はそれが私が夢中になっているものを打ち負かすのは難しいことを知っています。私の英語はまったく完璧ではありません –

+0

datepickerに付属のオン選択機能を試してみてください - http://api.jqueryui.com/datepicker/#option-onSelect-クローズ機能で結合します。これら2つの関数を使用すると、他の関数の実行を停止することができます – Tasos

答えて

0

日付ピッカーは、そのセットの日は、それがそうならば、情報をロードし、変更されたときと同じであるかどうかを最初にチェック遅延に関数を呼び出した試してみてください。私は以下のコードは機能するはずだと信じていますが、テストされていません。

days.on('active', function (eventName) { 
    activeDate= this.rel.activeItem; 

    // We have to put this in a separate function, so that it evaluates activeDate 
    // when the date picker is changed, not when activateDelayed is called 
    (function(activeDate) { 
     //Activate the function after .5 seconds if date remains unchanged 
     window.setTimeout(activateDelayed, 500, activeDate); 
    })(activeDate); 
}; 
function activateDelayed (oldDate) { 
    activeDate = days.rel.activeItem; 
    if (oldDate == activeDate) { 
     var logDate = new Date(d.getFullYear(), 0, activeDate + first + 1); 
     var startTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 0, 0, 0); 
     DayBarConditions.startTime = startTime.getTime()/1000; 
     var endTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 23, 59, 59); 
     DayBarConditions.endTime = endTime.getTime()/1000; 
     if (typeof loadDateMatches == 'function') { 
      loadDateMatches(); 
     } 
    } 
}); 
0

あなたはloadDateMatchesを実行するために持っている要求の数を追跡し、このコードを、使用することができます。最初の機能の場合は、すぐに機能が実行されますが、クールダウン期間が経過するまで要求カウンタは減少しません。そのときだけカウンタが減少します。そのカウンタは1ですが、別のリクエストを追加することはできますが、最初のクールダウン期間が終了した場合にのみ実行されます。そのクールダウン期間中の任意のより多くの要求が何も変更されません - 最大1つの要求は、クールダウン後の実行のために保留されますで:

var requests = 0; 

days.on('active', function (eventName) { 
    // ... your existing code, setting DayBarConditions properties, comes here. 
    // ... 
    if (typeof loadDateMatches == 'function') { 
     // Keep track of number of requests    
     if (requests < 2) requests++; 
     // Ignore this when there is currently a cool-down ongoing, and 
     // another execution is already pending: 
     if (requests == 2) return; 
     (function loop() { 
      loadDateMatches(); 
      setTimeout(function() { 
       // Cool down has passed: repeat when new request is pending 
       if (--requests) loop(); 
      }, 500); 
     })(); 
    } 
}); 

をので、このコードは、非常に最初のリクエストを遅らせません。さらなるクールダウン期間を導入し、それ以降のリクエストは1つに結合され、クールダウン期間が終了したときにのみ実行されます。

しかし、あなたがloadDateMatchesで実行しているどのコードに応じて、より良い解決策があるかもしれません。

関連する問題

 関連する問題