Insert,Defer,Prototype和Append元素

时间:2009-10-30 07:25:15

标签: javascript html dynamic prototypejs

这可能是一个比原型特定问题更通用的浏览器/ javascript问题,但我认为最好在这里问一下,因为你们都倾向于真正理解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是单线程的,所以这是有道理的,有时它不存在然后它到达那里,所以我想我必须等到它之前我可以在那个插入节点上做“下一件事”。那火狐和IE怎么样?它们都是以同样的方式单线程吗? Chrome中会发生什么?

有时我发现以下情况也会发生,这对我来说真的很重要:

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

它经常在webkit(mac os)和iPhone webkit上发生,我可以很容易地重现它。我已经构建了一些简单的东西,但是这一切对我来说似乎有点疯狂,因为当我看到其他代码时,他们甚至不考虑这一点。在将HTML文本插入DOM元素时,它们永远不会出现DOM元素。

任何答案/建议都会非常有帮助。

基兰

2 个答案:

答案 0 :(得分:1)

所有这些都在dom之后运行:加载所以问题不在于没有加载dom但有时甚至在加载之后内容并不总是显示出来。在进一步研究之后,我发现这似乎发生在iphone safari浏览器上,而不是桌面版本上。这可能只是一个时间问题。感谢您抽出宝贵时间回答问题。

答案 1 :(得分:0)

我猜Fabien的问题是正确的:只要等到DOM加载。 document.observe("dom:loaded", f);