3

次の HTML ページがあります。

<html>
<script>
   var global = {};
   global.obj = {
      // when called this function will cause 'hello' to be output to the
      // console every 1 second
      repeat: function () {
         setInterval(function () {
            console.log('hello');
         }, 1000);
      }
   }

   global.obj.repeat();
   global.obj = [];

   // even after we overwrite global.obj, 'hello' 
   // continues to be output to the console every second
</script>
</html>

繰り返しに似た関数を書きたいのですが、global.obj が上書きされると setInterval が呼び出されなくなります。

4

2 に答える 2

2

ゲッター/セッターを使用する必要があります。Mozillaにはこれに関する優れたドキュメントがあります。

少し調整する必要があるかもしれません:

var intervalRef = null;

var global = {objRef: {}};
global.__defineSetter__("obj", function(o) {
  if (intervalRef)
    clearInterval(intervalRef);
  intervalRef = null;
  global.objRef = o;
});

global.__defineGetter__("obj", function() {
  return global.objRef;
});

global.obj = {
  repeat: function () {
     intervalRef = setInterval(function () {
        console.log('hello');
     }, 1000);
  }
}

global.obj.repeat();
setTimeout(function() { //this just demonstrates that you can let it run for 5 secs before clearing the timer.
  global.obj = [];
}, 5000); 

これをテストし、動作することを確認しました。

于 2012-09-06T19:33:10.773 に答える
1

このフィドルを参照してください:

// html
<p id="stopper">Click</p>​

// js
var counter = new Object();

counter.timer = setInterval( function(){
    console.log("Hello!");
}, 1000 );

$("#stopper").click(function(){
    console.log("Stopping");
    clearInterval(counter.timer);
});
​
于 2012-09-06T19:41:42.910 に答える