• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mała biblioteka JS

Object Storage Arubacloud
+1 głos
480 wizyt
pytanie zadane 2 lipca 2017 w JavaScript przez lapacz.kornel Mądrala (6,930 p.)
Witam

Pytanie trochę nietypowe. Co sądzicie o tym  https://github.com/kornellapacz/minlib.js ? Jest to mała biblioteka JS do dodawania nasłuchiwaczów zdarzeń (eventListener) i wyszukiwania elementów poprzez selektory CSS (querySelector, querySelectorAll). Według was może być przydatna (robiłem ją dla osób które głównie piszą w Vanilla JS) ? I czy czegoś brakuje w niej?

Jak takich pytań nie wolno zadawać to przepraszam.
komentarz 2 lipca 2017 przez Patrycjerz Mędrzec (192,320 p.)

Oczywiście, że można takie pytania zadawać smiley

komentarz 2 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)

To fajnie laugh

3 odpowiedzi

+4 głosów
odpowiedź 2 lipca 2017 przez Comandeer Guru (601,990 p.)
wybrane 22 listopada 2017 przez lapacz.kornel
 
Najlepsza
  • Biblioteka nie działa w strict mode, bo są niezadeklarowane zmienne (np. w pętlach for...of). Przydałby się linter, który wykrywałby te problemy oraz inne (brak średników w niektórych miejscach).
  • Dla baseElement możesz zastosować składnię parametrów domyślnych z ES6.
  • Skoro jest addEvt, to oczekiwałbym też delEvt.
  • Ogólnie to brakuje mi też obsługi modułów. Nie chcę pseudoglobalnych zmiennych, chcę moduł, który eksportuje poszczególne funkcje.
  • else if (Object.prototype.toString.call(target) === '[object NodeList]') → po co tak dziwnie? Starczy skorzystać z operatora instanceof.
  • Brakuje mi dystrybucji przez npm i wersjonowania.
  • Brakuje info o licencji.

 

komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)
To już wgl nie rozumiem. Po co moduły jeśli robię bibliotekę DOM a moduły są w Node.js...(a tam z tego co wiem nie ma DOM). Poza tym to jest bardzo mały projekt (planuje jeszcze rmEvt / delEvt)
komentarz 3 lipca 2017 przez Comandeer Guru (601,990 p.)
Moduły są uniwersalnym sposobem dystrybucji kodu JS. Fakt, że obecnie przeglądarki i Node.js tego formatu nie wspierają (chociaż nie jest to do końca prawdą; przeglądarki mają już eksperymentalne wsparcie), sprawia, że powstały narzędzia typu Rollup czy webpack, które umożliwiają przekonwertowanie tego formatu modułów do formatu zrozumiałego zarówno dla przeglądarek, jak i Node.js.
komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)

Ale czy warto dla tak małego projektu? (oczywiście od jutra uczę się webpack wink)

komentarz 3 lipca 2017 przez Comandeer Guru (601,990 p.)
IMO jest to kierunek, w którym podąża cały ekosystem JS, więc wypada się dostosować.
komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)
Jak się nauczę to przepiszę do modułów...
+3 głosów
odpowiedź 2 lipca 2017 przez Tomek Sochacki Ekspert (227,510 p.)

Duży plus za wykonanie dokumentacji, o czym wiele osób zapomina w swoich projektach, nawet podając githuba w cv. Co do samego kodu to tak na szybko wydaje mi się, że można by nieco bardziej weryfikować dane wejściowej. Na przykład "selectors" sprawdzasz, czy jest tablicą lub nie, natomiast pytanie jaki wynik uzyskamy gdy jako selektor podam "12345"? Może jakaś informacja, wyjątek itp.?

Postaram się w wolnej chwili podpiąć Twój skrypt i potestować go sobie to dam Ci znać o jakiś ewentualnych innych wskazówkach.

Pozdrawiam

+3 głosów
odpowiedź 3 lipca 2017 przez niezalogowany

Imo funkcja all powinna zawsze zwracać tablicę, żeby użytkownik miał dostęp do metod obiektu Array (querySelectorAll zwraca pseudo-tablicę). Higher order functions robią robotę


