【问题标题】:How to get ID value of parents of previous and next carousel slides? (jQuery)如何获取上一个和下一个轮播幻灯片的父母的ID值? (jQuery)
【发布时间】:2013-03-06 03:06:58
【问题描述】:

我正在尝试编写脚本,将描述分配给轮播的“上一个”和“下一个”链接。需要根据当前幻灯片的数值从轮播项ID属性中读取描述(可以通过轮播API访问-见第一行JS代码-返回从1开始的轮播项数值)

HTML:

<div id="carousel-wrapper" class="content-promo carousel-wrapper>
  <div class='wrapper'>

    <div id='features' class=' ccm-block-styles'>
      <div id='slide-1' class='carousel-slide'>
         <!-- SOME CONTENT  -->
      </div>
    </div>

    <div id='lifestyle' class=' ccm-block-styles'>
      <div id='slide-2' class='carousel-slide'>
         <!-- SOME CONTENT  -->
      </div>
    </div>

    <div id='food-&-drink' class=' ccm-block-styles'>
      <div id='slide-3' class='carousel-slide'>
         <!-- SOME CONTENT  -->
      </div>
    </div>

  </div> <!-- End of .wrapper -->
</div> <!-- End of #carousel-wrapper -->

JS:

currentslide = $( ".carousel-wrapper" ).rcarousel( "getCurrentPage" );
prevslide = currentslide - 2; // as eq() counts from 0
prevslideidtext = $(".carousel-slide").eq( prevslide ).parent().attr( "id" );
nextslide = currentslide;
nextslideidtext = $(".carousel-slide").eq( nextslide ).parent().attr( "id" );

不幸的是prevslideidtextnextslideidtextundefined 时,而不是返回上一个幻灯片父级的ID DIV 返回当前幻灯片父级的ID。

结果示例(当第一张幻灯片是当前幻灯片时):

currentslide = 1
prevslide = -1
nextslide = 1
prevslideidtext = features
nextslideidtext = undefined

carousel-slide 类有 6 个 DIV(上面的 HTML 代码中只显示了 3 个),但上面的 JS 脚本的行为与只有一个一样。

我做错了什么?

我不坚持使用eq();它只是在我看来是一种清晰而简单的方法来达到我需要的效果。

(我知道当传递给 eq() 的索引超出范围时,eq() 会创建新的空项目,我将对其进行排序 - 最后一张幻灯片 - 稍后)

谢谢

【问题讨论】:

  • 所以如果它是第一张幻灯片.. prev 应该是最后一张吗?如果最后一张幻灯片..下一张应该是第一张吗?
  • 是的,那是环形旋转木马。这就是我选择eq() 的原因,因为eg(-1) 的意思是“从头到尾”。对于最后一张幻灯片,我打算将nextslide 值与幻灯片总数进行比较,如果是最后一张幻灯片,只需读取第一张幻灯片父级的 ID。但是我的问题不同 - 上面的 JS 代码不能按预期工作 - 我无法获取上一张和下一张幻灯片 ID 的值。

标签: jquery carousel


【解决方案1】:

您好,首先让我更好地帮助您,您能做到以下几点:

1.) 将您的示例代码放在 JSFiddle 或 CodePen 中。然后把那个链接发回这里。 http://jsfiddle.net/ http://codepen.io/

只是一个提示,我建议您更改上面的类名或 ID 名称。拥有同名的 ID 和类并不是一个好习惯。

你有以下:

<div id="carousel-wrapper" class="content-promo carousel-wrapper>

更新:看来您需要关闭 #carousel-wrapper 元素的类属性中的引号。

【讨论】:

  • 好的,完成,这是链接:[jsfiddle.net/SCbtk/3/] 我改变了两件事:1. currentslide 的值是硬编码的(所以显示的代码独立于其余部分脚本)2. 第二张幻灯片现在是当前的,所以情况更简单,因为最后一张幻灯片的“下一张”链接没有问题
  • 让我们一步一步来... jsfiddle.net/SCbtk/4 我所做的只是从#carousel-wrapper 类中引用。这是你唯一的问题吗?
  • 不幸的是缺少结束引号只是小提琴中的错字。这句话确实存在于我的代码中。但是,您让我明白我错了,小提琴中显示的这个孤立的代码是问题的根源,并且独立于脚本的其余部分。没错,小提琴中显示的代码按预期工作。这与来自真实(整个)脚本的结果一起让我得出结论,eq() 处理仅包含一项的.carousel-item 列表。
  • 显然我正在使用的轮播插件会以某种方式从 DOM 树中删除所有幻灯片,但当前幻灯片除外(这实际上在页面源代码中可见)。所以我假设我需要做的是 1. 在运行 carousel 之前,我需要读取所有必需的 ID 并将它们存储在数组中,2. 运行 carousel,3. 检查当前幻灯片编号,4. 读取上一个和下一个的 ID从数组 5 中滑动,使用 html();应用于轮播控件@因为我是 jQuery 的初学者,我的第一个问题是 “这是正确的方法吗?” 我的第二个问题是:“什么是第一步的最佳方法(将 ID 值存储到数组中)?"
  • 我认为问题更多在于您如何使用该插件。我搜索了那个插件并找到了一个示例页面。在 Firebug 中以及通过右键单击页面并单击“查看源代码”来查看页面源代码。你会得到一些有用的提示。 (ryrych.github.com/rcarousel/examples/html.html)
【解决方案2】:

我为我的问题找到的解决方法:

// 1. Read and save old carousel navigation text (like "Prev" and "Next")
carouselprevoldtext = $('#ui-carousel-prev').children(".carousel-control-text").html();
carouselnextoldtext = $('#ui-carousel-next').children(".carousel-control-text").html();
// 2. How many slides?
maxslidenumber = $(".carousel-slide").length;
// 3. Create an array with all slides' IDs (in this particular case I use parent() as ID is assigned through CMS by user not hardcoded - and extra DIV is added by CMS)
slideidarray = {};
$(".carousel-slide").each(
    function(index){
    slideidarray[index] = $ ( this ).parent().attr('id');
}                      
);
// 4. Run the carousel
$( ".carousel-wrapper" ).rcarousel({ OPTIONS HERE });
// 5. Find current slide
currentslide = $( ".carousel-wrapper" ).rcarousel( "getCurrentPage" ); // starts from 1 not from 0
// 6. Find previous and next slides ID texts
// A. For first slide - previous slide is the last one
if (currentslide == 1) {
    prevslideidtext = slideidarray[maxslidenumber - 1];
    nextslideidtext = slideidarray[1];
}
else {
    prevslideidtext = slideidarray[currentslide - 2]; // as arrays count from 0
    nextslideidtext = slideidarray[currentslide];
    // B. For last slide - next slide is the first one
    if (currentslide == maxslidenumber) {
    nextslideidtext = slideidarray[0];
    }
}
// 7. Create new carousel navigation text
carouselprevupdhtml = "<span class='carousel-control-text'>" + carouselprevoldtext + ": </span><span class='carousel-control-title'>" + prevslideidtext + '</span>';
carouselnextupdhtml = "<span class='carousel-control-text'>" + carouselnextoldtext + ": </span><span class='carousel-control-title'>" + nextslideidtext + '</span>';
// 8. Assign it to carousel navigation
$('#ui-carousel-prev').html( carouselprevupdhtml );
$('#ui-carousel-next').html( carouselnextupdhtml );

当然,每次更换幻灯片时都需要重复步骤 5 到 8。

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多