0

ウィンドウがフォーカスされている場合、 jQuery を使用して関数を呼び出す際に問題が発生しました。また、ウィンドウがフォーカスされていない場合 (onblur) は、ウィンドウが再びフォーカスされるまでその関数を一時停止します。

これが私のコードです:

function functiondosomething (user_id) {

var myInterval;
var time_delay = 1000;


    $(window).focus(function () {

 setTimeout(function() { functiondosomething (user_id); }, time_delay);


    }).blur(function () {
        clearTimeout(myInterval); // Clearing interval on window blur

    });

 setTimeout(function() { functiondosomething (user_id); }, time_delay);// ## problem here

}

私の問題は:

  1. その行を削除すると(上記で問題をマークしました。)、ウィンドウの外をクリックしてオンブラーにし、再びフォーカスに戻るまで、関数は最初は機能しないため、機能し始めます。

  2. その行(上記で問題をマークしました)をそのままにしておくと、ウィンドウの外をクリックしてonblurにしても、関数は一時停止できませんでした。

  3. onfocus をクリックすると、機能し始めて停止します。ウィンドウの外をクリックして、ウィンドウを何度もフォーカスする必要があります。そのようなものは、ウィンドウの外をクリックして再度ウィンドウにクリックしてアクティブにする必要があります。

    私は何をすべきか ?

4

1 に答える 1

0

ここにいくつかの問題があります。

  1. 設定していないmyIntervalので、呼び出しclearTimeout(myInterval)ても何もクリアされません。
  2. 同じ関数を使用してリスナーを設定し、setTimeout再帰的に呼び出しています。これは、再帰するたびにハンドラーが設定されていることを意味し、再帰とは、ハンドラーが実行されるかどうかに関係なく実行されることを意味します。

物事を少し分ける必要があると思います:

function functiondosomething(user_id) {
  // Do stuff...
}

function setupHandlers(user_id) {
  var myInterval;
  var time_delay = 1000;

  function doSomethingWrapper() { 
    functiondosomething(user_id);
    myInterval = setTimeout(doSomethingWrapper, time_delay); 
  }

  $(window).focus(function () {
    doSomethingWrapper();
  }).blur(function () {
    clearTimeout(myInterval); // Clearing interval on window blur
  });
  doSomethingWrapper();
};
于 2013-09-09T19:30:47.160 に答える