setTimeout не задерживается анонимной функцией - PullRequest
2 голосов
/ 05 ноября 2010

Я создаю собственное слайд-шоу для проекта, написанного с помощью jQuery.С каждым слайд-шоу связаны 4 события (play, stop, next, prev).Элементы управления появляются при наведении и наведении мыши.При наведении мыши я хочу задержку исчезновения элементов управления.Чтобы добиться этого, я использовал setTimeout.

$(this).attr('timeout', setTimeout((function(obj){obj.fadeOut(250);})($(this)), 1000));

Это, однако, вызывает ошибку 'бесполезный вызов setTimeout (пропущены кавычки вокруг аргумента?)'

Я удалил ($(this)), чтобы проверить,Я мог бы упростить вещи.

$(this).attr('timeout', setTimeout((function(foo){alert(foo);})('bar'), 1000));

Это привело к тому, что «бар» отображался в окне предупреждающего сообщения при наведении мыши без задержки, или о любых ошибках, сообщенных в firebug.По этой логике я могу только предположить, что анонимная функция запускается сразу, что не оставляет ничего для вызова setTimeout для последующего вызова.

Если я проигнорирую необходимость передать $ (this) в анонимную функцию и попробовать

$(this).attr('timeout', setTimeout(function(){alert('foo');}, 1000));

все работает как положено, я, должно быть, что-то не так делаю с синтаксисом анонимной функции, но у меня нет идей относительно того, что это может быть.

Спасибо

1 Ответ

2 голосов
/ 05 ноября 2010

Так как вы используете jQuery, просто используйте $.proxy() для установки контекста вызова, например так:

$(this).attr('timeout', 
  setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

Обратите внимание, что это недопустимый атрибут, этолучше хранить такие вещи в .data(), например:

$(this).data('timeout', 
  setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

или вот так:

$.data(this, setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

Проблема с вашим текущим методомв том, что это самовывоз:

(function(foo){alert(foo);})('bar')

Где вы хотите вернуть функцию с правильным контекстом ... более кратко сделано с $.proxy() в вашем случае.

...