Шаблон для своей jQuery
Шаблон для своей jQuery:
function $(s){ return new Q(document.querySelectorAll(s)); } function Q(x){ this.x = x; this.toggle = function(v, c){ for(var i = 0; i < this.x.length; i++){ this.x[i].addEventListener(v, function(){ this.classList.toggle(c); }); } return this; } } Используется так: $('.class').toggle('click', 'class-active'); Остается только добавить методов. Например: this.on = function(v, f){ for(var i = 0; i < this.x.length; i++){ this.x[i].addEventListener(v, f); } return this; } Теперь можно использовать так: $('.class').toggle('click', 'class-active').on('click', function(){alert('1');}); :) |
|
рони,
Ничеси, надо разобраться) |
Rise,
Спасибо за подсказку. Попробую переделать через прототипы и еще поизучаю вашу библиотеку на предмет каких-то идей. Еще я думаю, тут есть проблема с циклами, которые будут все время копироваться, почти в каждом методе, что не очень круто. И, наверно, не лучшая кроссбраузерность. Хотя последний фактор меня пока трогает мало. |
Rise,
а какой паттерн в твоей либе? |
Цитата:
|
Rise,
Design Pattern |
Перенести методы в прототип оказалось просто:
Шаблон: function $(selector){ return new Q(document.querySelectorAll(selector)); } class Q { constructor(selector){ this.selector = selector; } toggle(event, newSelect){ for(var i = 0; i < this.selector.length; i++){ this.selector[i].addEventListener(event, function(){ this.classList.toggle(newSelect); }); } return this; } } Как использовать: $('#wrapper .class').toggle('click', 'class-active'); А вот избавиться от циклов пока не получается. Как думаете вообще, можно ли такой подход уже использовать где-нибудь на личном проекте? Или тут еще есть серьезные дефекты? |
Цитата:
|
void(),
вынос цикла в отдельный метод ... может кто-то предложит свой вариант ... <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hot.class-active{ background-color: #3366FF; } .red { background-color: #FF0000; } .hot{ border: 1px dashed Gray; padding: 5px; height: 100px; width: 100px; } </style> </head> <body> <style type="text/css"> </style> <div class="hot">test</div> <div class="hot red">test</div> <div class="hot">test</div> <script> "use strict" function $(selector){ return new Q(document.querySelectorAll(selector)); } class Q { constructor(selector){ this.selector = selector; } toggleClass(newSelect,event) { var fn = function() { this.classList.toggle(newSelect) }; return this.forEach(fn, event) }; forEach(fn, event) { [].forEach.call(this.selector, function(item) { event ? item.addEventListener(event, fn.bind(item)) : fn.bind(item)() }); return this }; css(data, event) { var fn = function() { var item = this; Object.keys(data).forEach(function(key) { item.style[key] = data[key] }) }; return this.forEach(fn, event) }; } $('.hot').toggleClass('red').css({"color" : "#66FF00", width : "200px"}).toggleClass('class-active','click'); </script> </body> </html> |
Часовой пояс GMT +3, время: 13:19. |