0

在 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(兼容;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) 时间戳:2009 年 11 月 14 日星期六 11:12:46 UTC

消息:“未定义”为空或不是对象

线路:81

字符:25

代码:0

URI:[网址在这里]

我怀疑这是由 setTimeout 引起的——我传入了第三个参数作为匿名函数的参数。该匿名函数调用带有闭包的函数。

任何人都可以帮忙吗?

4

3 回答 3

1
$(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. 通过使用“那个”变量缓存它来保存对外部上下文的引用。

于 2009-11-14T11:38:37.677 回答
1

好的,我发现了问题。IE 中的 setTimeout 不支持附加参数:

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

任务中止。

于 2009-11-14T12:40:32.373 回答
1

以防万一其他人读到这一点:尽管在 OP 概述的方法中无法将参数传递给 IE 中的 setInterval 或 setTimeout。可以通过使用匿名函数并传入范围内的参数来做到这一点。

因此,OP 需要将坏行替换为:

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

这是 IE 中 setTimeout 的预期语法(2 个参数:函数和延迟),但匿名函数会将 $item 的值传递给“slidelower”

于 2014-01-27T13:36:58.320 回答