0

我尝试编写我的第一个插件。这是一个简单的 jQuery 插件,可以根据屏幕宽度对 DOM 进行重新排序。如果插件在单个选择器上使用,$("#box3").domorder();它会按预期工作。

但是,如果使用多个选择器来调用该函数,或者该函数被多次调用,则该函数只能在第一个选择器上工作一次。

each(function(){})对每个选择器进行了迭代,但我显然遗漏了一些东西。

jsFiddle

(function($) {
    "use strict";

    $.fn.domorder = function(options) {

        var settings = {
            breakpoint : 960,
            targetContainer : $(this).parent(),
            targetPosition : "start"
        };

        if (options) {
            $.extend(settings, options);
        }

        return this.each(function(i, el) {
            /* remember selector's original order position */
            var originalLocation = {};
            if ($(el).prev().length) {
                /* not originally first child */
                originalLocation.prev = $(el).prev()[0];
            } else {
                /* originally a first child */
                originalLocation.parent = $(el).parent()[0];
            }

            var initiatedomorder = function() {
                var winW = $(window).width();

                if (winW < settings.breakpoint && !$("body").hasClass("domorder-reordered")) {
                    /* dom the order of the item */

                    if (settings.targetPosition === "start") {
                        $(el).prependTo(settings.targetContainer[0]);
                    } else {
                        $(el).appendTo(settings.targetContainer[0]);
                    }
                    $("body").addClass("domorder-reordered");
                } else if (winW >= settings.breakpoint && $("body").hasClass("domorder-reordered")) {
                    /* return the reordered item back into the orignal flow */
                    if (originalLocation.parent) {
                        /* element was a first child */
                        $(originalLocation.parent).prepend(el);
                    } else {
                        /* element was not a first child */
                        /* add a line break to preserve inline-block spacing */
                        $(originalLocation.prev).after(el).after("\n");
                    }
                    $("body").removeClass("domorder-reordered");
                }
            };

            initiatedomorder();

            $(window).resize(function() {
                initiatedomorder();
            });
        });
    };
}(jQuery));
4

2 回答 2

1

您正在循环的第一次迭代中将类添加到正文中。所以在第二次迭代中,类和 wot 进入了订购代码。您必须重新考虑 addClass 和 removeClass 的位置

并将以下代码放在每个之外

$(window).resize(function() {
    initiatedomorder();
});
于 2013-06-18T06:36:13.787 回答
1

$("body").addClass("domorder-reordered");导致问题,因为只有第一次迭代会进行排序。

也许您应该将其更改$("body")为类似$(el.parentNode).

检查这个jsfiddle

于 2013-06-18T06:47:30.357 回答