if(Array.isArray(selectors)){
	toReturn = [];

	for(element of selectors){
		for(el of baseElement.querySelectorAll(element)){
			toReturn.push(el);
		} 
	} 
}

all(['h1', 'p']) // returns array with all h1 and p elements

Niepotrzebny bajer - ekwiwalent all('h1, p')


In vanilla.js you have to write:

['h1', 'h2', 'p'].forEach(function (element) {
    document.querySelectorAll(element).forEach(function (el) {
        el.addEventListner('click', yourFunction);
    });
});

Aż tak źle nie jest

[...document.querySelectorAll('h1, h2, p')].forEach((el) => {
	el.addEventListener('click', yourFunction);
});

Może warto by zaimplementować funkcję do znośnej obsługi event delegation?

komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)
https://github.com/kornellapacz/minlib.js/blob/master/minlib.js

o to chodziło? Poprawiłem dokumentacje. querySelectorAll zwraca chyba "NodeList".
komentarz 3 lipca 2017 przez niezalogowany
const all = (selectors, baseElement = document) => {
    let toReturn = [];
    
    for(let element of baseElement.querySelectorAll(selectors)){
      toReturn.push(element)
    }

    return toReturn;
  }

Można krócej

const all = (selectors, baseElement = document) => {
    return [...baseElement.querySelectorAll(selectors)];
}

 if(typeof target === 'string'){ 

      target = all(target);

      for(let element of target){
        element.addEventListener(type, listener);
      };
    } else if (Array.isArray(target)){ 

      for(let element of target){
        element.addEventListener(type, listener);
      };
    } else {

      target.addEventListener(type, listener);
    }

  };

Część kodu tutaj się powtarza, zmieniając trochę logikę, można pozbyć się duplikatów


querySelectorAll zwraca chyba "NodeList"

... NodeList, która jest pseud-tablicą.

komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)

Mógł byś podrzucić jakąś dokumentacje 

return [... ]

bo znaleźć nie umiem crying 

komentarz 3 lipca 2017 przez niezalogowany
komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)
const addEvt = (target, type, listener) => {

  if (Array.isArray(target) || typeof target === 'string'){ 
    if(!Array.isArray(target)){
      target = all(target);
    }
    for(let element of target){
      element.addEventListener(type, listener);
    };
  } else {
    target.addEventListener(type, listener);
  }

};

Coś takiego wymyśliłem...

komentarz 3 lipca 2017 przez niezalogowany

a nawet przeniósł bym całą tę logikę do all - rozszerzając jego funkcjonalność i tym samym upraszczając kod tutaj do

const addEvt = (target, type, listener) => {
	all(target).forEach((el) => {
		el.addEventListener(type, listener);
	});
};
komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)

https://github.com/kornellapacz/minlib.js#example-5 - to chyba nie będzie działać 

albo taka sytuacja 

let div = document.createElement('div')

addEvt(div, 'click', yourFunction) 

(nie denerwuj się mam mam 14 lat...)

komentarz 3 lipca 2017 przez Comandeer Guru (601,990 p.)

Aż tak źle nie jest

Zgodnie z najnowszą wersją standardu DOM NodeList jest iterowalne, zatem starczy:

document.querySelectorAll('h1, h2, p').forEach((el) => {
    el.addEventListener('click', yourFunction);
});

Wiadomo, gdzie nie działa… ;)

komentarz 3 lipca 2017 przez lapacz.kornel Mądrala (6,930 p.)

https://github.com/kornellapacz/minlib.js#example-2-2 

tak też w dokumentacji napisałem.. smiley

Podobne pytania

+1 głos
2 odpowiedzi 152 wizyt
pytanie zadane 5 stycznia 2022 w JavaScript przez Jacek Śmiel Użytkownik (510 p.)
0 głosów
3 odpowiedzi 158 wizyt
pytanie zadane 19 maja 2017 w JavaScript przez Bakr Mądrala (6,850 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 27 listopada 2018 w JavaScript przez Apper97 Obywatel (1,380 p.)

92,620 zapytań

141,473 odpowiedzi

319,813 komentarzy

62,003 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...