使用 jQuery 动态排列 div

IT技术 javascript jquery
2021-03-15 07:39:43

我有以下结构:

<div id="container">
<div id="someid1" style="float:right"></div>
<div id="someid2" style="float:right"></div>
<div id="someid3" style="float:right"></div>
<div id="someid4" style="float:right"></div>
</div>

现在 someid 是该 div 的唯一 ID。现在我收到一个具有不同顺序的数组,比如 someid 3,2,1,4,那么我如何移动这些 div 以使用 jQuery 匹配新顺序?

非常感谢您的宝贵时间。

4个回答

我的插件版本 -工作演示

接受一个数组和可选的 id 前缀,并重新排序其 id 对应于 (id prefix) + 数组内值的顺序的元素。数组中没有具有相应 id 的元素的任何值都将被忽略,并且数组中没有 id 的任何子元素都将被删除。

(function($) {

$.fn.reOrder = function(array, prefix) {
  return this.each(function() {
    prefix = prefix || "";

    if (array) {    
      for(var i=0; i < array.length; i++) 
        array[i] = $('#' + prefix + array[i]);

      $(this).empty();  

      for(var i=0; i < array.length; i++)
        $(this).append(array[i]);      
    }
  });    
}
})(jQuery);

演示中的代码

jQuery

 $(function() {
  $('#go').click(function() {

    var order = $('#order').val() == ""? null: $('#order').val().split(",");
    $('#container').reOrder(order, 'someid');
  });
});

(function($) {

$.fn.reOrder = function(array, prefix) {
  return this.each(function() {
    prefix = prefix || "";

    if (array) {    
      for(var i=0; i < array.length; i++) 
        array[i] = $('#' + prefix + array[i]);

      $(this).empty();  

      for(var i=0; i < array.length; i++)
        $(this).append(array[i]);      
    }
  });    
}
})(jQuery);

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<title>reOrder Demo</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
body { background-color: #fff; font: 16px Helvetica, Arial; color: #000; }
div.style { width: 200px; height: 100px; border: 1px solid #000000; margin: 5px; }
</style>
</head>
<body>
<div id="container">
<div id="someid1" class="style" style="background-color:green;">div1</div>
<div id="someid2" class="style" style="background-color:blue;">div2</div>
<div id="someid3" class="style" style="background-color:red;">div3</div>
<div id="someid4" class="style" style="background-color:purple;">div4</div>
</div>
<p>Pass in a comma separated list of numbers 1-4 to reorder divs</p>
<input id="order" type="text" />
<input id="go" type="button" value="Re-Order" />


</body>
</html>
优秀的。我只是用它在 li 的列表上有一个“加/减”订购系统。改编得很棒。
2021-05-02 07:39:43
一个不错的更新将是一种隐藏任何未在一次传递中显示的方法,但让它们存活下来以在第二次调用中再次显示。例如,通过 1,2;然后通过 3,4。我正在研究一个滑块并在这里使用了一个答案stackoverflow.com/a/4649595/292060但这是一个很好的通用答案。
2021-05-15 07:39:43

[编辑],这是经过测试并有效的:

var order = [3,2,1,4];
var container = $("#container");
var children = container.children();
container.empty();
for (var i = 0; i < order.length; i++){
    container.append(children[order[i]-1])
}

i-1 是必需的,因为您的排序从 1 开始,但数组从 0 开始索引。

感谢 JP 和 Russ Cam 让我再看一遍。

在您的循环中,“i”值将仅为 0、1、2、3,而不是订单数组中的值。相反,您需要 container.append(children[order[i]-1]); 随意在这里测试:code.google.com/apis/ajax/playground/#jquery
2021-04-21 07:39:43
@Gabriel - 代码不会对 div 重新排序,因为我相信 var children 持有对相同元素的引用,这些元素被删除然后附加。这就是为什么他们需要被克隆
2021-04-23 07:39:43
在常规数组中使用 for-in 循环是不好的做法。
2021-05-06 07:39:43
@JP 你是对的,这是一个坏主意,因为 javascript 数组不知道如何计算 ;-)。当时是凌晨 4 点。@Russ Cam 不需要克隆元素。清空容器后,它们会保留在“children”变量中。测试和工作。
2021-05-08 07:39:43
@Gabriel - 你是。出于某种原因,昨天没有克隆似乎对我不起作用,但很明显。一定是别的什么。
2021-05-15 07:39:43

这是一个无 jQuery 的解决方案:

function appendNodesById(parent, ids) {
    for(var i = 0, len = ids.length; i < len; ++i)
        parent.appendChild(document.getElementById(ids[i]));
}

appendNodesById(document.getElementById('container'),
    ['someid4', 'someid2', 'someid3', 'someid1']);

如果您拥有数组中的所有内容,则从代码中的包装器 div容器删除所有内容然后开始一一添加接收到的div:

 var v = $(ar[0]).append(ar[1]).append(ar[2]);
 $("#container").html(v);   

如果这不起作用,请查看讨论有关相对于其他元素的定位元素的线程