Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Аналог nextAll() на чистом javascript (https://javascript.ru/forum/events/67939-analog-nextall-na-chistom-javascript.html)

Stay_Strong 16.03.2017 13:10

Аналог nextAll() на чистом javascript
 
Задался тут целью хоть раз написать плагин (точнее метод скорее) на нативном JS. Задача оказалась непростой, по отказу от jquery. Суть плагина: скрывать элементы под кнопку, если их больше определенного количества. Хочу использовать особо для длинных фильтров и еще где понадобится. Столкнулся со следующей проблемой не могу взять все элементы после нужного мне числа, то есть аналог nextAll().
Как это сделать?

ksa 16.03.2017 13:20

Цитата:

Сообщение от Stay_Strong
Как это сделать?

Использовать свойство nextSibling у элементов...
http://www.fpublisher.ru/documentati...s#hnextsibling

Stay_Strong 16.03.2017 13:23

ksa,
Так он возвращает только один следующий элемент, а не все.

ksa 16.03.2017 13:25

Цитата:

Сообщение от Stay_Strong
Так он возвращает только один следующий элемент, а не все

Так у тебя еще есть циклы... :D

ksa 16.03.2017 13:26

Цитата:

Сообщение от Stay_Strong
Задался тут целью хоть раз написать плагин (точнее метод скорее) на нативном JS.

Не совсем понятно с чего ты решил, что тебе такое по силам, если ты основ не знаешь? :blink:

Stay_Strong 16.03.2017 13:35

ksa,
вот решил с основами и познакомиться таким образом. На jquery я писал плагин, получилось вроде бы неплохо.

ksa 16.03.2017 13:39

Цитата:

Сообщение от Stay_Strong
вот решил с основами и познакомиться таким образом

С таким же успехом можно начать строить свою нефтяную компанию! :D

Stay_Strong 16.03.2017 13:50

ksa,
Я думаю, что вы напрасно смеетесь. Потому что многие учатся таким способом. У меня пока что вот что получается
window.onload = function() {

  function loadElements() {
    //Основные параметры
    var element = '.filter__item', //элементы к которым будет применен метод
        childrenElements = '.filter__option', //дочерние элементы, больше числа которых появляется кнопка раскрытия
        count = 3, //число, после которого появится раскрытие
        speed = 250, //скорость раскрытия блока по нажатию на кнопку показа
        textMore = '+ Показать все', //Текст для кнопки "Показать все"
        textLess = '- Скрыть'; //Текст для кнопки "Cкрыть"

    //Переменные, используемые в плагине
    var elList = document.querySelectorAll(element); //находим все элементы на странице, к которым нужно применить метод

    Array.prototype.forEach.call(elList, function(el, i) { //Обходим в цикле все элементы
        var countChildren = elList[i].querySelectorAll(childrenElements);
        if(countChildren.length > count) {
          //Создаем контейнер, куда будем перемещать все элементы, которые нужно скрыть.
          var container = document.createElement('div');
          container.className = 'loadContainer';
          //Присваиваем контейнер в наш элемент
          elList[i].appendChild(container);
          //Выбираем все элементы, которые будем скрывать
          for(var j = 0; j < countChildren.length; j++) {
            if(j > count - 1) {
              container.appendChild(countChildren[j]);
            }
          }
        }
    });

  }

  loadElements();

}

ksa 16.03.2017 14:25

Stay_Strong, это и есть плагин? :blink:

Stay_Strong 16.03.2017 15:30

Нет, мне достаточно сложно сразу собирать плагин. Я реализую функционал. Потом создаю только объект default, и преобразую в плагин потом. Плагин можете посмотреть вот здесь мой (который на jquery).

А вообще принимаю любые советы по более правильной реализации структуры и оптимизации кода.


Часовой пояс GMT +3, время: 23:11.