【发布时间】:2019-02-21 07:08:35
【问题描述】:
我正在制作一个图像滑块插件,它可以在单个实例上正常工作,但是当我在页面上有多个实例时,变量会在这些实例之间共享,尤其是 currentPosition。如何对它们进行沙箱处理并保持实例隔离?
我尝试将它与我能找到的任何教程拼凑在一起,并且还查看了关于 SO 的类似问题,但它们没有帮助。代码如下:
var slider = $('.slider').mySlider();
...
;(function ($) {
var defaults = {
auto: false,
delay: 4000,
controls: true,
controlsPosition: 'inside', //inside, outside, neighbors
prevHtml: '<i class="material-icons">chevron_left</i>',
nextHtml: '<i class="material-icons">chevron_right</i>',
width: 70,
transitionSpeed: 400,
onLoad: function() {},
onSlideEnd : function() {}
};
var mySliderInit = function (el, options) {
var settings = $.extend({}, defaults, options || {}),
el = $(el);
el.wrap('<div class="mySlider-outerwrapper"><div class="mySlider-wrapper"></div></div>');
var outerWrapper = el.closest('.mySlider-outerwrapper'),
wrapper = el.closest('.mySlider-wrapper');
var numSlides = el.find('li').length,
numElements = numSlides+4,
wrapperWidth = wrapper.width(),
slideWidth = wrapperWidth*(settings.width)/100,
sideWidth = wrapperWidth*((100 - settings.width)/2)/100;
var slides = el.find('li');
slides.width(slideWidth);
//first move
var index = 0;
var slideMovement = wrapperWidth*settings.width/100;
var firstMovement = currentPosition = -(slideWidth-sideWidth+slideWidth);
el.css('transform', 'translateX('+(firstMovement)+'px)');
if(settings.controls){
outerWrapper.append('<a href="#" class="mySlider-nav mySlider-prev">'+settings.prevHtml+'</a>');
outerWrapper.append('<a href="#" class="mySlider-nav mySlider-next">'+settings.nextHtml+'</a>');
}
function moveSlider(direction){
if(direction == 'forward'){
index++;
currentPosition -= slideWidth;
} else if(direction == 'backward'){
index--;
currentPosition += slideWidth;
}
$(slides[index+2]).addClass('active').siblings().removeClass('active');
el.css('transform', 'translateX('+currentPosition+'px)');
}
outerWrapper.on('click', '.mySlider-next', function(e){
e.preventDefault();
moveSlider('forward');
});
outerWrapper.on('click', '.mySlider-prev', function(e){
e.preventDefault();
moveSlider('backward');
});
return this;
};
$.fn.mySlider = function (settings){
return this.each(function(){
new mySliderInit($(this), settings);
});
}
}(jQuery));
【问题讨论】:
-
你能创建一个有 2 或 3 个幻灯片元素的工作小提琴,这样我们就可以看到代码是如何工作的?
-
Does this help?尝试单击第一个滑块上的右箭头,然后单击第二个。第二个将移动两个位置。
-
其实,玩个小提琴会更好......但我有一个想法。根据 w3s javascript 范围:
If you assign a value to a variable that has not been declared, it will automatically become a GLOBAL variable.根据您的 console.log - 您的代码似乎适用于 index 变量,根据您单击的滑块具有不同的值。 currentPosition 变量没有声明,而是直接赋值。尝试在代码区域插入一行var currentPosition,如var index = 0; -
啊。就是这样。这解决了问题。太感谢了。把它作为答案,我会把它标记为正确的:)
标签: jquery scope jquery-plugins multiple-instances