【问题标题】:Bind/Detach/Append for Randomise function绑定/分离/附加随机函数
【发布时间】:2016-12-22 17:23:47
【问题描述】:

我遇到了一段代码(下面是从https://stackoverflow.com/questions/31459832/randomise-and-order-divs-slick-js 提取的)的问题,该代码本质上是为英雄滑块随机化一组幻灯片(使用 slick.js)。这个特殊的 sn-p 随机化幻灯片,但在幻灯片结束时保持最后一张幻灯片的顺序。

让我感到困惑的部分,我确信与我的问题相关的部分是绑定/分离/附加序列。我的目标是将第一张幻灯片放在开头,而不是最后一张幻灯片。 我假设 if 语句应该检查 0,而不是数组长度 1... 如上所述,我的困惑是绑定/分离/追加。

如果有人能阐明我应该前进的方向,将不胜感激。我的 Javascript 有点生疏,我相信你能看出来!

非常感谢。

JJ

$.fn.randomize = function (selector) {
    var $elems = selector ? $(this).find(selector) : $(this).children(),
        $parents = $elems.parent();

    $parents.each(function () {
        $(this).children(selector).sort(function (childA, childB) {
            // * Prevent last slide from being reordered
            if($(childB).index() !== $(this).children(selector).length - 1) {
                return Math.round(Math.random()) - 0.5;
            }

        }.bind(this)).detach().appendTo(this);
    });

    return this;
};



        $('#carousel-hero .carousel-inner').randomize().slick({
            speed: 3000,
            dots: true,
            fade: true,
            autoplay: true,
            autoplaySpeed: 3000,

            prevArrow: '<button type="button" data-role="none" class="carousel-control left slick-prev">Previous</button>',
            nextArrow: '<button type="button" data-role="none" class="carousel-control right slick-next">Next</button>',
        });

    }

【问题讨论】:

    标签: javascript jquery append bind


    【解决方案1】:

    我的目标是将第一张幻灯片保持在开头

    我建议不要编写一个怪异的“随机化”函数来几乎但不完全随机化一个元素的所有子元素,而是编写一个适当的函数并让代码的不同部分处理特殊要求保留“第一个”元素。

    重要的是要知道 DOM 中的一个节点不能同时存在于两个地方。您在一个位置附加的内容将从现在的位置删除。因此,没有必要做任何“分离”体操。只需通过将节点附加到新父级或同一个父级来移动节点,以随机顺序。

    所以你的任务变得非常简单易读:

    $.fn.randomizeChildren = function () {
        var randomOrder = function () {
            return Math.random() - 0.5;
        };
        return this.each(function () {
            $(this).append( $(this).children().sort(randomOrder) );
        });
    };
    
    $("#randomize").click(function () {
        $("ul.random").randomizeChildren().prepend(function () {
            return $(this).find(".first");
        });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <table>
      <tr><td>
        <ul class="random">
          <li class="first">1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>
        </ul>
      </td><td>
        <ul class="random">
          <li class="first">1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li>
        </ul>
      </td></tr>
    </table>
    
    <button id="randomize">Randomize</button>

    【讨论】:

    • 已按照您的建议删除了答案。以后我应该如何表达我的问题?我应该在主板上再问一个问题吗?
    • 基本上,是的。但请注意不要通过引用您的旧问题来创建“假论坛帖子”,要求您的读者先去了解那个。 StackOverflow 用于提出独立的问题,这些问题提供了理解和回答这些问题所需的所有上下文。理想情况下,您的第一个问题已经足够充实,以至于答案不会导致“但现在我得到不同的错误”响应,这很快就会演变为交互式调试会话,对线程的任何未来访问者几乎没有任何价值。
    • 我很困惑。在不参考我原来的问题的情况下,我怎么能寻求答案的帮助。我本可以粘贴整个页面的代码,但这可能会更烦人,不是吗?很抱歉听起来像个没用的菜鸟。
    • 您应该考虑您的问题并以可以回答的方式提出问题,简单明了。 “我有 A,我怎么能用它做 B?” - 有些人来展示做 B 的方法 - 故事结束。我想您过去曾以读者的身份访问过 StackOverflow,并很快找到了对您的问题有用的答案。这可能的唯一原因是因为 StackOverflow 明确 不像论坛那样工作。没有跟进,没有讨论,尽可能少的纯粹基于意见的帖子。
    • 没关系,至少你在乎。大多数新用户不会。理想的问题包含MCVE。您不应该发布整个代码。没有人愿意阅读 250 行大部分无关紧要的东西——我的意思是,从读者的角度来看,你不会,对吗?凝结。去除任何无用的复杂性。尝试充实核心问题。针对次要问题提出一个单独的问题(当然,除非您首先找到解决方案)。听起来很辛苦?它是。引发全面跟进的问题没有经过深思熟虑。
    猜你喜欢
    • 2013-01-04
    • 2014-12-28
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2014-06-17
    • 2013-08-01
    相关资源
    最近更新 更多