innerHTML后页面找不到元素

老黄瓜_ 2011-04-02 04:41:07
具体代码如下


var HTML = "xxxxxxx";
HTML = "\r\n<SPAN id='"+ this.name +"_tree_"+ id +"'>"+ HTML
HTML +="<SPAN style='DISPLAY: none'></SPAN></SPAN>";

当我递归去innerHTML一个元素后,
立刻用这个元素添加 innerHTML其他元素时候,会出现找不到元素的问题?

有没有什么办法解决这个问题?
...全文
499 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
老黄瓜_ 2011-04-19
  • 打赏
  • 举报
回复
问题解决了,是我自己的程序次序写的有点问题,setTimeout的方式是可行的。
  • 打赏
  • 举报
回复
递归时有没有立即设置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取添加的内容就完全没问题。
liuzhi1994 2011-04-02
  • 打赏
  • 举报
回复
setTimeout(mzTree.name +".asyncExpandNode('"+ snode.id +"')", 1); 1ms 时间太短了 改100试试
kaifadi 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zliu789 的回复:]

都说了之前就是以setTimeout调用过的啊,偶尔会出现找不到元素的问题,大多数情况下是好的,悲剧。
[/Quote]
那么3#的方法你试了没有呢,用APPENDCHILD
老黄瓜_ 2011-04-02
  • 打赏
  • 举报
回复
都说了之前就是以setTimeout调用过的啊,偶尔会出现找不到元素的问题,大多数情况下是好的,悲剧。
蓝色_冰点 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sohighthesky 的回复:]
innerHTML之后 使用setTimeout(function()
//这里再去调用
},0);
[/Quote]
+++
innerHTML被设置以后,实际上并没有马上创建相应的DOM,所以立刻就找的话是找不到的
而setTimeout就相当于一次中断,退出JS代码后,浏览器才会刷新创建相应的DOM
然后才能被正确找到
老黄瓜_ 2011-04-02
  • 打赏
  • 举报
回复
现在主体调用函数就是采用的setTimeout这种方式调用的, 只是在取document.getElementById这块的子函数没有采用这种方式。
setTimeout(mzTree.name +".asyncExpandNode('"+ snode.id +"')", 1); 递归调用

然后在 asyncExpandNode 函数里面
mzTree.expand(node.id,true); 展开

只是在expand这个函数里
document.getElementById的时候 出现这个问题
hch126163 2011-04-02
  • 打赏
  • 举报
回复
setTimeout
ddwren 2011-04-02
  • 打赏
  • 举报
回复
#3楼说的有理
zell419 2011-04-02
  • 打赏
  • 举报
回复

var obj = document.createElement("SPAN");
obj.setAttribute("id",this.name +"_tree_"+ id);
document.getElementById("div").appendChild(obj);

这样去追加元素 再用document.getElementById是可以获得到的 。
或者用jq

$("#div").find("span") //也能找到里面的元素
cb1156 2011-04-02
  • 打赏
  • 举报
回复
来晚了。。。
同认为APPENDCHILD好一点
innerHTML会影响DOM结构
knightzhuwei 2011-04-02
  • 打赏
  • 举报
回复
你可以用appendChild 得到引用后递归添加子元素 添加完成后一次载入到页面 可以提高效率 免去页面多次刷新dom树
sohighthesky 2011-04-02
  • 打赏
  • 举报
回复
innerHTML之后 使用setTimeout(function()
//这里再去调用
},0);
老黄瓜_ 2011-04-02
  • 打赏
  • 举报
回复
比如 <SPAN id='tree_18'></SPAN>递归去增加的时候,会出现找不到 'tree_18' 这个元素,应该是页面还没有innerHTML完成,我就去调document.getElementById,有没有方法去判断我已经加载完成了?

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