Как передать "это" в обратный вызов setTimeout
в CSS
.item {
  display: none;
}
HTML-код
<div>
  <div class="item">machin</div>
  <div class="item">chose</div>
  <div class="item">chouette</div>
  <div class="item">prout</div>
</div>
Я использую jQuery и я хотел бы сделать каждый .item появляется после случайного маленького таймера, как:
в JavaScript
$('.item').each(function () {
  itm = $(this);
  setTimeout(function () {
    itm.fadeIn(1000);
  }, Math.floor(Math.random() * 1000));
})
здесь itm всегда будет содержать последний элемент, потому что функция оценивается после всех назначений.
Я не могу использовать 3-й параметр setTimeout() потому что он не будет работать в IE.
Это не рекомендуется использовать setTimeout() С оценку метод по соображениям безопасности.
так как я могу получить доступ к моему объекту через setTimeout() ?
редактировать
Я знаю, что этот вопрос уже размещенные.
Но я думал, что это было немного специфично с each() контексте.
Теперь кто-то полностью изменил название моего вопроса, который изначально был чем-то вроде  ' setTimeout () - jQuery.каждый() это параметр объекта'
8 ответов
Не используйте setTimeout, используйте собственные инструменты jQuery.
$('.item').each(function () {
   $(this).delay(Math.random() * 1000).fadeIn();
})
пример: http://jsfiddle.net/qENhd/
создать/использовать closure:
$('.item').each(function () {
  var that = this;
  setTimeout(function () {
    $(that).fadeIn(1000);
  }, Math.floor(Math.random() * 1000));
})
до setTimeout выполняет each цикл закончил бы выполнение, он не будет ждать. Также внутри setTimeout функции this не будет ссылаться на элемент DOM.
попробуйте что-то вроде этого.
function fadeItem(item){
   item.fadeIn(1000);
}
$('.item').each(function () {
  var $item = $(this);
  setTimeout(function () {
    fadeItem($item);
  }, Math.floor(Math.random() * 1000));
});
вы также можете попробовать что-то подобное.
var $items = $('.item'), count = 0;
function fadeItem(item){
   item.fadeIn(1000);
    if(count < $items.length){
       setTimeout(function(){
            fadeItem($items.eq(count++));
       }, Math.floor(Math.random() * 1000));
    }
}
setTimeout(function(){
    fadeItem($items.eq(count++));
}, Math.floor(Math.random() * 1000));
нужно в магазине this в отдельной переменной:
$('.item').each(function () {
  var me = $(this);
  setTimeout(function () {
    me.fadeIn(1000);
  }, Math.floor(Math.random() * 1000));
})
фокус здесь в том, чтобы сохранить this в локальный, который можно безопасно оценить в setTimeout обратный звонок
$('.item').each(function () {
  var self = this;
  setTimeout(function () {
    $(self).fadeIn(1000);
  }, Math.floor(Math.random() * 1000));
});
попробуйте это:
$('.item').each(function () {
 var myVar = $(this);
setTimeout(function () {
myVar.fadeIn(1000);
}, Math.floor(Math.random() * 1000));
})
попробуйте этот insteed:
    $('.item').each(function () {
        var elm = this;
      setTimeout(function () {
        $(elm).fadeIn(1000);
      }, Math.floor(Math.random() * 1000));
    })
Я не могу объяснить, почему это работает, но я думаю, что это ссылка на другое "это" в вашем setTimeout.
попробуйте это:
 $('.item').each(function () {
    var item =$(this);
    setTimeout(function () {
            item.fadeIn(1000);
        },
        Math.floor(Math.random() * 1000));
   });
