Pregunta

En un evento jQuery vuelo estacionario utilizo el siguiente código para desplegar un menú:

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();
    });
}

Me sale el siguiente error:

detalles del error de página web

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) Marca de tiempo: Sab 14 Nov 2009 11:12:46 GMT

Mensaje: 'no definido' es nulo o no un objeto

Línea: 81

Char: 25

Código: 0

URI: [url estaba aquí]

Sospecho que es causada por el setTimeout - Estoy pasando en un tercer parámetro como argumento para la función anónima. Esa función anónima llama a una función con un cierre.

¿Alguien puede ayudar?

¿Fue útil?

Solución 2

Bueno, he encontrado el problema. setTimeout en IE doesnt soporta los parámetros adicionales:

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

Misión abortada.

Otros consejos

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

setTimeout es propiedad de objeto window, por lo tanto this refiere a window. Guardar la referencia al contexto externo al almacenar en caché con un 'que' variable.

Sólo en caso de cualquier otra persona lee esto: Aunque no es posible pasar argumentos en setInterval o setTimeout en IE en el método describe el OP. Uno puede hacerlo mediante el uso y la función anónima y pasando los argumentos que son en su alcance.

Así que la OP tendría que sustituir la mala línea con:

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

Esta es la sintaxis esperada para setTimeout en IE (2 argumentos: la función y el retraso), pero la función anónima pasará el valor de $ item en "slidelower"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top