0

在我使用下面的代碼jQuery的懸停事件IE錯誤下拉菜單:與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) 時間戳:Sat,14 Nov 2009 11:12:46 UTC

消息: '未定義' 是空或不是對象

線:81

字符:25

代碼:0

URI:[鏈接在這裏]

我懷疑它是由setTimeout引起的 - 我傳入第三個參數作爲匿名函數的參數。該匿名函數用閉包調用一個函數。

任何人都可以幫忙嗎?

回答

1
$(this).children('a').addClass('current'); 
var that = this;  
dTimeout = setTimeout(function($item){slidelower($item)}, 200, that); // This is the bad line 

的setTimeout由window對象所擁有,因此thiswindow。通過使用'that'變量緩存對外部上下文的引用。

+0

謝謝你,你的答案有幫助,但我無法通過一個可用的對象,即使嘗試了許多方法的排列。不過謝謝你。 – 2009-11-14 12:18:54

+0

好吧,我仍然有麻煩: setTimeout(function(theid){window.console.log(theid)},200,'test'); 這是輸出到控制檯「未定義」。我究竟做錯了什麼? – 2009-11-14 12:35:48

+0

完整的源代碼或演示將有所幫助。 – 2009-11-14 12:40:04

0

只是爲了防止其他人讀取此內容: 儘管無法在OP中概述的方法中將參數傳遞到setInterval或setTimeout中。可以通過使用匿名函數並傳入範圍內的參數來實現。

所以OP就需要更換壞行:

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

這是setTimeout的在IE預期的語法(2個參數:功能和延遲),但匿名函數將通過$的價值項目到「slidelower」