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

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

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

Редактировать -

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

  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.
Я добавил больше инструментов с помощью Fx.Slide.

4
Yosi 22 Авг 2010 в 18:31

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/

8
Oskar Krawczyk 22 Авг 2010 в 16:41

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

// 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);

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

1
sevenflow 22 Авг 2010 в 16:08