具体代码如下
var HTML = "xxxxxxx";
HTML = "\r\n<SPAN id='"+ this.name +"_tree_"+ id +"'>"+ HTML 
HTML +="<SPAN style='DISPLAY: none'></SPAN></SPAN>";当我递归去innerHTML一个元素后,
立刻用这个元素添加 innerHTML其他元素时候,会出现找不到元素的问题?有没有什么办法解决这个问题?

解决方案 »

  1.   

    比如 <SPAN id='tree_18'></SPAN>递归去增加的时候,会出现找不到 'tree_18' 这个元素,应该是页面还没有innerHTML完成,我就去调document.getElementById,有没有方法去判断我已经加载完成了?
      

  2.   

    innerHTML之后 使用setTimeout(function()
    //这里再去调用
    },0);
      

  3.   

    你可以用appendChild 得到引用后递归添加子元素 添加完成后一次载入到页面 可以提高效率 免去页面多次刷新dom树
      

  4.   

    来晚了
     同认为APPENDCHILD好一点
      innerHTML会影响DOM结构
      

  5.   


    var obj = document.createElement("SPAN");
    obj.setAttribute("id",this.name +"_tree_"+ id);
    document.getElementById("div").appendChild(obj);这样去追加元素 再用document.getElementById是可以获得到的 。
    或者用jq$("#div").find("span") //也能找到里面的元素
      

  6.   

    现在主体调用函数就是采用的setTimeout这种方式调用的, 只是在取document.getElementById这块的子函数没有采用这种方式。
    setTimeout(mzTree.name +".asyncExpandNode('"+ snode.id +"')", 1);  递归调用然后在 asyncExpandNode 函数里面 
    mzTree.expand(node.id,true);      展开只是在expand这个函数里
    document.getElementById的时候 出现这个问题
      

  7.   

    +++
    innerHTML被设置以后,实际上并没有马上创建相应的DOM,所以立刻就找的话是找不到的
    而setTimeout就相当于一次中断,退出JS代码后,浏览器才会刷新创建相应的DOM
    然后才能被正确找到
      

  8.   

    都说了之前就是以setTimeout调用过的啊,偶尔会出现找不到元素的问题,大多数情况下是好的,悲剧。
      

  9.   

     那么3#的方法你试了没有呢,用APPENDCHILD
      

  10.   

    setTimeout(mzTree.name +".asyncExpandNode('"+ snode.id +"')", 1);  1ms 时间太短了 改100试试
      

  11.   

    递归时有没有立即设置innerHTML?? 如果立即设置了,比如大致象下面这样:var HTML = 取上次设置的对象.innerHTML;
    HTML = "\r\n<SPAN id='"+ this.name +"_tree_"+ id +"'>"+ HTML  
    HTML +="<SPAN style='DISPLAY: none'></SPAN></SPAN>";
    对象.innerHTML=HTML;那么随后调document.getElementById取添加的内容就完全没问题。
      

  12.   

    问题解决了,是我自己的程序次序写的有点问题,setTimeout的方式是可行的。