2011-10-17 61 views
3

我無法弄清楚這段代碼有什麼問題。它在chrome中運行一次,然後崩潰然後運行,等等。它不能在Firefox和IE中運行。與定時器異步運行

<html> 
<head> 
<title> Async Module Runner </title> 
<script type="text/javascript"> 

var TestRunner = (function(){ 
var queue = []; 
var paused = false; 

return { 
    run : function(fn) { 
     queue.push(fn); 
     if(queue.length > 0 && paused != true && queue[0] != undefined) { 
      queue.shift()(); 
     } 
    }, 

    pause : function(){ 
     paused = true; 
    }, 

    resume : function(){ 
     paused = false; 
     this.run(); 
    } 
}; 
})(); 

var AsyncRunner = {}; 
AsyncRunner.wait = function(fn, time) { 
TestRunner.pause(); 
setTimeout(function(){ 
    fn(); 
    TestRunner.resume(); 
}, time); 
}; 

var Test = { 
setUp : function(){ 
    document.write('yep! <br />'); 
}, 

tearDown : function(){ 
    document.write('yep yep <br />'); 
}, 

testAsync1 : function(){ 
    AsyncRunner.wait(function(){ document.write('okay! <br />'); }, 3000); 
}, 

testAsync2 : function(){ 
    AsyncRunner.wait(function(){ document.write('okay again <br />'); }, 2000); 
}, 

testAsync3 : function(){ 
    AsyncRunner.wait(function(){ document.write('okay again and again!! <br />'); }, 5000   ); 
} 
}; 

window.onload = function(){ 
for(var i in Test) { 
    TestRunner.run(Test[i]); 
} 
}; 
</script> 
</head> 
<body> 
</body> 
</html> 

我錯過了一些重要的JavaScript?我究竟做錯了什麼??

UPDATE 的代碼運行在以下瀏覽器:Chrome的14.08 - Safari瀏覽器5.1 它也將在JsFiddle.net按預期運行。 它將工作但碰撞反覆在Chrome 5.0 它停止時,它具有運行在以下瀏覽器含有SyncRunner.wait()函數 - 而不發出任何錯誤:火狐3.6 - IE 9 - 劇10.61

UPDATE 2 經過Narenda提供的答案進行了一點調查後,似乎FF 4及以上在這裏遇到了麻煩。但是我並沒有與其他瀏覽器的根本原因。 因此,在非WebKit瀏覽器是使用document.write() 替換爲以下功能document.write()的,它現在應該正常工作的問題:

function print(message) { 
    var loc = document.getElementById('logpanel'); 
    var tag = document.createElement('li'); 
    if(message != undefined){ 
     tag.appendChild(document.createTextNode(message)); 
     loc.appendChild(tag); 
    } 
} 

我仍然有興趣知道哪裏出了錯與其他瀏覽器 感謝

+0

您需要返回標籤前:) –

+0

@RichBradshaw:謝謝!!!! – Eric

+1

頁面加載後使用document.write會導致問題。 http://stackoverflow.com/questions/802854/why-is-document-write-considered-a-bad-practice – BNL

回答

1

我得到的錯誤

「嘗試運行編譯和去腳本在清理範圍」

當我在firefox中運行這個。當它試圖在AsyncRunner.wait內調用fn()時會發生這種情況。

看起來像這是在Firefox 4及以上的錯誤。看看這些相關的做題 Error: Attempt to run compile-and-go script on a cleared scope(特別是關於使用document.write最後的答案會談)和 jQuery Animation error = attempt to run compile-and-go script on a cleared scope

我無法重現程序的崩潰對鉻。

+0

謝謝!事實上,Chrome中的崩潰是針對版本5的,而且會下降。請參閱編輯。你是對的:這是問題:document.write()!通過閱讀提供的答案,似乎發生在編寫不好的代碼時:我寫的代碼有什麼不好?總結一下,我寫了一個使用Dom的自定義函數,並用它替換document.write()。它現在有效!請參閱更新問題 – Eric

+0

我不認爲你的代碼有什麼問題,這是瀏覽器實現中的一個錯誤。 –