2009-10-30 40 views
0

這可能是一個更通用的瀏覽器/ JavaScript問題比原型特定quesiton,但我認爲這將更好地問在這裏,因爲你們都傾向於真正理解JavaScript和瀏覽器在很多細節。所以在這裏。插入,推遲,原型和追加元素

如果我執行下面的代碼:

HTML:

的Javascript:

$('area').insert({bottom: "<div id="inserted"></div>"}); 

var count = 0; 
var f = function() { 
     if ($('inserted') == null) { 
      console.log("not there"); 
      count++; 
      if (count > 50) { 
        $('area'.insert({bottom: "<div id="inserted"></div>"}); 
        count = 0; 
      } 
      f.defer(); 
     } else { 
     console.log("there"); 
    } 
}; 

f(); 

結果:

大多數的它只是顯示的時間:

there 

,但它的一些做這個

not there 
not there 
not there 
there 

我假設,因爲插入的東西是排隊,然後在瀏覽器中插入的節點進入時間在其下一個事件循環中的DOM。我知道webkit是單線程的,所以這是有道理的,有時它不在那裏,然後它到達那裏,所以真的我想我必須等到它那裏之前,我可以做的插入節點上的「下一件事」。那麼Firefox和IE呢?它們是否都是單線程的? Chrome中會發生什麼?

有時候,我看到下面還發生這實在是關於對我說:

not there 
not there 
... 50 times 
not there 
there 

它發生,每隔一段時間WebKit的(Mac OS)並在iPhone上的WebKit,我可以很容易地複製它。我已經構建了一些簡單的操作,但這一切似乎對我來說都有點瘋狂,因爲當我查看其他代碼時,它們甚至不考慮這一點。將HTML文本插入DOM元素時,他們決不會顯示DOM元素。

任何答案/建議將是超級有用的。

Kiran

+0

Firefox和其他都是單線程的。你應該像這樣聲明你的函數:function f(){... – 2009-10-30 09:00:33

+0

這是正常的,你的代碼中有語法錯誤嗎? DOM準備好後執行f()嗎? document.observe(「dom:loaded」,f); – 2009-10-30 09:03:09

回答

0

我想法比恩的問題是正確的:只是等到DOM被加載。 document.observe("dom:loaded", f);

1

所有這些在dom之後運行:加載所以問題不是dom沒有加載,但有時甚至在加載後內容並不總是顯示出來。經過更多的研究後,我發現這似乎發生在iPhone Safari瀏覽器上,但不在桌面版本上。這可能只是一個時間問題。感謝您花時間回答問題。