Ошибки IE с jQuery и таймаутом - PullRequest
0 голосов
/ 14 ноября 2009

В событии jquery hover я использую следующий код для выпадающего меню:

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 (совместимый; MSIE 8.0; Windows NT 5.1; Trident / 4.0; GTB6.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; OfficeLivePatch.0.0) Метка времени: суббота, 14 ноября 2009 г. 11:12:46 UTC

Сообщение: «undefined» является нулем или не является объектом

Линия: 81

Char: 25

Код: 0

URI: [адрес был здесь]

Я подозреваю, что это вызвано setTimeout - я передаю третий параметр в качестве аргумента для анонимной функции. Эта анонимная функция вызывает функцию с замыканием.

Может кто-нибудь помочь?

Ответы [ 3 ]

1 голос
/ 14 ноября 2009

ОК, я нашел проблему. setTimeout в IE не поддерживает дополнительные параметры:

https://developer.mozilla.org/en/window.setTimeout

Миссия прервана.

1 голос
/ 27 января 2014

На всякий случай, если кто-то еще читает это: Хотя невозможно передать аргументы в setInterval или setTimeout в IE в методе, описанном в OP. Это можно сделать, используя анонимную функцию и передав аргументы в области видимости.

Таким образом, OP должен заменить плохую строку на:

dTimeout = setTimeout(function(){slidelower($item)}, 200);

Это ожидаемый синтаксис для setTimeout в IE (2 аргумента: функция и задержка), но анонимная функция передаст значение $ item на «slidelower»

1 голос
/ 14 ноября 2009
$(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'.

...