【问题标题】:Having trouble implementing "jump to slide" in a jQuery slider在 jQuery 滑块中实现“跳转到幻灯片”时遇到问题
【发布时间】:2016-01-22 19:08:12
【问题描述】:

过去 2 天我一直在尝试这个,但似乎无法找到解决方案..

我有用于导航的上一个和下一个箭头(以及箭头键)。但是现在我有了一个时间线,我似乎无法使用 div-id(正确地)“跳转到”幻灯片?

例如,如果我想从第 1 部分转到第 5 部分,我希望能够单击我的第 5 部分按钮并跳转到该幻灯片。

Here is my working example。滑块的时间线出现在幻灯片 2+ 上。例如,我只在目标部分工作。

这是我用来“跳到幻灯片”的代码:

$('.slideshow-timeline a').click(function() {
    var target_id = $(this).attr('href');
    removeClasses();
    $($(".tour-panel")[current]).addClass("fadeOutRight");
    setTimeout(function() {
        $(target_id).addClass("active-tour fadeInLeft");
    }, 50);
    setTimeout(function() {
        $($(".tour-panel")[current]).removeClass("fadeOutRight");
    }, 750);
    current = target_id.split('-')[1] || 0;
});

但由于某种原因,我遇到了 2 个具体问题:

问题 1:我点击转到一张幻灯片,然后使用箭头键返回 ~ 这导致我跳回 2 张幻灯片。


问题 2:我单击转到幻灯片,然后使用箭头键前进 ~ 这打破了我的滑块并显示白屏

我相信大部分问题都在这行代码中:

current = target_id.split('-')[1] || 0;

但我不是 100% 确定需要您的帮助,我准备了一个非常基本的小提琴示例 here


我尝试过的一些事情是弄乱了split() 变量,换掉了nextElement();previousElement();,我就是找不到有效的解决方案。

非常感谢所有帮助!

特定文件的链接

Pastebin to full JS

Pastebin to full CSS

【问题讨论】:

  • 你能用 JS 来解决这个 bug 吗?
  • @Blag 有一个in place 具有基本功能。我也可以包含一个指向我的完整 JS 的 pastebin 链接。
  • <a href="#target-1">Tracking</a> => 跟踪在#target-2 和其他人一样,每个链接都不好...
  • 这与小提琴或工作示例有关吗?由于工作示例位于框架上,因此很难在小提琴中重新创建它。我会尝试做一个更清晰的小提琴
  • 所以澄清一下,您的滑块在单击鼠标时可以完美运行,但是当您使用箭头键进行导航时,它会搞砸吗?因为当我单击随机幻灯片按钮时,工作示例和 jsfiddle 似乎都对我有用 - 我能够跳转到这些幻灯片。

标签: javascript jquery html css


【解决方案1】:

看看那个小提琴:

https://jsfiddle.net/gjyswrr9/19/

问题出在三个地方:

var previous = parseInt(current, 10) - 1;
var next = parseInt(current) + 1;

(它们是字符串,而不是整数)。

还有

current = target_id.split('-')[1] - 1 || 0;

(你从 1 开始计算链接)

希望它能按您的需要工作。

【讨论】:

  • 现在var previousvar next 是在讨论替换previousIndex()nextIndex() 函数中的vars 吗? 编辑:刚刚更新了工作示例,但似乎仍然存在相同的问题
  • @ether 关于您的问题 - 是的,它们来自 previousIndex 和 nextIndex 函数。你检查过小提琴吗?有用吗?
  • 我确实注意到了,更新了我的实时示例,现在我可以单击底部链接进行导航。但如果我使用<> 或箭头键进一步导航,它仍然会跳来跳去,或者打破滑块。
  • @ether 我看到在你的例子中它被缩小了。这可能是问题吗?也许您应该删除旧文件并确保系统使用新文件?还是关闭缩小以进行调试?
  • 不幸的是,由于框架的原因,它会自动缩小 JS。
【解决方案2】:

给你 -> fiddle

我基本上改变的是您在点击函数中定义的current 值。实际上,您的 id 值是一个字符串,因此触发 nextElement() 不会更改该值,而是将其连接起来。这会导致一些奇怪的行为,所以不要从目标0 更改为1,您只需从0 更改为01

