2012-04-12 5 views
3

Я пишу плагин jQuery, который вводит новый метод foo(), который создает элемент внутри объекта DOM, на который он вызывается. Я сохраняю указатели на эти изображения в массиве images. В конце метода я вызываю setInterval("someFunction(images)", 1000), который должен периодически выполнять некоторые действия (например, изменять src) на изображениях.Плагин jQuery: использование setInterval для периодического обновления массива элементов jQuery

Вот очень короткая версия о том, что мой код выглядит следующим образом:

(function($) { 
$.fn.foo = function() { 
return this.each (function() { 
    $box = $("#"+this.id); 

    images = new Array(); 
    for (i = 0; i<4; i++) { 
     images[i] = $("<img>"); 
     $box.prepend(images[i]); 
    } 

    setInterval("someFunction(images)", 1000); 
}); 
} 
function someFunction(images) { 
    for (i = 0; i<images.length; i++) { 
     images[i].attr("src", "foo"+(parseInt(Math.random()*5))); 
    } 
} 
})(jQuery); 

Все работает, если я применяю foo() к одному элементу, но если применить его к нескольким элементам, все периодические обновления применяются к последнему элементу. Я предполагаю, что это потому, что массив передается как ссылка на someFunction и затем перезаписывается.

Я попытался использовать slice() на массиве, чтобы создать копию, но это не сработало, хотя я не понимаю, почему. Я думаю, что я ищу, чтобы каким-то образом сохранить указатели на мои изображения в родительском контейнере.

Любая помощь будет оценена по тому, что мне нужно изменить, чтобы все изображения были обновлены, а не только те, которые были в последнем контейнере.

ответ

2

Как об этом потом:

(function ($) { 
    $.fn.foo = function() { 
     return this.each(function() { 
      $box = $(this); // Changed to "this" 

      var images = new Array(); 
      for (i = 0; i < 4; i++) { 
       images[i] = $("<img>"); 
       $box.prepend(images[i]); 
      } 

      // Added the function inline. 
      setInterval(function() { 
       for (i = 0; i < images.length; i++) { 
        images[i].attr("src", "foo" + (parseInt(Math.random() * 5))); 
       } 
      }, 1000); 
     }); 
    }; 
})(jQuery); 

EDIT:

Вы также можете попробовать это так, если вы хотите использовать someFunction:

(function ($) { 
    $.fn.foo = function() { 
     ... 
      setInterval(function() { 
       someFunction(images); 
      }, 1000); 
     ... 
    }; 
})(jQuery); 

function someFunction(images) { 
    for (i = 0; i<images.length; i++) { 
     images[i].attr("src", "foo"+(parseInt(Math.random()*5))); 
    } 
} 
+0

Параметр 'images' объявлен внутри (Я забыл написать 'var'), но это ставит проблему в том, что они являются локальными для функции и больше не доступны для' someFunction'. С другой стороны, если я объявляю их снаружи, они перезаписываются. Это моя проблема. – Waboodoo

+0

Я обновил ответ, это работает? –

+0

Мне не нравится стиль его встроенной функции, но он определенно работает: D. Спасибо за вашу помощь. Небольшая проблема, с которой я сталкиваюсь сейчас, это то, что я хочу, чтобы функция также вызывалась в начале (в дополнение к каждой секунде). Как я могу это сделать без копирования всей встроенной функции? – Waboodoo

Смежные вопросы