Javascript setimeout后移除Child-偶尔工作?

Javascript setimeout后移除Child-偶尔工作?,javascript,settimeout,removechild,Javascript,Settimeout,Removechild,晚上好 我有一个加载程序,它覆盖站点,通过css转换(不透明度)淡出,当body类更改为“loaded”时,它会持续1000毫秒,然后一旦转换完成,我就将其从DOM中删除 我正在使用下面的脚本,它在osx snow leopard/google chrome v28上的所有功能都很好,即使是在这种情况下,也只适用于少数人——我的设置与我的客户机和几乎所有我可以测试的人的设置完全相同——它工作得很好 但是我有2到3个错误报告,其中加载程序没有从DOM中删除,因此它仍然覆盖了其余的内容,并使其下的元

晚上好

我有一个加载程序,它覆盖站点,通过css转换(不透明度)淡出,当body类更改为“loaded”时,它会持续1000毫秒,然后一旦转换完成,我就将其从DOM中删除

我正在使用下面的脚本,它在osx snow leopard/google chrome v28上的所有功能都很好,即使是在这种情况下,也只适用于少数人——我的设置与我的客户机和几乎所有我可以测试的人的设置完全相同——它工作得很好

但是我有2到3个错误报告,其中加载程序没有从DOM中删除,因此它仍然覆盖了其余的内容,并使其下的元素不可点击。一个善良的用户甚至给我发了一个视频,确认loader元素仍然在DOM中

脚本如下所示;我想知道我是如何删除元素的,还是setTimeout函数语法本身有问题

任何关于这可能失败原因的帮助都将不胜感激,特别是考虑到我无法复制这一点!我在脚本中添加了注释,以解释我希望它如何工作(以及在大多数情况下它是如何工作的)


提前感谢您提供的任何帮助。

好的,解决方案与我的脚本本身无关,但由于安装了chrome插件(measureIt.js),导致我的脚本死机。太棒了

我已经成功地通过安装插件复制了这个问题(顺便说一句,这个问题并不局限于OSX或chrome版本),并添加了一个简单的
try-catch
语句来删除加载程序


感谢疯狂训练帮助我整理语法-它使隔离问题变得更容易

如果您不能复制它,您能要求您的用户报告任何控制台错误吗?你的变量是全局的吗?…这不是直接相关的,但是作为一种形式,我会将你的
if(!loaded){
移动到
cl()
函数,这样你就不必重复它了。然后你可以做
window.onload=cl
setTimeout(cl,5000)
此代码是否处于就绪功能中?我想知道问题是否出在“加载程序”上调用该函数时为null,因为在某些奇怪的情况下,html尚未呈现。该脚本在页面上的何处?是否在html之后?@matty-d js位于页面底部,而不是包装在任何其他函数中。将代码包装在立即调用的函数中,这样您就不会创建一堆全局变量。Only公开用户所需的变量(如果有的话)。它可以像用户创建同名全局变量一样简单。
var 
loaded = false,
_body = document.body,
loader = document.getElementById("loader"),
kill_loader = function() {
    if ( loader ) {
        loader.parentNode.removeChild(loader);
    }
},
cl = function() {
    // set loaded to true, add class to body that fades the loader, then remove the loader
    loaded = true;
    _body.className = _body.className + " loaded";
    // the above works as intended
    setTimeout(kill_loader,1000);
    // this last bit does not seem to work in rare instances as detailed. 
    // the timeout is so that the loader fully fades before being removed. 
};

window.onload = function() {
    if ( !loaded ) {
    // if loaded variable is false (i.e. cl() has not run), call the function to complete loading
        cl();
    }
};


setTimeout(function () {
    // if page still not loaded after 5 seconds, force the load
    if( !loaded ) {
        cl();
    }
},5000);