我有一个关于 jCarousel 插件的问题(来自 sorgalla)。如何以正确的方式从中删除项目?
你可以看到我在这里走了多远。尝试删除一些项目,然后向右滚动,您最终会看到“空滚动”,这就是我想要摆脱的。
我试过使用 remove(); jQuery 函数而不是更改 css 以显示:无;但这会在该项目曾经所在的位置产生一个奇怪的白色空白区域。如果您查看第 400 行的 jquery.jcarousel.js,您会看到一个删除功能,但我不确定如何使用它。
任何帮助深表感谢。谢谢!
你的例子是有道理的,除了因为你超出了插件的范围,jCarousel 不知道自己更新。从文档中,您提到的 remove() 方法似乎可行。然而,在我的试验中,我永远无法让 jCarousel 对象真正“做正确的事情”并更新它的按钮、滚动等。
正因为如此,我在 jCarousel 类上写了一个额外的方法来做这件事。您调用 removeAndAnimate(1) 删除轮播中的第一项并重建所有内容,以便启用/禁用下一个/上一个按钮,工作正常。
另外值得注意的是,jCarousel 提供的 remove() 函数可防止您删除当前正在显示的项目,这正是我们想要做的(例如,允许用户通过单击从轮播中删除图像) .
removeAndAnimate(i) 的实现:
removeAndAnimate: function(i) {
var e = this.get(i);
var d = this.dimension(e);
if (i < this.first) this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px');
e.remove();
this.options.size--;
var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
var li = this.list.children('li');
var self = this;
if (li.size() > 0) {
var wh = 0, i = this.options.offset;
li.each(function() {
self.format(this, i++);
wh += self.dimension(this, di);
});
this.list.css(this.wh, wh + 'px');
}
this.scroll(0,true);
this.buttons();
}
我建议将它直接放在 remove() 实现之后。要在回调函数之外使用 jQuery 访问 jCarousel 实例本身:
var carousel = $("#mycarousel").data("jcarousel");
carousel.removeAndAnimate(1);
那应该工作!
$.jcarousel.fn.extend({
removeAndAnimate: function(index) {
var itemsHTML = new Array();
var counter = 0;
// Me guardo los que quedan
for(i = 0; i < this.size(); i++)
{
if(i != (index - 1))
itemsHTML[counter++] = $('li[jcarouselindex|="' + i + '"]').html();
}
// Configuro uno menos y borro todo
this.size(this.options.size -1);
this.reset();
// Vuelvo a cargarlos
counter = 0;
for(i = 0; i < itemsHTML.length; i++)
{
this.add(counter++, itemsHTML[i]);
}
this.reload();
}
});
用法
var carousel = jQuery('#mycarousel').data('jcarousel');
carousel.removeAndAnimate(1);
我结合了你的两个答案,因为没有一个对我有用..
我在我的初始化自定义函数中添加了它
carousel.removeAndAnimate = function(i) {
var counter = 1;
var itemsHTML = new Array();
var e = this.get(i);
children = e.parent().find("li");
$(e).remove()
$.each(children,function(){
if(counter != i) {
itemsHTML[counter] = $(this).removeAttr("class").removeAttr("jcarouselindex");
}
counter++;
});
this.size(this.options.size -1);
this.reset();
counter = 1;
carousel = this;
$.each(itemsHTML, function(k, v){
if(v != null) {
carousel.add(counter, v[0].innerHTML);
counter++;
}
});
this.reload();
}
它运作良好..
您可以添加更多改进,例如滚动回刚刚删除的项目位置。
我发现白盒子的问题来自哪里。JCarousel 方法 format() 不会替换类名,而只是添加新的。我重写了这个函数,它对我很有效:
format: function(e, i) {
// remove all class names matches 'jcarousel-item' at the start
$(e)[0].className = $(e)[0].className.replace(/\bjcarousel\-item.\d-*?\b/g, '');
// add new class names
var $e = $(e).addClass('jcarousel-item').addClass('jcarousel-item-' + i).css({
'float': 'left',
'list-style': 'none'
});
$e.attr('jcarouselindex', i);
return $e;
}
我的另一个解决方案是向我加载的内容添加一个类,并删除 DOM 中没有此类的所有项目。一旦被 删除carousel.reset()
,这些元素就会系统地失去添加的类。
然后,您将能够使用以下方法删除白框:
$("li:not(.the_class)").remove();
carousel.add()
在函数之后添加它。
它运行良好,您甚至不必向轮播添加任何功能。
这是一个“易于使用”的解决方案,单击上一个/下一个按钮可能会显示一个白框。要删除它,请在回调buttonNextCallback
/上应用相同的解决方案buttonPrevCallback
。