基于url hash启动bxSlider

时间:2016-08-03 23:11:14

标签: javascript jquery html

我希望我的bXslider幻灯片根据加载网址中的哈希值进行更改。 如果我的网址是www.website.com/#slide1,它应显示第一张幻灯片,如果我的网址是www.website.com/#slide2,则应显示第二张幻灯片。

我能够通过使用这个jQuery代码使其工作:

if(typeof $.fn.bxSlider !== "undefined"){
            var mainSlider = $('#homepage .bxslider').bxSlider({
                mode:'fade',
                pager: true,
            });
            if(location.hash === "#slide1") {
                mainSlider.goToSlide(1);
            } else if(location.hash === "#slide2"){
                mainSlider.goToSlide(2);
            } else if(location.hash === "#slide3"){
                mainSlider.goToSlide(3);
            } else if(location.hash === "#slide4"){
                mainSlider.goToSlide(4);
            } else if(location.hash === "#slide5"){
                mainSlider.goToSlide(5);
            } else if(location.hash === "#slide6"){
                mainSlider.goToSlide(6);
            } else if(location.hash === "#slide7"){
                mainSlider.goToSlide(7);
            } else if(location.hash === "#slide8"){
                mainSlider.goToSlide(8);
            } else if(location.hash === "#slide9"){
                mainSlider.goToSlide(9);
            } else if(location.hash === "#slide10"){
                mainSlider.goToSlide(10);
            } else if(location.hash === "#slide11"){
                mainSlider.goToSlide(11);
            } else if(location.hash === "#slide12"){
                mainSlider.goToSlide(12);
            } else if(location.hash === "#slide13"){
                mainSlider.goToSlide(13);
            } else if(location.hash === "#slide14"){
                mainSlider.goToSlide(14);
            } 
        }

问题是,它仅在散列为#slide1或#slide2时有效。我的代码有问题吗?有没有更短的方式这样做?

另外,我使用下面的代码为我的所有.bx-pager-item元素添加不同的ID:

$('#pagination .bx-pager-item').each(function(i) {
   $(this).attr('id', 'slide'+(i+1));
});

如何将id作为哈希添加到href的末尾,这样当你点击第一个带有幻灯片1的.bx-pager-item元素时,它会带你到另一个页面,其哈希为# URL末尾的slide1?

1 个答案:

答案 0 :(得分:0)

  

问题是,它只适用于散列#1和#2。在那儿   我的代码出了什么问题?这样做有更短的方法吗?

The documentation表示您可以在实例化滑块时传递startSlide选项。因此,您的代码可能如下所示:

if (typeof $.fn.bxSlider !== "undefined") {

  // Check if '#slide' is present in the hash.
  // Replace it with an empty string so we have whatever comes after left.
  // Convert that to an integer for the startSlide option

  var slideId = (location.hash.indexOf('#slide') > -1) ? parseInt(location.hash.replace('#slide', ''), 10) : null;

  if (slideId) {

    $('#homepage .bxslider').bxSlider({
      mode:'fade',
      pager: true,
      startSlide: slideId - 1,
    });

  }

}

但它并不完全是防弹的。您可以添加更多检查,以确保有人无法成功输入#slide10abc。在这种情况下,parseInt不会按照你的方式抛出正确的索引:)

  

如何将id作为哈希添加到href的末尾,以便在您使用时   单击第一个.bx-pager-item元素,其id为slide1 it   将带您进入另一页,其末尾是#slide1的哈希值   网址?

我不太确定我是否理解正确,但我认为您可以根据您正在循环的HTML执行此类操作:

$('#pagination .bx-pager-item').each(function(i) {
   var $this = $(this);
   var currentHref = $this.attr('href');
   var newHref = currentHref + '/#slide' + (i+1);
   $this.attr('href', newHref);
});

同样,您可以进行一些检查以确保您设置为新href的内容实际上是有效/正确的URL。例如。检查当前href末尾的'/',从而避免添加两次。

希望以上内容能让您更接近目标。如果没有,请在评论中提出进一步的解释。

回答评论:在回调中合并两段代码

If you want to manipulate the slides after bxSlider is loaded, you could use the ```onSliderLoad``` callback, which is passed to the options object for the slider. It would look something like this:

if (typeof $.fn.bxSlider !== "undefined") {

  var slideId = (location.hash.indexOf('#slide') > -1) ? parseInt(location.hash.replace('#slide', ''), 10) : null;

  if (slideId) {

    $('#homepage .bxslider').bxSlider({
      mode:'fade',
      pager: true,
      startSlide: slideId - 1,
      onSliderLoad: function() {
        $('#pagination .bx-pager-item').each(function(i) {
           var $this = $(this);
           var currentHref = $this.attr('href');
           var newHref = currentHref + '/#slide' + (i+1);
           $this.attr('href', newHref);
        });
      }
    });

  }

}