【问题标题】:Re-initiating bxSlider for ajax-loaded content via jscroll通过 jscroll 为 ajax 加载的内容重新启动 bxSlider
【发布时间】:2016-01-18 15:08:17
【问题描述】:

我的内容跨越多个页面。通过jscroll,我可以成功地将更多页面的内容附加到我的当前页面。我正在使用一个按钮来启动附加内容的加载。

在我的整个页面中,我使用了多个 bxSlider 轮播,这些轮播停止为附加的、AJAX 加载的内容工作,因为 bxSlider 显然在页面加载时被触发(并且需要,如文档所述),因此它错过了任何新的滑块AJAX 加载的内容。

现在,bxSlider 有一个作为 reloadSlider 的功能,虽然在初始页面加载后似乎无法识别新添加的滑块,但它似乎仅用于向现有滑块添加新幻灯片。

有没有办法触发 bxSlider 重新评估页面的当前内容状态并处理在单击 jscroll 按钮时添加的新滑块(可能处理获取内容产生的任何延迟)?

这里只是一个星座的粗略草图:

<div id="outer_wrapper">
    <div id="content_wrapper">
        <!-- My initial content -->
        <div id="somediv">...</div>
        <div id="somediv2">...</div>
        <div id="somediv3" class="author_slider">My first carousel</div>
        <div id="somediv4">...</div>
        <div id="somediv5">...</div>
        <a href="page2.php" class="loadcontent">Load more content</a>

        <!-- My AJAX-loaded second page, bxSlider fails -->
        <div id="somediv6">...</div>
        <div id="somediv7">...</div>
        <div id="somediv8" class="author_slider">My second carousel</div>
        <div id="somediv9">...</div>
        <div id="somediv10">...</div>
        <a href="page3.php" class="loadcontent">Load more content</a>
    </div>
</div>

编辑:这是我的 bxSlider 和 jscroll 的 JS:

// Slider — Widget Authors
jQuery(document).ready(function(jQuery) {
    jQuery('.author_slider ul').bxSlider({
        minSlides: 3,
        maxSlides: 5,
        slideWidth: 104,
        speed: 500,
        pager: true,
        nextSelector: '.nextLink',
        prevSelector: '.prevLink'
    });
});


// JScroll
jQuery(document).ready(function(jQuery) {
    jQuery('#content_wrapper').jscroll({
        loadingHtml: '<div class="loadcontent loading"><a>Loading …</a></div>',
        nextSelector: '.loadcontent',
        contentSelector: '#content_wrapper',
        autoTrigger: false
    });
});

