2010-09-21 32 views
4

我有一个重写代码写几年前与现代浏览器一起工作。该网站包括几个Javascript文件。添加alert()使“不工作的脚本”正常工作

在他们的存在是一个代码是这样的 - 它是动态生成的DOM元素:

createTabs(); 
createTabsContent(); 

现在,我在Chrome中打开的网站和页面加载后,我试图改变产生了一些新鲜元素风格

document.getElementById('element').style.display = 'none'; 

并且它不工作 - 无论是表单脚本还是Chrome控制台。是的,DOM中存在id为#element的元素)。什么是奇怪的 - Chrome不报告任何错误。

但是,当我修改代码,做这样的事情:

alert('test'); //i put alert here 
createTabs(); 
createTabsContent(); 
//alert('test'); // or put it here 

一切工作正常。

在其他浏览器中:IE8,FF,Opera一切正常,也没有错误。 我用jQuery document.ready,然后用window.onload事件尝试 - 他们失败 - 没有任何改变。

什么可能会导致此行为?

+0

我不太清楚“动态生成DOM元素”和“this.foo();”之间的联系。真正有效的示例代码将更容易调试。 – RoToRa 2010-09-21 14:58:31

+0

@RoToRa - 我更改了函数名称。写“生成DOM元素”我的意思是document.createElement(),然后一些setAttribute调用。 – singles 2010-09-21 15:26:44

+0

在更改样式之前是否已将元素附加到页面上? – vol7ron 2010-09-21 15:51:37

回答

5

的一些DOM相关的不是工作,而是开始添加报警时,工作这种症状通常是可解的通过推迟第二步:

this.foo(); 
var me = this; 
setTimeout(function() { me.bar(); }, 0); // Whatever library you're using may provide a cleaner way of deferring execution. 

IE是特别容易的事情不会立即被准备与...交互。 Chrome并没有真正遇到过这种情况。

+0

我在setTimeout中封装了所有函数,它起作用(altought我并不以此为荣,但如果代码在第一次写入时正确,我就不必这么做了,所以我有清楚的良知:)。谢谢! – singles 2010-09-22 11:08:19

2

当您插入警报后代码“有效”时,通常意味着存在某种竞争条件,因为警报暂停执行而绕过。例如,你可能有一个AJAX请求,接着是一个函数调用,它应该对AJAX结果起作用(但是在AJAX请求之后被不恰当地调用,而不是在完成时被AJAX处理程序调用传入)。如果没有警报,该功能还没有数据,因此它失败了,但是当您将警报放入时,该请求有时间完成并且功能成功。

很难确切地说你遇到的问题是由于没有更多关于你的代码的上下文而造成的。

+0

我无法粘贴整个代码 - 生成内容所需的整个代码超过500行。 – singles 2010-09-21 15:29:15

+0

代码,我提到的是在AJAX请求完成后触发的:readyState == 4和status = 200 - 并且该请求提供了生成内容所需的全部所需数据。之后没有其他的AJAX请求。 – singles 2010-09-21 15:56:36