很怪,不知道为什么.代码我讲一下, 原文是c#的,但是c#这方面人关注的少,所以在这里提问,反正原理一样的.
//伪代码
NavigateComplete()
{
    //此时页面还没有加载完成
    StartDetectBodyTimeout();//启动一次性计时器
}_DetectBodyProc()
{
     if( body == null )
     {
         timer.start = true;//开始新的计时器
         return;
     }
     //即使body不为空,页面可能还没有加载完成.
     col = document.getElementsByTagName("a");
     ShowNumber( col.length ) ;//messagebox 显示大小
     //这里尚未停顿一些时候,让页面继续加载
     ShowNumber( col.length ) ;
}我发现第二次显示的 lenght 大于第一次的.
这是怎么回事?
ms怎么实现的?
大家各抒己见吧.
谢谢.

解决方案 »

  1.   

    document.getElementsByTagName("a"); 是在页面加载完之后调用的?
      

  2.   

    调用的时候是一半的时候.body已经存在,但是没有完全ok.所以a的确是增加了,但是为什么getElementsByTagName会那么聪明?这样先知先觉?
      

  3.   

    没加载完的时候。。内容的确只有一半,对这部分内容解析,标签<a>的长度就是不定的
      

  4.   

    是啊,这我知道,问题是后来那个collection会自己长出来.唯一的解释就是 WebBrowser 返回一个内部的引用. 随着加载完成,这个内部结构自己长出来了,所以外部看我的collection自己也变长了.
      

  5.   

    col是引用变量,他指向document内部的一个具体对象,而document是在变化的
      

  6.   


    你如果在顶层的DocumentComplete之后再去get collection就不会变化了
      

  7.   

    其实本质的点是通过document.getElementsByTagName的dom API返回的只是一个对dom里面节点或者节点列表的一个引用而已,
    浏览器在读取文本进行parse成dom结构的过程中,这里在早期返回的时候,就是你执行调用的这个点,获取到的a的个数是之前的已经parse完的部分,当执行到最后,已经完整的parse了整个dom的时候,再次调用会重新计算这里a的个数,这点没什么稀奇的。
      举个例子:你把获取div的代码放到<div></div>的上面执行,是获取不到对应的HTMLDIVElement对象一样的道理。
      

  8.   

    应该每次调用的时候都是parse当前获得dom结构等,从而dom加载的比例,从而发生了变化