- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这有点棘手。我正在构建一个 Carousel View ,它在加载时使用 jQuery 连接起来。
这是标记:
<div class="carousel" data-direction="v" id="carousel1">
<div class="card-cont">
<div id="card1" class="card">This is Card 1</div>
<div id="card2" class="card">This is Card 2</div>
<div id="card3" class="card">This is Card 3</div>
<div id="card4" class="card">This is Card 4</div>
</div>
</div>
<div class="carousel" data-direction="h" id="carousel2">
<div class="card-cont">
<div id="card5" class="card">This is Card 1</div>
<div id="card6" class="card">This is Card 2</div>
<div id="card7" class="card">This is Card 3</div>
<div id="card8" class="card">This is Card 4</div>
</div>
</div>
我使用 jQuery 遍历所有 .carousel
元素并连接功能。代码是面向对象的,我在这里发布了一些 jsFiddle > http://jsfiddle.net/eZbUB/
问题是,每当我在一个页面上有多个轮播时,事件(即更换卡片)只会应用于页面上的最后一个轮播。有没有人有办法解决吗?指示器和尺寸等的定位功能都可以正常工作。这是完整的 jQuery 代码:
$(function(){
$('.carousel').each(function() { Carousel.init($(this)); });
});
var Carousel = {
container : null,
card_container : null,
cards : [ ],
card_width : 0,
no_cards : 0,
indicator : { },
current_card : 0,
direction : 'h',
init : function(container) {
// Assin vars:
var self = this;
this.container = container;
this.card_container = this.container.find('.card-cont');
this.cards = this.container.find('div.card');
this.card_width = this.container.width();
this.no_cards = this.cards.length;
this.direction = $(this.container).attr('data-direction');
// Size the container:
this.card_container.width((this.card_width * this.no_cards))
// Add an indicator:
this.indicator = $('<ul class="card-indicator" />');
this.indicator.items = [ ];
if(this.direction == 'v') { this.indicator.addClass('vertical'); }
for(var i = 0; i < this.no_cards; i++)
{
$(this.cards[i]).width(this.card_width);
var indicator_item = $('<li />');
indicator_item.click(function() { self.setCard($(this).index()); });
this.indicator.append(indicator_item);
this.indicator.items.push(indicator_item);
}
this.indicator.appendTo(this.container);
// Position the indicator:
if(this.direction == 'h')
{
var indicator_top_pos = ((this.container.offset().top + this.container.height()) - this.indicator.height());
var indicator_left_pos = (this.container.width() - this.indicator.width()) / 2;
this.indicator.css({ top: indicator_top_pos, left: indicator_left_pos });
}
else
{
var indicator_top_pos = (this.container.height() - this.indicator.height()) / 2;
var indicator_left_pos = (this.container.offset().left + this.container.width()) - 20;
this.indicator.css({ top: indicator_top_pos, left: indicator_left_pos });
}
// Add the current styles to everything:
$(this.cards[0]).addClass('current');
this.indicator.items[0].addClass('current');
// Hook up the drag events:
var mouse_start_x = 0;
var mouse_end_x = 0;
var mouse_start_y = 0;
var mouse_end_y = 0;
var direction_x = null;
var direction_y = null;
var next_index = 0;
this.container.mousedown(function(e) {
mouse_start_x = e.pageX;
mouse_start_y = e.pageY;
});
this.container.mouseup(function(e) {
mouse_end_x = e.pageX;
mouse_end_y = e.pageY;
alert(self.container.attr('id'));
if(mouse_end_x > mouse_start_x) { direction_x = 'right'; }
if(mouse_end_x < mouse_start_x) { direction_x = 'left'; }
if(mouse_end_y > mouse_start_y) { direction_y = 'down'; }
if(mouse_end_y < mouse_start_y) { direction_y = 'up'; }
switch(self.direction)
{
case 'v':
if(direction_y == 'down') { next_index = (self.current_card == 0) ? 0 : self.current_card - 1; }
if(direction_y == 'up') { next_index = (self.current_card == (self.no_cards - 1)) ? self.current_card : self.current_card + 1; }
break;
case 'h':
default:
if(direction_x == 'right') { next_index = (self.current_card == (self.no_cards - 1)) ? self.current_card : self.current_card + 1; }
if(direction_x == 'left') { next_index = (self.current_card == 0) ? 0 : self.current_card - 1; }
break;
}
self.setCard(next_index);
});
// Return the object (we use init as a constructor):
return this;
},
// Function to check if we're on the last card:
onLastCard : function() {
return (this.current_card == (this.indicator.items.length - 1)) ? true : false;
},
// Function to check if we're on the first card:
onFirstCard : function() {
return (this.current_card == 0) ? true : false;
},
setCard : function(index) {
// If the index matches the current one, don't do anything:
if(index == this.current_card)
{
return;
}
else
{
// Calculate the left position we need to move:
var new_left_pos = this.card_width * index;
this.card_container.css({ left: -new_left_pos });
this.indicator.items[this.current_card].removeClass('current');
this.indicator.items[index].addClass('current');
this.current_card = index;
return true;
}
},
};
我尝试过其他替代方案(例如 bind()
和 live()
,但都没有用)。非常感谢收到的任何帮助。
最佳答案
您在 init
函数中调用 Carousel.init
的方式 this
将始终是 Carousel
—也就是说,只有一个。这就是为什么你只看到它被应用到最后。
我会考虑将 Carousel
改造为一个构造函数(您使用 new
的那种)。 @Boo 刚刚在Carousel.init
前面抛出一个new
,这是一个好的开始,但是正在创建的对象不会有你放置的各种属性在 Carousel
上。
这是一个快速的返工;它完全未经测试,但应该会带您朝着正确的方向前进:
// Scoping function so our various member functions can have proper names
var Carousel = (function() {
// The constructor function
function Carousel() {
// Assign vars:
var self = this; // Important for the event handler closures
this.container = container;
this.card_container = this.container.find('.card-cont');
this.cards = this.container.find('div.card');
this.card_width = this.container.width();
this.no_cards = this.cards.length;
this.direction = $(this.container).attr('data-direction');
// Size the container:
this.card_container.width((this.card_width * this.no_cards))
// Add an indicator:
this.indicator = $('<ul class="card-indicator" />');
this.indicator.items = [ ];
if(this.direction == 'v') { this.indicator.addClass('vertical'); }
for(var i = 0; i < this.no_cards; i++)
{
$(this.cards[i]).width(this.card_width);
var indicator_item = $('<li />');
indicator_item.click(function() { self.setCard($(this).index()); });
this.indicator.append(indicator_item);
this.indicator.items.push(indicator_item);
}
this.indicator.appendTo(this.container);
// Position the indicator:
if(this.direction == 'h')
{
var indicator_top_pos = ((this.container.offset().top + this.container.height()) - this.indicator.height());
var indicator_left_pos = (this.container.width() - this.indicator.width()) / 2;
this.indicator.css({ top: indicator_top_pos, left: indicator_left_pos });
}
else
{
var indicator_top_pos = (this.container.height() - this.indicator.height()) / 2;
var indicator_left_pos = (this.container.offset().left + this.container.width()) - 20;
this.indicator.css({ top: indicator_top_pos, left: indicator_left_pos });
}
// Add the current styles to everything:
$(this.cards[0]).addClass('current');
this.indicator.items[0].addClass('current');
// Hook up the drag events:
var mouse_start_x = 0;
var mouse_end_x = 0;
var mouse_start_y = 0;
var mouse_end_y = 0;
var direction_x = null;
var direction_y = null;
var next_index = 0;
this.container.mousedown(function(e) {
mouse_start_x = e.pageX;
mouse_start_y = e.pageY;
});
this.container.mouseup(function(e) {
mouse_end_x = e.pageX;
mouse_end_y = e.pageY;
alert(self.container.attr('id'));
if(mouse_end_x > mouse_start_x) { direction_x = 'right'; }
if(mouse_end_x < mouse_start_x) { direction_x = 'left'; }
if(mouse_end_y > mouse_start_y) { direction_y = 'down'; }
if(mouse_end_y < mouse_start_y) { direction_y = 'up'; }
switch(self.direction)
{
case 'v':
if(direction_y == 'down') { next_index = (self.current_card == 0) ? 0 : self.current_card - 1; }
if(direction_y == 'up') { next_index = (self.current_card == (self.no_cards - 1)) ? self.current_card : self.current_card + 1; }
break;
case 'h':
default:
if(direction_x == 'right') { next_index = (self.current_card == (self.no_cards - 1)) ? self.current_card : self.current_card + 1; }
if(direction_x == 'left') { next_index = (self.current_card == 0) ? 0 : self.current_card - 1; }
break;
}
self.setCard(next_index);
});
// No need to return `this`, that's what constructor functions do by default
}
// Our various member functions, we'll assign them to the prototype below
// Function to check if we're on the last card:
function Carousel$onLastCard() {
return (this.current_card == (this.indicator.items.length - 1)) ? true : false;
}
// Function to check if we're on the first card:
function Carousel$onFirstCard() {
return (this.current_card == 0) ? true : false;
}
function Carousel$setCard(index) {
// If the index matches the current one, don't do anything:
if(index == this.current_card)
{
return;
}
else
{
// Calculate the left position we need to move:
var new_left_pos = this.card_width * index;
this.card_container.css({ left: -new_left_pos });
this.indicator.items[this.current_card].removeClass('current');
this.indicator.items[index].addClass('current');
this.current_card = index;
return true;
}
}
// Fill in the prototype that will be assigned to all objects created
// via `new Carousel`:
Carousel.prototype.onLastCard = Carousel$onLastCard;
Carousel.prototype.onFirstCard = Carousel$onFirstCard;
Carousel.prototype.setCard = Carousel$setCard;
// Return our constructor out of the scoping function to be assigned
// to the public var
return Carousel;
})();
然后使用是:
$(function(){
$('.carousel').each(function() { new Carousel($(this)); });
});
同样,以上内容并不意味着完美、完成和尘埃落定。这是为了演示如何将 Carousel
重新表述为 构造函数 并在其原型(prototype)上设置函数,以便将它们分配给通过 new Carousel
创建的实例.需要进行一些调试。我很高兴看到你已经在事件处理程序中处理了 this
的问题(通过你的 self
变量,在以前的 init
现在是 Carousel
函数)。
一些可能有用的读物:
关于jQuery 事件只适用于最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978971/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!