我还调整了您的 $('.slideshow-timeline a').click(function() { },使其行为方式与您的 nextElement() 函数相同。

编辑:我忘了提

我相信大部分问题都在这行代码中:

current = target_id.split('-')[1] || 0;

你说得对。如上所述,target_id.split('-')[1] 将返回一个字符串值,而不是一个数字,并且如上所述,这再次导致奇怪的行为,您的代码只是将返回的字符串与一个数字连接起来。为了达到你想要的目标,你必须使用 JavaScript 内置的 parseInt() 函数将 target_id.split('-')[1] 的值解析为 number 值。

结果如下:

current = parseInt(target_id.split('-')[1]) || 0;

【讨论】:

  • 在将您的想法实施到工作模型中之后,我们仍然存在一些问题。单击时间线中的链接将带您到链接 1(即:如果我单击自定义列表,它将带我进行分段)。此外,单击“优化”之类的部分标题会将我返回到游览主页。
  • 您是否更改了函数中的电流顺序?你是否也将你的字符串解析为一个 int,正如我在编辑中提到的那样?
  • 如更改当前订单,您的意思是将其添加到('.slideshow-timeline a')setTimeout 函数中吗?
  • 看看这个pastebin.com/vCerDb9D。实际上,您只需更改此行current = parseInt(target_id.split('-')[1]) || 0;。首先,在执行setTimeout() 之前将其拉起,因此它使用新的current 值。然后,在同一行中,将当前评估放入 parseInt() 函数中。这应该可以解决问题。让我知道它是否有效,如果无效,您可以分享您当前的 HTML/JS 吗?只是滑块部分就可以了。 :)
  • 该死,我真希望我能回来并说它有效,但仍然没有。我会尽力为您分离一些 HTML。 current js here 由于框架是使用模块构建的,因此还有很多额外的 containers 但这是我用来构建单个幻灯片的代码:single slide html
【解决方案3】:

你是对的......问题出在这一行:

current = target_id.split('-')[1] || 0;

试试这个:

current = (target_id.split('-')[1] - 1) || 0; // cater for zero-index

更新

  • 经过进一步调查,我在您的fiddle(16 年 2 月 12 日)上发现了一些东西: '连接'、'转换'和'优化'的'li'在上面的'ul'之外-我猜他们应该在哪里。
  • 上述 'li's 的 id 不符合您的命名约定(“target-1”、“target-2”等)。这肯定会导致这里采用的策略失败。
  • fiddle 中的每个 'li' 都应该有匹配的 'div' 元素...,缺少上述 'li' 的元素。

解决了这个fiddle 的一些问题。

【讨论】:

    【解决方案4】:

    你好,请检查下面的链接..

    这就是你要找的东西吗?

    请参考此链接 [jsFiddle][1]

    [1]: https://jsfiddle.net/gjyswrr9/39/
    

    脚本代码如下,

    $(document).ready(function() {
    
    var current = 0;
    
    function previousIndex() {
    var previous = parseInt(current,10) - 1;
    if(previous == 0) {
        previous = $(".tour-panel").size();
    }
    return previous;
    }
    
    function nextIndex() {
    var next = parseInt(current,10) + 1;
    if(next == $(".tour-panel").size()+1) {
    next = 1;
    }
    return next;
    }
    
    function removeClasses() {
    $(".tour-panel").each(function(index) {
    if(index != current) {
      $(this).removeClass("active-tour fadeInRight fadeInLeft fadeOutRight fadeOutLeft");
    }
    })
    }
    
    function nextElement() {
    removeClasses(); 
    current = nextIndex();
    setTimeout(function() {
    $("#target-"+current).addClass("active-tour fadeInRight");
     }, 50);
     }
    
    function previousElement() {
    removeClasses();
    current = previousIndex();
    setTimeout(function() {
    $("#target-"+current).addClass("active-tour fadeInLeft");  
    }, 50);
    setTimeout(function() {
    $($(".tour-panel")[nextIndex()]).removeClass("active-tour fadeOutRight");
    }, 750);
    }
    
    
    $('.slideshow-timeline a').click(function() {
      var target_id = $(this).attr('href');
    removeClasses();
    $($(".tour-panel")[current]).addClass("fadeOutRight");
    setTimeout(function() {
        $(target_id).addClass("active-tour fadeInLeft");
    }, 50);
    setTimeout(function() {
        $($(".tour-panel")[current]).removeClass("fadeOutRight");
    }, 750);
    current = target_id.split('-')[1] || 0;
    });
    
    
    Mousetrap.bind('left', previousElement);
    Mousetrap.bind('right', nextElement);
    
    $(".previous").click(previousElement);
    $(".next").click(nextElement);
    });
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 好的,我将编辑答案并添加代码部分。。感谢您的反馈
    • 一旦将它引入开发环境,它仍然会导致幻灯片跳跃,因为它使用时间轴分别计算幻灯片的 index 和使用箭头的幻灯片的 index键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多