【问题讨论】:

    标签: jquery ajax bxslider jquery-jscroll


    【解决方案1】:

    加载包含新滑块的动态 HTML 后,您必须在这些元素上调用 bxSlider,然后才能将它们作为滑块访问。由于初始 $('.author_slider ul').bxSlider() 调用已经在页面加载时执行(在您的动态内容之前),新的轮播错过了这一点,因此没有初始化为 bxSlider。

    重新初始化相同的滑块是一种浪费,并且可能会导致问题,因此您需要跟踪正在初始化的滑块,以免重复执行。

    在 bxSlider() 初始化时要注意的另一件事是使用选择器来实现过于通用的分页机制。它们需要特定于您正在初始化的滑块,否则结果将无法预测或......不好。

    由于控件(pager 和 prev/next)元素位于滑块本身之外,因此您提供了选择器来指定用于此目的的元素。因此,在初始化滑块之前,我们需要识别并能够“选择”相应的控制元素。给定您的代码,没有固有的方法可以在不修改的情况下选择它们,所以这是第一步 - 找到控制元素并在它们上面放置一个标识符。

    然后,您可以初始化新的滑块并传递这些新的选择器来唯一标识您想要的控制元素。

    因此,如果您加载此内容,例如:

        <!-- My AJAX-loaded second page, bxSlider fails -->
                <div id="somediv6">...</div>
                <div id="somediv7">...</div>
                <div id="somediv8" class="author_slider">
                  My second carousel
                </div>
    

    在初始化时将类似下面的函数传递给 jScroll 'callback' 参数。此外,也可以将它用于您的第一次初始化(不要直接调用jQuery('.author_slider ul').bxSlider() - 而是在页面加载完成时调用下面的函数。

     <script>
    
    
    
    
    
    var trackSliders = [];
    // use this to increment the id count...
    var trackSliderCount = 0;
    
    var initSliders = function() {
    
        // this re-initialized ALL sliders, but that might be okay?
        jQuery('.author_slider ul').each( function( index, item ) {
    
            /* can't use the id attribute, so lets add our
            own data attribute */
            var obj = jQuery(item);
            // make sure to use lowercase in your data attribute name
            var id = obj.data('carousel-id');
            if (trackSliders.indexOf( id ) == -1 )
            {  
    
                var id = trackSliderCount++
    
                // this item has NOT been initialized.
                // save the id so we don't re-initialize
                obj.data('carousel-id', id);
                // push the id to our slider tracking array
                trackSliders.push( obj.data('carousel-id') );
    
                /* find control elements...
    
                   first step here is to get the closest containing
                   parent element that is identified
                   by the class 'author_slider'
                 */
                 var container = jQuery(obj.closest('.author_slider'));
    
                 // now, get the child elements from the container 
                 // that have your control elements
                 var prev = jQuery(container.find('.prevLink'));
                 var next = jQuery(container.find('.nextLink'));
                 var pager = jQuery(container.find('.author_pager'));
    
                 // now, we need to modify these elements so we can
                 // select them uniquely.  If I just wanted to store
                 // values, I would use the jQuery().data(key, val),
                 // but that won't work when we use it for selection
                 // ( that is for a different lesson ).  Instead, 
                 // let's just assign id's to these elements and use 
                 // ids.  Append 'id' from above to make them unique
                 var prevId = 'bxPrev_' + id;
                 var nextId = 'bxNext_' + id;
                 var pagerId = 'bxPager_' + id;
    
                 // now, set the id attribute on each object.
                 prev.attr('id', prevId );
                 next.attr('id', nextId );
                 pager.attr('id', pagerId );
    
    
                // now we can call bxSlider, but use our new id's 
                // as selectors.
                obj.bxSlider({
                    minSlides: 3,
                    maxSlides: 5,
                    slideWidth: 104,
                    speed: 500,
                    pager: true,
                    nextSelector: '#' + nextId,
                    prevSelector: '#' + prevId,
                    pagerSelector: '#' + pagerId,
                    prevText: '<i class="car2go-icon-caret-left"></i>',
                    nextText: '<i class="car2go-icon-caret-right"></i>',
                });
            };
        });
    };
    
    
    // jScroll
    
    jQuery(document).ready(function(jQuery) {
        // invoke the method
        initSliders();
    
        jQuery('.post_list_posts').jscroll({
            loadingHtml: '<div class="link_nextposts loading"><a><i class="car2go-icon-load"></i>Loading …</a></div>',
            nextSelector: '.link_nextposts a',
            contentSelector: '.post_list_posts',
            autoTrigger: false,
            // pass in the method to the callback.
            callback: initSliders
        });
    });
    </script>
    

    新的数据属性的东西没有经过测试。

    【讨论】:

    • 我认为您在分页机制上看到的问题是 bxslider 初始化选项中 pager 以及 prevnext 的选择器是通用类选择器。这意味着它们将匹配具有该规范的任何类:nextSelector: '.nextLink', prevSelector: '.prevLink', pagerSelector: '.author_pager',。规范中的这些参数过于笼统。我想不出一个明显的选择器可以为你解决这个问题。您必须编写自定义寻呼机和上一个/下一个功能或???
    • 是的,我愿意,因为它们必须按照您看到的方式排列。 prevSelector,然后是 pageSelector,然后是 nextSelector。通常它会将 prev/next 组合在一起,但布局需要我将其拆分。尽管如此,bxSlider 不会为自己的控件和寻呼机创建 ID,而且我无法处理随机 div 的 ID,因为它们事先是未知的。
    • 难道不能像调用整个轮播一样调用轮播ID吗?
    • 是的。将 id 动态分配给新的寻呼机元素可能是最简单的,然后将这些 id 用作选择器。要分配 id,您需要在 initSliders 方法中找到与 obj 相关的寻呼机元素。你知道该怎么做吗?
    • 老实说,不是真的。这超出了我的知识范围,以及您在此处实现的所有其他内容:(。我认为可以以某种方式使用包含滑块 ul 和控件/寻呼机元素的外部 div 来附加轮播 ID?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多