Javascript setimeout后移除Child-偶尔工作?
晚上好 我有一个加载程序,它覆盖站点,通过css转换(不透明度)淡出,当body类更改为“loaded”时,它会持续1000毫秒,然后一旦转换完成,我就将其从DOM中删除 我正在使用下面的脚本,它在osx snow leopard/google chrome v28上的所有功能都很好,即使是在这种情况下,也只适用于少数人——我的设置与我的客户机和几乎所有我可以测试的人的设置完全相同——它工作得很好 但是我有2到3个错误报告,其中加载程序没有从DOM中删除,因此它仍然覆盖了其余的内容,并使其下的元素不可点击。一个善良的用户甚至给我发了一个视频,确认loader元素仍然在DOM中 脚本如下所示;我想知道我是如何删除元素的,还是setTimeout函数语法本身有问题 任何关于这可能失败原因的帮助都将不胜感激,特别是考虑到我无法复制这一点!我在脚本中添加了注释,以解释我希望它如何工作(以及在大多数情况下它是如何工作的)Javascript setimeout后移除Child-偶尔工作?,javascript,settimeout,removechild,Javascript,Settimeout,Removechild,晚上好 我有一个加载程序,它覆盖站点,通过css转换(不透明度)淡出,当body类更改为“loaded”时,它会持续1000毫秒,然后一旦转换完成,我就将其从DOM中删除 我正在使用下面的脚本,它在osx snow leopard/google chrome v28上的所有功能都很好,即使是在这种情况下,也只适用于少数人——我的设置与我的客户机和几乎所有我可以测试的人的设置完全相同——它工作得很好 但是我有2到3个错误报告,其中加载程序没有从DOM中删除,因此它仍然覆盖了其余的内容,并使其下的元
提前感谢您提供的任何帮助。好的,解决方案与我的脚本本身无关,但由于安装了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);