私は自分のウェブサイト用のjqueryプラグインを書いています。ここにスニペットがあります:
(function($){
var options;
var fqTimer;
var counter = 1;
$.fn.jsSlideShow = function(settings){
options = $.extend({
frequency: 3000,
speed: "slow",
images: [],
position: "center center"
}, settings);
addImages();
doFade();
return this;
};
function doFade(){
fqTimer = setTimeout(function(){
fade();
}, options.frequency);
}
// other functions
});
動作しますが、問題があります。jquery の ajax 成功コールバックに次のコードがあります。
$("#player").jsSlideShow({
images: imgs
});
しかし、何が起こるかというと、doFade()
関数がより速く呼び出されるようになり、ajax の成功が呼び出されるたびdoFade()
にさらに速くなります。それが起こらないようにする方法はありますか?
これが私のajax呼び出しです:
success: function(data){
var player = $("<div>").attr("id", "player").addClass("jsSlideShow");
$("#page").html(player);
var imgs = new Array();
for(i in data){
file = data[i]["filename"] + ".jpg";
imgs.push("/media/gallery/" + file);
}
$("#player").jsSlideShow({
images: imgs
});
}
編集: 新しい作業コピー
完全なプラグインは次のとおりです。
(function($){
$.fn.jsSlideShow = function(settings){
var options;
var fqTimer = null;
clearTimeout(fqTimer);
var counter = 1;
var jsSlider = $(this);
options = $.extend({
frequency: 3000,
speed: "slow",
images: [],
position: "center center"
}, settings);
addImages();
doFade();
function addImages(){
var hide = false;
jsSlider.html("");
for(i in options.images){
var div = $("<div>").attr("id", "jsSlideShow-" + i).addClass("jsSlideShow-img-block").css({
width: "100%",
height: "100%",
backgroundImage: "url('" + options.images[i] + "')",
backgroundPosition: options.position,
backgroundRepeat: "no-repeat",
position: "absolute"
});
if(hide){
div.css({display: "none"});
}
hide = true;
jsSlider.append(div);
}
}
function doFade(){
fqTimer = setTimeout(function(){
fade();
}, options.frequency);
}
function fade(){
current = jsSlider.children("div.jsSlideShow-img-block:nth-child(" + counter + ")");
current.fadeOut(options.speed);
counter++;
if(counter === options.images.length + 1){
counter = 1;
}
current = jsSlider.children("div.jsSlideShow-img-block:nth-child(" + counter + ")");
current.fadeIn(options.speed, function(){
doFade();
});
}
return this;
};
})(jQuery);