2013-07-20 3 views
0

добрый вечер.removeChild after setimeout - работает спорадически?

У меня есть загрузчик, который накладывается на сайт, исчезает через переход css (непрозрачность), который длится 1000 мс, когда класс тела изменен на «загружен», а затем, как только переход закончен, я удаляю его из DOM.

Я использую следующий скрипт, который отлично работает во всем баре osx snow leopard/google chrome v28, и даже тогда только для нескольких людей - у меня точно такая же настройка, как и у моего клиента и почти всех я могу пройти тест - и он отлично работает.

НО У меня было 2 или 3 сообщения об ошибках, когда загрузчик не удаляется из DOM, поэтому он все еще накладывает остальную часть содержимого и делает элементы под ним неактивными. один вид пользователя даже отправил мне видео, которое подтверждает, что элемент загрузчика все еще находится в DOM.

сценарий выглядит следующим образом; Я задаюсь вопросом, может ли быть проблема с тем, как я удалил элемент, или с помощью синтаксиса функции setTimeout.

любая помощь относительно того, почему это может быть неудачно, будет оценено, особенно учитывая, что я неспособен повторить это! Я добавил комментарии в сценарий, чтобы объяснить, как я ожидаю, что он будет работать (и как это делается в большинстве случаев).

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); 

заблаговременно за любую помощь, которую вы можете дать.

+0

Если вы не можете воспроизвести его, можете ли вы попросить своих пользователей сообщать о любых ошибках консоли? Являются ли ваши переменные глобальными? –

+1

... это не имеет прямого отношения к делу, но в качестве формы я бы переместил вашу 'if (!груженную) {' в функцию 'cl()', чтобы вам не пришлось ее повторять. Затем вы можете сделать 'window.onload = cl' и' setTimeout (cl, 5000) ' –

+0

Является ли этот код готовой функцией? Мне интересно, может быть, проблема в том, что «загрузчик» имеет значение null, когда вы вызываете эту функцию, потому что в каком-то странном случае html еще не был обработан. Где этот скрипт на странице? Это после html? –

ответ

0

ОК решение было не связано с моим сценарием как таковым, но из-за установленного chrome-плагина (measureIt.js), который убивал мой скрипт. блестящий.

Мне удалось реплицировать проблему (которая не ограничивалась версией OSX или chrome, кстати) с установленным плагином и добавила простой оператор try catch для удаления загрузчика.

спасибо Crazy Train за то, что помогли мне убрать синтаксис вверх - это упростило проблему.

Смежные вопросы