Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 24.09.2017, 17:46
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208

Перенести методы в прототип оказалось просто:
Шаблон:

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(), 24.09.2017 в 17:51.
Ответить с цитированием
  #12 (permalink)  
Старый 24.09.2017, 18:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от void()
А вот избавиться от циклов пока не получается.
цикл можно заменить на делегирование(но нужно ли?), или вам известен другой способ?
Ответить с цитированием
  #13 (permalink)  
Старый 24.09.2017, 18:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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>

Последний раз редактировалось рони, 24.09.2017 в 18:37.
Ответить с цитированием
  #14 (permalink)  
Старый 24.09.2017, 18:42
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208

рони,
Это то, что я пытался сделать) Не получалось, похоже, из-за того что я упустил такую штуку:

.call


Спасибо! Пойду писать свою библиотеку

P.S. Вот интересно, сколько лет вы уже программируете?
Ответить с цитированием
  #15 (permalink)  
Старый 24.09.2017, 18:46
Профессор
Отправить личное сообщение для Rasy Посмотреть профиль Найти все сообщения от Rasy
 
Регистрация: 17.06.2016
Сообщений: 509

Сообщение от void()
Как думаете вообще, можно ли такой подход уже использовать где-нибудь на личном проекте?
es6 без транспайлера никак
Ответить с цитированием
  #16 (permalink)  
Старый 24.09.2017, 19:12
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

void(),
1. Стоит отличать ES6 от ES5, где объяснены различия я уже писал, ES6 это новый стандарт ему 2 года всего (ES5 - 8 лет), и в нем произошло значительное число нововведений, например конструкция class, поэтому если это не учебный проект, то на кросс-браузерность особо рассчитывать не стоит, либо придется ограничить число поддерживаемых браузеров таблицей совместимости, если все же хочется писать на новом стандарте реальные проекты со старой поддержкой, то используют специальные инструменты/сборщики для конвертирования исходного кода ES6 в ES5.
2. Итератор/цикл обычно делают отдельным статичным методом, например по аналогии с моим Lib.each = function() {} твой будет выглядеть так static each() {}.
Ответить с цитированием
  #17 (permalink)  
Старый 24.09.2017, 19:53
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

void(),
вот такая еще библиотека есть с разными интересными функциями, можешь капнуть исходники для саморазвития.
Ответить с цитированием
  #18 (permalink)  
Старый 24.09.2017, 20:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

void(),
Теперь 255 символов
Ответить с цитированием
  #19 (permalink)  
Старый 24.09.2017, 21:49
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208


Rise, спасибо, все понял. Буду разбираться дальше. Конечно же, проект учебный, но хочется его подключать на других учебных проектах, так что... Даже не знаю. Наверно как Rasy советует, буду прогонять через транспайлер пока что. А вообще главное - чтобы было что подключать!

рони, спасибо, как раз я такую мини-урезанную версию и хотел сделать для начала. Причем задумка в том, чтобы можно было отключить от проекта реальную jQuery, подключить свою и чтобы все при этом работало. То есть чтобы были основные функции jQuery с таким же синтаксисом.
Ответить с цитированием
  #20 (permalink)  
Старый 24.09.2017, 22:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

void(),
в jQuery модульная система, можно грузить только нужные блоки.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery для загрузки страницы в <div> Dr.Holerik jQuery 12 11.10.2016 17:36
Работа для знатока jQuery virtualbrest Работа 0 24.07.2013 16:05
Темы для Jquery UI wUI jQuery 0 07.04.2013 18:09
Не работает форма для сбора информации на jquery Ranetka jQuery 10 13.10.2012 14:01