我已经开始编写我的第一个插件了。它是一个简单的jQuery插件,可根据屏幕宽度重新排序DOM。如果插件在单个选择器上使用,例如$("#box3").domorder();
,则按预期工作。
但是,如果使用多个选择器来调用该函数,或者多次调用该函数,则该函数仅在第一个选择器上运行一次。
我有each(function(){})
迭代每个选择器,但我显然错过了一些东西。
(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));
答案 0 :(得分:1)
您正在循环的第一次迭代中将类添加到正文中。所以在第二次迭代中,body具有类,并且在命令代码中输入。你必须重新考虑addClass和removeClass的位置
并将以下代码放在每个
之外$(window).resize(function() {
initiatedomorder();
});
答案 1 :(得分:1)
$("body").addClass("domorder-reordered");
导致问题,因为只有第一次迭代才会进行排序。
也许您应该将$("body")
更改为$(el.parentNode)
。