Получение всех видимых элементов с помощью MooTools

Я перехожу из jQuery в MooTools (для удовольствия..), и у меня есть эта строка кода:

$subMenus = $headMenu.find('li ul.sub_menu:visible');

Как я могу написать это в mootools? Я знаю, что я могу использовать getElements, но как я могу проверить на видимую улицу (я часто использую этот (: видимый) селектор).

Изменить -

Я реализовал свою собственную функцию:

function findVisibleElements(elementsCollection){
 var returnArray = [];
 elementsCollection.each(function(el){
 if(el.getStyle('display') === 'block'){
 returnArray.push(el);
 }
 });
 return returnArray;
 }

И я хочу, чтобы скрыть все видимое подменю, вот что я написал:

// Sliding up the visible sub menus 
if( visibleSubMenus.length > 0 ){
 visibleSubMenus.each(function(el){
 var slider = new Fx.Slide(el, {duration: 2000});
 slider.slideOut();
 });
}

Почему мой код не работает? Моя функция работает, и проблема связана с Fx.Slide. Я добавил mootools больше с Fx.Slide.

2 ответа

Просто расширьте функциональность селектора - это MooTools!

$extend(Selectors.Pseudo, {
 visible: function() {
 if (this.getStyle('visibility') != 'hidden' && this.isVisible() && this.isDisplayed()) {
 return this;
 }
 }
});

После этого просто сделайте обычный $$('div:visible'), который вернет видимые элементы.

Посмотрите пример, который я создал: http://www.jsfiddle.net/oskar/zwFeV/


Функция $$() в Mootools в основном эквивалентна селектору JQuery $() all-all-all.

// in MooTools
var elements = $$('.someSelector');
// natively in most newer browsers
elements = document.body.querySelectorAll('.someSelector');

Однако для этого конкретного случая, поскольку: visible не является реальным псевдо-классом, вам придется его аппроксимировать с помощью фильтра Array в Mootools.

var isItemVisible = function (item) {
 return item.style.visibility != 'hidden' && item.style.display != 'none';
}
var elements = $$('ul').filter(isItemVisible);

Могут быть и другие вещи, которые, по вашему мнению, делают элемент "невидимым", и в этом случае вы можете соответствующим образом добавить их в функцию фильтрации.

licensed under cc by-sa 3.0 with attribution.