Ошибки IE с jQuery и тайм-аутом
-
20-09-2019 - |
Вопрос
В событии наведения jquery я использую следующий код, чтобы открыть меню:
clearTimeout(hTimeout);
$('#lowermenu').queue('fx', []);
$('#menucenter .current').removeClass('current');
$(this).children('a').addClass('current');
dTimeout = setTimeout(function($item){slidelower($item)}, 200, $(this)); // This is the bad line
function slidelower($li)
{
$li.addClass('dropping');
$lowermenu = $li.children('ul').clone();
$('#lowermenu:not(:animated)').empty().append($lowermenu).slideDown();
$('#lowermenu > ul > li:not(:animated)').hover(function()
{
$(this).children('ul:hidden').css('top', 'auto').slideDown();
}, function()
{
$(this).children('ul:visible').slideUp();
});
}
Я получаю следующую ошибку:
Подробности ошибки веб-страницы
Пользовательский агент:Mozilla/4.0 (совместим;МСИЭ 8.0;Windows НТ 5.1;Трайдент/4.0;ГТБ6.3;.NET CLR 1.1.4322;.NET CLR 2.0.50727;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729;OfficeLiveConnector.1.3;OfficeElivePatch.0.0) TimeStamp:Сб, 14 ноября 2009 г., 11:12:46 UTC
Сообщение:«неопределенный» имеет значение null или не является объектом
Линия:81
Чар:25
Код:0
URI:[адрес был здесь]
Я подозреваю, что это вызвано setTimeout — я передаю третий параметр в качестве аргумента анонимной функции.Эта анонимная функция вызывает функцию с замыканием.
Кто-нибудь может помочь?
Решение 2
Хорошо, я нашел проблему.setTimeout в IE не поддерживает дополнительные параметры:
https://developer.mozilla.org/en/window.setTimeout
Миссия прервана.
Другие советы
$(this).children('a').addClass('current');
var that = this;
dTimeout = setTimeout(function($item){slidelower($item)}, 200, that); // This is the bad line
setTimeout принадлежит window
объект, следовательно this
относится к window
.Сохраните ссылку на внешний контекст, кэшировав ее с помощью переменной that.
На всякий случай, если кто-то еще это прочитает:Хотя невозможно передать аргументы в setInterval или setTimeout в IE методом, описанным в OP.Это можно сделать, используя анонимную функцию и передавая аргументы, находящиеся в области видимости.
Таким образом, ОП необходимо будет заменить плохую строку на:
dTimeout = setTimeout(function(){slidelower($item)}, 200);
Это ожидаемый синтаксис setTimeout в IE (2 аргумента:функция и задержка), но анонимная функция передаст значение $item в «slidelower».