Рандомизировать последовательность элементов div с помощью jQuery
Я пытаюсь выполнить мои шаги с jQuery, но мне трудно понять, как найти список дочерних элементов из родительского элемента div. Я привык работать с ActionScript 2 и ActionScript 3, поэтому я мог бы ошибиться в какой-то концепции, например, как лучший способ рандомизировать последовательность элементов div с помощью jQuery!
У меня есть эта простая часть кода HTML:
<div class="band">
<div class="member">
<ul>
<li>John</li>
<li>Lennon</li>
</ul>
</div>
<div class="member">
<ul>
<li>Paul</li>
<li>McCartney</li>
</ul>
</div>
<div class="member">
<ul>
<li>George</li>
<li>Harrison</li>
</ul>
</div>
<div class="member">
<ul>
<li>Ringo</li>
<li>Starr</li>
</ul>
</div>
</div>
Я попытался сделать это как map .member divs в одном массиве, а затем изменил порядок сортировки, но безуспешно.
function setArrayElements (element_parent) {
var arr = [];
//alert (element_parent[0].innerHTML);
for (var i = 0; i < element_parent.children().length; i ++) {
arr.push (element_parent[i].innerHTML);
}
}
setArrayElements($(".band"));
когда я попытался оповестить element_parent [0], я думал, чтобы получить первый дочерний элемент моего .member списка div, но это не так.
если я сделаю предупреждение с element_parent [0].innerHTML, я вижу, что:
<div class="member">
<ul>
<li>John</li>
<li>Lennon</li>
</ul>
</div>
<div class="member">
<ul>
<li>Paul</li>
<li>McCartney</li>
</ul>
</div>
<div class="member">
<ul>
<li>George</li>
<li>Harrison</li>
</ul>
</div>
<div class="member">
<ul>
<li>Ringo</li>
<li>Starr</li>
</ul>
</div>
Почему?
Как я могу сделать, чтобы получить именно один из таких членов?
<div class="member">
<ul>
<li>Paul</li>
<li>McCartney</li>
</ul>
</div>
Я уверен, что это должно быть легко, но я просто не знаю, как
: (
пожалуйста, помогите
спасибо
Витторио
EDIT:
Благодарим за стабильность и различные способы получения выбранных детей. Я буду отмечать эти пути на будущее!
Я пробовал эти методы, но, похоже, я не мог получить весь div (пожалуйста, сообщите, если я что-то совершу, это может быть слишком много!).
Я хочу получить этот контент:
<div class="member">
<ul>
<li>Ringo</li>
<li>Starr</li>
</ul>
</div>
но с одним из таких методов, как $( "div.band div.member: eq (2)" ) или другими полезными способами, я получаю следующее:
alert ($('div.band div.member')[0]);
/* result
<ul>
<li>Ringo</li>
<li>Starr</li>
</ul>
*/
так есть способ получить контейнер div .member в моем node?
Ответы
Ответ 1
$('div.band div.member');
предоставит вам объект jQuery, содержащий <div>
, который соответствует селектору i.e. div с классом member
, которые являются потомками div с классом band
.
Объект jQuery представляет собой объект, подобный массиву, в котором каждому согласованному элементу присваивается числовое свойство (как индекс) объекта, а также свойство length
. Чтобы получить один элемент,
// first element
$('div.band div.member')[0];
или
// first element
$('div.band div.member').get(0);
Вместо выбора всех элементов вы можете указать, чтобы выбрать конкретный элемент в соответствии с положением в DOM. Например
// get the first div with class member element
$("div.band div.member:eq(0)")
или
// get the first div with class member element
$("div.band div.member:nth-child(1)")
EDIT:
Вот плагин, который я только что выбил
(function($) {
$.fn.randomize = function(childElem) {
return this.each(function() {
var $this = $(this);
var elems = $this.children(childElem);
elems.sort(function() { return (Math.round(Math.random())-0.5); });
$this.detach(childElem);
for(var i=0; i < elems.length; i++)
$this.append(elems[i]);
});
}
})(jQuery);
Здесь Рабочий демонстрационный пример. добавьте /edit к URL-адресу, чтобы увидеть код. Если вам нужны какие-либо сведения о том, как это работает, оставьте комментарий. Вероятно, это может быть связано с тем, чтобы быть более надежным для обработки определенных ситуаций (например, если есть другие дочерние элементы jQuery-объекта, к которым подключен плагин), но он будет соответствовать вашим потребностям.
Код из демонстрации
$(function() {
$('button').click(function() {
$("div.band").randomize("div.member");
});
});
(function($) {
$.fn.randomize = function(childElem) {
return this.each(function() {
var $this = $(this);
var elems = $this.children(childElem);
elems.sort(function() { return (Math.round(Math.random())-0.5); });
$this.remove(childElem);
for(var i=0; i < elems.length; i++)
$this.append(elems[i]);
});
}
})(jQuery);
HTML
<div class="band">
<div class="member">
<ul>
<li>John</li>
<li>Lennon</li>
</ul>
</div>
<div class="member">
<ul>
<li>Paul</li>
<li>McCartney</li>
</ul>
</div>
<div class="member">
<ul>
<li>George</li>
<li>Harrison</li>
</ul>
</div>
<div class="member">
<ul>
<li>Ringo</li>
<li>Starr</li>
</ul>
</div>
</div>
<button>Randomize</button>
Ответ 2
Я модифицировал решение Russ Cam, чтобы селектор был необязательным, и эту функцию можно вызывать на нескольких элементах контейнера, сохраняя при этом каждый рандомизированный родитель элемента.
Например, если бы я хотел рандомизировать все LI в каждом div '.member', я мог бы назвать это следующим образом:
$('.member').randomize('li');
Я мог бы также сделать это следующим образом:
$('.member li').randomize();
Таким образом, два способа вызвать это:
$(parent_selector).randomize(child_selector);
ИЛИ
$(child_selector).randomize();
Здесь измененный код:
$.fn.randomize = function(selector){
(selector ? this.find(selector) : this).parent().each(function(){
$(this).children(selector).sort(function(){
return Math.random() - 0.5;
}).detach().appendTo(this);
});
return this;
};
уменьшенная:
$.fn.randomize=function(a){(a?this.find(a):this).parent().each(function(){$(this).children(a).sort(function(){return Math.random()-0.5}).detach().appendTo(this)});return this};
Ответ 3
Рандомизация с использованием сортировки не всегда рандомизирует элементы. Лучше использовать метод тасования, подобный методу Как я могу перетасовать массив?
Здесь мой обновленный код
(function($) {
$.fn.randomize = function(childElem) {
function shuffle(o) {
for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
return this.each(function() {
var $this = $(this);
var elems = $this.children(childElem);
shuffle(elems);
$this.detach(childElem);
for(var i=0; i < elems.length; i++) {
$this.append(elems[i]);
}
});
}
})(jQuery);