2010-10-31 3 views
1

У меня есть этот скрипт, предоставленный @Felix Kling в этом сообщении HERE, но сбой моего IE, когда я его использую; на FF 3.6, Opera, Chrome, Safari работают нормально.javascript скрипт не работает и сбой IE

Любая идея, почему это происходит? Может быть, исправить?

var ajaxTimeout; 

function autorun() { 
    if ($("#contactForm").is(":visible")){ 
     if(ajaxTimeout) { 
      clearInterval(ajaxTimeout); 
      ajaxTimeout = false; 
     } 
    } 
    else if(!ajaxTimeout) { 
     ajaxTimeout = setInterval("refreshAjax();", 15000); 
    } 
} 


$(function autorun() { 
    setInterval("autorun();", 2000) 
}); 

Спасибо,

Cristian.

LE. Извините, забыли добавить информацию об этом.

IE просто закрывается, «сталкивается с ошибкой и нуждается в закрытии, ища решение ...». IE 8.0 Windows7. Если я загружаю страницу, я не могу открыть отладчик из инструментов разработчика, но если я открою отладчик, прежде чем загружать эту страницу и нажмите «Начать отладку», он не покажет никаких ошибок или чего-либо еще, но страница не обновляет сетку, как это предполагалось.

+0

Определите «сбой». Какие сообщения об ошибках вы получаете? –

+0

Я обновил вопрос. Спасибо. – Chris19

ответ

3

Вот что вы после:

$(function() { 
    var ajaxTimeout; 
    function autorun() { 
    if ($("#contactForm").is(":visible")){ 
     if(ajaxTimeout) { 
     clearInterval(ajaxTimeout); 
     ajaxTimeout = false; 
     } 
    } 
    else if(!ajaxTimeout) { 
     ajaxTimeout = setInterval(refreshAjax, 15000); 
    } 
    } 
    setInterval(autorun, 2000); 
}); 

IE не на всех, как названные функции, используемые, как это, и это переопределение ранее определил один. This is a long-standing bug не fixed until IE9. Ядром проблемы является то, что $(function autorun() { берет на себя имя autorun, которое просто ставит в очередь все больше и больше запусков.

Кроме того, лучше передать ссылки на функции setInterval() напрямую, а не строки.

+0

Пятно на, Ник. Работает отлично. Большое спасибо, сводил меня с ума. – Chris19

+0

@ Chris19 - вы, конечно, не первый, * многие * разработчики получили немного лишнего с этим :) –

0

Я подозреваю, что это преступник:

$(function autorun() { 
    setInterval("autorun();", 2000) 
}); 

Это не совсем корректную JavaScript. Я думаю, что это, вероятно, должно быть что-то вроде:

$(document).ready(function() { 
    setInterval("autorun();", 2000); 
}); 

[править: произошла ошибка в моем предложении выше, и я исправил ее. Я неправильно присвоил результат setInterval(...) переменной ajaxTimeout. Это в конечном счете вызвало логика внутри главного autorun() функции никогда не инициировать его интервал на refreshAjax(), тем самым вызывая код появляться «делать ничего»]


[редактировать:. Некоторые из них указали, что мое предложение было предложено без достаточно объяснений, поэтому я попытаюсь представить, что здесь.]

  • вы объявляли function autorun() дважды. Однажды вверху и снова в нижней части, где я предложил вам внести изменения. Оба объявления находятся в одной области, поэтому имена будут сталкиваться, и поведение будет зависящим от браузера. Некоторые браузеры позволят одной функции «скрыть» другую, в то время как другие браузеры (вероятно) откажутся ее скомпилировать.

  • Вы использовали именованное назначение функции (второе объявление автозапуска) в контексте «inline». Это может быть разрешено некоторыми браузерами (и некоторые из них предположили, что он действительно действителен по стандарту - хотя, по общему признанию, я думал, что это не так), но это определенно вызовет проблемы в IE.

  • Мое предложение меняет второе объявление на анонимную декларацию, чтобы убить двух птиц одним ударом: избегайте столкновения имен и используйте синтаксис, поддерживаемый во всех браузерах.

  • , наконец, я представил использование $(document).ready(...), потому что это стандартная практика в эти дни при программировании с помощью jQuery. Вы можете узнать больше об этом on jQuery's site. Короче говоря - это прямо эквивалентно синтаксису $(function() {...}), который вы использовали, чтобы вы могли его взять или оставить, как вам угодно.

+1

Я бы рекомендовал просто передать функцию, а не строку для eval. –

+0

. Захват возвращаемого значения полезен, если вы хотите в какой-то момент поменять таймер, но в противном случае полностью необязательно. – Quentin

+0

Нет, не работает. Больше не освежает сетку в FF или хроме. – Chris19

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