Динамическое упорядочение div с использованием jQuery - PullRequest
9 голосов
/ 30 мая 2009

У меня есть следующая структура:

<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. Теперь я получаю массив, который имеет другой порядок, скажем, someid 3,2,1,4, тогда как мне переместить эти div'ы, чтобы соответствовать новому порядку, используя jQuery?

Большое спасибо за ваше время.

Ответы [ 4 ]

22 голосов
/ 30 мая 2009

Моя версия плагина - Рабочая демоверсия

Принимает массив и необязательный префикс 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>
3 голосов
/ 30 мая 2009

[Edit], это проверено и работает:

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.

Спасибо J-P и Рассу Кэму за то, что заставили меня снова взглянуть на это.

2 голосов
/ 30 мая 2009

Вот решение без 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']);
0 голосов
/ 30 мая 2009

Если у вас есть все содержимое массива, удалите все содержимое из оболочки div container в вашем коде. затем начните добавлять полученные дивы один за другим:

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

Если это не сработает, посмотрите в этот поток , в котором обсуждается расположение элементов относительно других элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...