Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.09.2016, 12:23
Новичок на форуме
Отправить личное сообщение для ivanx Посмотреть профиль Найти все сообщения от ivanx
 
Регистрация: 26.09.2016
Сообщений: 3

Функции инициализирующая плагин.
Добрый день.

Есть метод который, который принимает html елемент или елементы и работает с ними(плагин). Проблема состоит в реализации инициализации плагина.
Небольшой примерчик
(function() {

function Test(el) {
  this.el = el;
  this.init();
}
Test.prototype.init() {
  // работает с this.el
}
Test.prototype.destroy() {
  // this.el = null
}

window.Test = Test;

})();

var obj = new Test(document.querySelector('div'));
// если нужно
obj.destroy();


А если скажем елементов не один, а много, то хотелось бы создавать экземпляр класса внутри цикла, например
(function() {

function _(el) {
  this.el = el;
  this.init();
}
_.prototype.init() {
  // работает с this.el
}
_.prototype.destroy() {
  // this.el = null
}

function Test(selectors, method) {
  var el = document.querySelectorAll(selectors);
  [].forEach.call(el, function(element) {
    // *1
    var obj = new _(element);
  });
}

window.Test = Test;

})();

Test('div');

*1) Надо проверить не был ли обьект уже инициализирован, в jQuery есть метода $.data, в который можно сохранить весь обьект, и если например передан метод destroy, то запустить на обьекте destroy. А как быть в случае без jquery.

Хотелось бы, чтобы сам плагин работал с одним элементом, а если элементов много то вызывался в цикле. Может есть более удачные варианты организации плагина, заранее спасибо за любые советы в этом направлении.
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2016, 13:05
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от ivanx
А если скажем елементов не один, а много, то
То создается wrapper и он становится единственным элементом, а в обработчик дописывается пара строк кода для выявления уже того, нужного элемента и работы с ним.

Если wrapper создать нельзя, например это разбросанные где попало элементы, то развешиваешь свой плагин на все по-отдельности.
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2016, 13:09
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Цитата:
[].forEach.call(el, function(element) {
Священная вещь, да? for оскверняет. Вот так и бывает, священным вещам молиться научился, а самого тупого кода написать не можешь.
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2016, 14:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

заготовка для плагина на js
мысли вслух ...

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
   .slider {
         border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px
    }
    .red{
      background-color: #FF0000;
    }

  </style>


</head>

<body>
<div class="slider b"></div><div class="slider b"></div><div class="slider c"></div>
 <script>
(function() {
    function _(el) {
        this.el = [];
        this.init(el)
    }
     _.prototype.len = function() {
        return this.el.length
    };
    _.prototype.arr = function(selectors) {
        var elem = document.querySelectorAll(selectors);
        return [].slice.call(elem, 0)
    };
    _.prototype.init = function(selectors) {
        var elem = this.arr(selectors);
        var el = this.el,
            add = this.add.bind(this);
        elem.forEach(function(element, i) {
            !~el.indexOf(element) && add(element)
        })
    };
    _.prototype.add = function(elem) {
        this.el.push(elem);
        elem.innerHTML = "add";
        elem.classList.add("red")
    };
    _.prototype.destroy = function(selectors) {
        var elem = this.arr(selectors);
        this.el = this.el.map(function(element, i) {
            return elem.some(function(a) {
                return a == element
            }) ? (element.innerHTML = "null", element.classList.toggle("red"), null) : element
        }).filter(function(el) {
            return el
        })
    };

    function Test(selectors, method) {
        return new _(selectors)
    }
    window.Test = Test
})();
var a = Test(".a, .b"); console.log(a.len()) // 2  (.a нет, есть 2 .b)
window.setTimeout(function() {
    a.destroy(".b"); console.log(a.len())// 0
}, 1000);
window.setTimeout(function() {
    a.init(".b") ; console.log(a.len())//2
}, 2000);
window.setTimeout(function() {
    a.init(".c") ;a.init(".c") ;a.init(".c") ;a.init(".c") ; console.log(a.len())// 3 сработает только 1 инициализация 
}, 3000);
  </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 26.09.2016, 14:53
Новичок на форуме
Отправить личное сообщение для ivanx Посмотреть профиль Найти все сообщения от ivanx
 
Регистрация: 26.09.2016
Сообщений: 3

Сообщение от warren buffet
Священная вещь, да? for оскверняет.
Я не совсем понял, в чем вопрос, я ведь всего лишь пример хотел привести, какая разница с for или forEach, к сути вопроса отношения же не имеет.
Ответить с цитированием
  #6 (permalink)  
Старый 26.09.2016, 15:00
Новичок на форуме
Отправить личное сообщение для ivanx Посмотреть профиль Найти все сообщения от ivanx
 
Регистрация: 26.09.2016
Сообщений: 3

рони,
Спасибо за пример
Ответить с цитированием
  #7 (permalink)  
Старый 26.09.2016, 15:05
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

ivanx, ну я и говорю, какая разница. )
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение прототипа функции tsigel Общие вопросы Javascript 11 15.05.2014 01:03
Добавление функции внутрь другой функции Lion_astana jQuery 9 28.12.2013 14:33
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 20:26
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21