Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mootools: выбрать все родительские li, до определенного элемента 
V
    Опции темы
skyboy
Дата 26.2.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Код

<ul id="ul1">
 <li id="li1">
  <ul id="ul2">
   <li class="do-not-select-this">
   </li>
   <li id="li2">
     <ul id="ul3">
       <li id="li3">
        <span id="source">
        </span>
      </li>
      <li class="do-not-select-this">
      </li>
      <li class="do-not-select-this">
      </li>
     </ul>
    </li>
  </ul>
 </li>
 <li class="do-not-select-this">
 </li>
</ul>

мне надо, отталкиваясь от span#source получить только родительские li, удовлетворяющие условию "ul#ul2 li"
т.е. надо получить [li#li3, li#li2], но не [li#li3, li#li2, li#li1]
пробовал:
Код

$('source').getParents('#ul2 li') // возвращает [ul#ul2]
$('source').getParents('li').filter('#ul2 li') // возвращает []
$('source').getParents('li').map(function(element) {return element.match('#ul2 li');}) // возвращает [false, false]; 

ко всему, раздел справки mootools, описывающий селекторы, попросту недоступен: ссылка из самой же документации ведет к пустой странице
потому если и есть какие хитрые псевдоселекторы навроде jquery'вского ":match",(че-то я jquery нечто фантастическое приписал) то узнать об этом я не могу :(
контекст: есть дерево на вложенных ul/li. надо для узла выбрать всех предков, но предков только в пределах дерева. li внутри дерева никак(ни классом, ни другими атрибутами) не выделяются и не отличимы от таких же li за пределами дерева.
[Updated: 15.03.2010]
добавил соседей, которые не должны быть выбраны. а то запутывало.
PM MAIL   Вверх
skyboy
Дата 26.2.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



в jquery работало бы:
Код

jQuery('#source').parents('li').filter('ul#ul2 li')


PM MAIL   Вверх
skyboy
Дата 26.2.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



и ещё. рабочий вариант
Код

$('source').getParents('li').filter(function(el) {if (el.getParents('#ul2').length> 0) return true; else return false;})

не устраивает по соображениям лакончности и переносимости smile
надеюсь на решение встроенными средствами.
PM MAIL   Вверх
Любитель
Дата 27.2.2010, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 1
Всего: 92



Хм.. Прям интересно стало smile

Если для source есть именно ид-шник, то можно, скажем так:
Код

$$('#ul2 li').filter(function(li) { return li.hasChild('source'); })


Селекторы (судя по коду) MooTools использует в полноценной форме только для getElements. getParents/filter и пр. пользуюся "усечённым" match, который работает с одним элементов, в отрыве от структуры (т. е. в filter('#ul2 li') li ничего не значит, ищутся элементы с ид ul2). Ужас!


--------------------
PM MAIL ICQ Skype   Вверх
skyboy
Дата 27.2.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(Любитель @  27.2.2010,  01:28 Найти цитируемый пост)
Ужас! 

ага :( после jquery это первое, что неприятно удивило.
Цитата(Любитель @  27.2.2010,  01:28 Найти цитируемый пост)
Если для source есть именно ид-шник, то можно, скажем так

не, задачу хочется решить обобщенно. привязка к id только для однозначности. спасибо за конструкцию, правда, у меня уже есть похожая. наверное, наши варианты могут работать с разной скоростью, все же моя идет "снизу вверх", а твоя - "сверху вниз"
PM MAIL   Вверх
Любитель
Дата 27.2.2010, 20:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 1
Всего: 92



А зачем собственно вообще MooTools? Я не знаю, как там что но селекторы дико убоги. Во-первых, как вот оказалось их использовать можно только для прямой выборки (getElements) и всё! Во-вторых, querySelector/querySelectorAll MooTools "использует" только для определения версии браузера, т. е. производительность всегда не будет достойной (по сравнению с норамльным селектор энджином)...


--------------------
PM MAIL ICQ Skype   Вверх
skyboy
Дата 27.2.2010, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Любитель, дело в том, что не я выбирал библиотеку, потому не могу аргументировать использование именно mootools. с другой стороны, с учетом несложной логики имеющегося javascript-кода, это первый "порог", о который я споткнулся.
PM MAIL   Вверх
jsse
Дата 14.3.2010, 15:05 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



Документацию по селекторам можно найти в меню http://mootools.net/docs/core
http://mootools.net/docs/core/Utilities/Selectors

На счет функции filter она действительно использует метод match который ищет по одиночному селектору,
возможно разработчики выбрали такое решение из соображений производительности.
Не секрет что в moo для каждого элемента можно переназначить или добавить свою функцию и если вы хотите чтоб функция filter работала так же как и в jquery
её можно легко перекрыть

Код

Elements.implement({
    filter: function(filter, bind){
        if (!filter) return this;
        return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
            return item.getElements(filter).length == 0;
        } : filter, bind));
    }
});


Я взял стандартную функцию Elements.filter и заменил в ней

Код

return item.match(filter);
// на
return item.getElements(filter).length == 0;


Теперь она будет работать так же как и в jquery

Код

$('source').getParents('li').filter('ul#ul2 li')

PM WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.