Вы можете сохранить результат setTimeout в каждом объекте, например:
object.timeout = setTimeout(function(){
methods.rotate(object, step+1);
}, options.delay);
Затем в вашей функции остановки вызовите clearTimeout, например:
clearTimeout(object.timeout);
Полный плагин, включающий эти изменения, выглядит следующим образом:
(function($){
var rotatingObjectCollection = [];
$.fn.wiggle = function(method, options) {
options = $.extend({
rotateDegrees: ['1','2','1','0','-1','-2','-1','0'],
delay: 35
}, options);
var methods = {
rotate: function(object, step){
if(step === undefined) {
step = Math.floor(Math.random()*options.rotateDegrees.length);
}
var degree = options.rotateDegrees[step];
$(object).css({
'-webkit-transform': 'rotate('+degree+'deg)',
'-moz-transform': 'rotate('+degree+'deg)'
});
if(step == (options.rotateDegrees.length - 1)) {
step = 0;
}
object.timeout = setTimeout(function(){
methods.rotate(object, step+1);
}, options.delay);
},
stop: function(object) {
$(object).css({
'-webkit-transform': 'rotate(0deg)',
'-moz-transform': 'rotate(0deg)'
});
clearTimeout(object.timeout);
object.timeout = null;
}
};
this.each(function() {
if((method == 'start' || method === undefined) && !this.timeout) {
methods.rotate(this);
} else if (method == 'stop') {
methods.stop(this);
}
});
return;
}
})(jQuery);
Я не знаю, если это хорошая практика для хранения пользовательских данных внутри объектов, как это, но эй, это работает:)