IE Fehler mit jQuery & Timeout
-
20-09-2019 - |
Frage
In einer jquery Hover Veranstaltung, die ich den folgenden Code verwenden, um ein Menü Drop-Down:
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();
});
}
ich die folgende Fehlermeldung erhalten:
Seite Fehlerdetails
User-Agent: Mozilla / 4.0 (compatible; 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) Zeitstempel: Sa, 14. November 2009 11.12.46 UTC
Nachricht: 'undefined' ist Null oder kein Objekt
Zeile: 81
Char: 25
Code: 0
URI: [die URL war hier]
Ich vermute, dass es durch die setTimeout verursacht wird - ich vorbei bin in einem dritten Parameter als Argument für die anonyme Funktion. Die anonyme Funktion ruft eine Funktion mit einem Verschluss.
Kann mir jemand helfen?
Lösung 2
OK, fand ich das Problem. SetTimeout in IE tut die zusätzlichen Parameter unterstützen:
https://developer.mozilla.org/en/window.setTimeout
Mission abgebrochen.
Andere Tipps
$(this).children('a').addClass('current');
var that = this;
dTimeout = setTimeout(function($item){slidelower($item)}, 200, that); // This is the bad line
SetTimeout vom window
Objekt gehört, daher bezieht sich this
auf window
. Speichern der Verweis auf den äußeren Rahmen durch Caching es mit einem ‚das‘ Variable.
Für den Fall, jemand anderes liest diese: Obwohl es nicht möglich ist Argumente in setInterval oder SetTimeout in IE in dem Verfahren der OP umrissenen passieren. Man kann dies tun, indem Sie und anonyme Funktion und vorbei in den Argumenten, die in ihrem Umfang sind.
Also das OP müßte die schlechte Leitung ersetzen:
dTimeout = setTimeout(function(){slidelower($item)}, 200);
Das ist die erwartete Syntax für SetTimeout in IE (2 Argumente: Funktion und Verzögerung), aber die anonyme Funktion wird den Wert von $ Artikeln auf „slidelower“ pass