Вопрос

В событии наведения 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».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top