2009-09-19 96 views
1

我正在使用jQuery來偵聽DOMSubtreeModified事件,然後執行一個函數。我需要的是一種只在每個事件爆發時運行一次功能的方法。所以在這種情況下,事件將僅在1秒後運行,並且在3秒後再次運行。做這個的最好方式是什麼?

使用jQuery爲每個事件突發運行一次函數

jQuery的

$(function(){ 

    setTimeout(function(){ 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
    },1000); 

    setTimeout(function(){ 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
    },3000); 

    $('#container').bind('DOMSubtreeModified',function(){ 
     console.log('event'); 
     functionToRun(); 
    }); 

}); 

HTML

<div id="container"></div> 


更新
setTimeout函數的存在只是爲了模仿我的問題。我需要一個解決方案,而無需更改setTimeout代碼。我遇到的問題是我得到了突發的DOMSubtreeModified事件,並且每次爆發只需要一次。

+0

如果我理解正確,'setTimeout'的東西不是你所問的。你想知道如何修改元素6次,但是'functionToRun'只運行一次,是否正確? – 2009-09-19 14:32:33

+0

是:) – 2009-09-19 14:37:43

回答

1

解決它我。

$(function(){ 

    setTimeout(function(){ 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
    },1000); 

    setTimeout(function(){ 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
    },1100); 

    setTimeout(function(){ 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
     $('#container')[0].innerHTML = 'test'; 
    },3000); 

    addDivListener(); 

}); 

function addDivListener() { 
    $('#container').bind('DOMSubtreeModified',function(){ 
     functionToRun(); 
     $(this).unbind('DOMSubtreeModified'); 
     setTimeout(addDivListener,10); 
    }); 
} 

function functionToRun(){ 
    console.log('event'); 
} 

此打印出事件 3次在Firebug控制檯,並精確到100毫秒。

0

這似乎是你在找什麼:

$(
    function() 
    { 
    setTimeout 
    (
     StartWatching, 
     1000 
    ); 
    } 
); 

function StartWatching() 
{ 
    $('#container') 
    .bind(
      'DOMSubtreeModified', 
      function() 
      { 
       console.log('event'); 
       StopWatchingAndStartAgainLater(); 
      } 
     ); 
} 

function StopWatching() 
{ 
    $('#container') 
     .unbind('DOMSubtreeModified'); 
} 

function StopWatchingAndStartAgainLater() 
{ 
    StopWatching(); 
    setTimeout 
    (
    StartWatching, 
    3000 
); 
} 

這加強了以下流程:

Document.Ready 
Create DOM watching event after one second 
On event, turn off event and recreate it after three seconds, rinse, repeat 
+0

語法錯誤,如果我修復它,它仍然只打印出1個事件。 – 2009-09-19 16:04:42

+0

@mofle ...對setTimeout函數的調用做了一些細微的改動。我會在本地測試它來驗證這個工作。 – 2009-09-19 16:25:29

+0

@mofle ...確認上述工作時,我將StartWatching更改爲簡單附加到div並撥打StopWatchingAndStartAgainLater。如果這仍然失敗,那麼有可能是某些東西不適用於綁定到DOMSubtreeModified事件。 – 2009-09-19 16:30:14

0

嘗試使用one()處理

documentation

+0

對不起,我不能詳細說明並重寫你的代碼,我很着急。但如果你無法弄清楚,我可以稍後再做。 – 2009-09-19 14:38:57

+0

已經嘗試過了,但它只給我一個事件,從第一個事件爆發(第一個超時)開始,第二個爆發沒有任何事件。 – 2009-09-19 14:39:21

3

替代方法,它將控制任何函數的速率。

// Control the call rate of a function. 
// Note that this version makes no attempt to handle parameters 
// It always induces a delay, which makes the state tracking much easier. 
// This makes it only useful for small time periods, however. 
// Just clearing a flag after the timeout won't work, because we want 
// to do the the routine at least once if was called during the wait period. 
throttle = function(call, timeout) { 
    var my = function() { 
    if (!my.handle) { 
     my.handle = setTimeout(my.rightNow, timeout); 
    } 
    }; 
    my.rightNow = function() { 
    if (my.handle) { 
     clearTimeout(my.handle); 
     my.handle = null; 
    } 
    call(); 
    }; 
    return my; 
}; 
+0

謝謝!在我的Chrome擴展程序中使用此功能(https://github.com/yuvipanda/yenWikipedia)。 – Yuvi 2011-04-28 22:40:18

相關問題