Diskuze: load element
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 50 zpráv z 70.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Dopijem kávu a idem do práce, tak o pol hodinku Ti napíšem ako na to.
Upravil som Tvoje html takto:
<div class="content">
<div class="control-group">
<label class="control-label" for="book">Book</label>
<div class="controls">
<input type="text" id="book">
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-success suggest">Submit</button>
</div>
</div>
</div>
Ak na to ideš AJAX-om, formulár v princípe nepotrebuješ, preto som ho zrušil. Ďalej, kde sa dá, vyhni sa ID atribútu. Skôr či neskôr sa Ti stane, že budeš potrebovať v JS spracovať viac značiek s rovnakým ID, čo samozrejme nejde. Preto radšej použi CLASS atribút, ako som to urobil ja. Pre daný CLASS vôbec nemusíš mať v CSS žiadny štýl, ale poslúži Ti ako identifikátor pre JS. A v JS potom nebudeš mať problém vybrať viac značiek s rovnakým označením - s rovnakou CLASS. Preto ak môžeš, nepoužívaj ID. A nepoužívaj inline JS, žiadne onclick="", ani nič podobné.
Teraz JavaScript. Ten môže vyzerať napríklad takto:
$('.suggest').click(function () {
$.post('t.php', {q: $('#book').val()}, function (data) {
$('.content').html(data)
}, 'html')
})
Áno, je to s použitím jQuery. Ale práve na takéto úlohy sa jQuery priam pýta a zjednodušuje Ti a zprehľadňuje kód. No ... toto je krátky, nie prehľadný zápis. Vlastne by si sa takému zápisu mal vyhýbať, dopúšťam sa v ňom takzvaného "callback hell", keď volám cb jednej funkcie v cb druhej funkcie. Ale tak dobre, prehľadný zápis by vyzeral napríklad takto:
function loadBook () {
$.post('t.php', {
q: $('#book').val()
}, renderBook, 'html')
}
function renderBook (data) {
$('.content').html(data)
}
$('.suggest').click(loadBook)
Ak Ti toto stačí, tak si len stiahni a pripoj jQuery a inšpiruj sa týmto kódom. Nevymýšľaj nanovo koleso, proste pripoj jQuery a využi jeho výhody. Ak to však vyslovene potrebuješ holým JS, napíš a dám Ti aj na to príklad.
Zabudol som na PHP. Tu máš aj ukážku kódu s ktorým tento skript spolupracuje:
<?php
header("Content-Type: text/html");
$book = $_POST["q"];
echo "<div style='color: red'>$book</div>";
?>
pripadne: https://www.itnetwork.cz/javascript/ajax
Ešte jedna vec, ktorá sa mi nepáčila... Funkcie by mali byť univerzálne - nemali by sa v nich vyskytovať natvrdo napísané hodnoty. Preto ak mám mať čisté svedomie, asi by to bolo najlepšie riešiť následovne - síce viac kódu, ale univerzálneho:
var url = 't.php'
var $book = $('#book')
var $content = $('.content')
$('.suggest').click(loadAndRender(
url, $book, $content
))
function loadAndRender (url, book, content) {
return function () {
var data = {
q: book.val()
}
$.post(url, data, render(content), 'html')
}
}
function render (where) {
return function (what) {
where.html(what)
}
}
Krucinál, stále nie som spokojný! Priveľa funkcií v globálnom kóde a
nejasné súvislosti medzi nimi... Hneď pošlem ešte jednu, tentokrát fakt
poslednú verziu
Tak. Až TERAZ sa za svoj kód nehanbím Síce sú v ňom trošku "silené"
názvy funkcií, ale to len pre lepšie pochopenie súvislostí medzi nimi
var url = 't.php'
var $book = $('#book')
var $content = $('.content')
function loadAndRenderBook (url, book, content) {
return function () {
function loadThisBookFrom (book, url) {
var data = {
q: book.val()
}
return $.post(url, data, 'html')
}
function renderItToThis (where) {
return function (what) {
where.html(what)
}
}
loadThisBookFrom(book, url).then(renderItToThis(content))
}
}
$('.suggest').click(loadAndRenderBook(
url, $book, $content
))
Kdyz uz to tady tak rozjizdis tak se ti k tomu vyjadrim.
Predavat click-u curried funkci mi prijde zbytecne prekombinovany, to by ti pri CR neproslo. Nehlede na to, ze tohle neni natural priklad, takze takhle by to opravdu ve vetsine pripadech nebylo .
Za vyuziti promisoveho chovani jQuery response objektu plusove body.
Ovsem za to saskovani s argumentem url a book hromada minusu - tohle by
neproslo na zadnem CR -
url a book uz mas v scopu funkce loadThisBookFrom i bez jejich opakovaneho
predavani, takze to akorat dela kod necitelnejsim
to co predavas thenu je opet prehnany, takhle se promisy nepouzivaj, opet opakujes zbytecne predavani content nekam, kde uz je na nej davno dosah,
tresnicka na dortu je where.html(what) - to ma k citelnosti az prilis daleko
disclaimer: neminim te shazovat, nicmene konstruktivni kritika je neco, co si neodpustim, diky za pochopeni
Ak by som to písal pre seba, nie pre začiatočníka, zámerne rozťahané, napísal by som to takto:
'use strict'
var url = 't.php'
var $book = $('#book')
var $content = $('.content')
function loadAndRender (url, book, content) {
return _ => {
var data = {q: book.val()}
$.post(url, data).then(resp => content.html(resp))
}
}
$('.suggest').click(loadAndRender(url, $book, $content))
A poprosím o kritiku, resp. o príklad. CHCEM to vedieť dobre a správne.
kdyz uz tam mas es6 standard fat arrow tak pouzij const a let, var ne
a kdyz uz teda mas potrebu tech curried funkci tak udelej teda tohle
'use strict'
const url = 't.php';
const $book = $('#book');
const $content = $('.content');
const loadAndRender = (url, book, content) => (event, data = { q: book.val() }) =>
$.post(url, data).then(data => content.html(data));
$('.suggest').click(loadAndRender(url, $book, $content))
Muze se to zdat byt komplikovane, nicmene jako podklad proc tohle pouzit doporucuji precist tenhle clanek, od vice nez kvalifikovaneho cloveka: https://medium.com/…3d37e1a9bb75
K tomu, proc se mi predchozi verze nelibila:
Nicmene - prave proto, ze to je pro zacatecnika, nemuzes to psat tak, ze to
nedava smysl.
Kdyz sem ten kod videl, okamzite jsem ztracel chut ho cist, takhle poznas
zbytecne slozitej kod.
Tohle je problem takoveho toho prehnaneho podcenovani zacataceniku. Napises kod, ktery ma byt opravdu hodne roztahany, jenze roztahanim ho nezprehlednis. (O tom v tom clanku taky pise)
Kdybych ja byl zacatecnik, totalne by me zmatlo, proc predavas url a book znova, kdyz uz tam jsou, musel bych zacit zpochybnovat svoje dosavadni empiricke znalosti closure a to je spatne. Jakmile priklad pro zacatecnika donuti zacatecnika zpochybnovat neco, co uz umi je to spatne.
Ja bych to proste videl tak, ze zacatecnik je programator jako kazdej jinej, kdyz necemu neporozumi, proste se zepta.
Rozumnejšie mi pripadá vzdať sa arrow funkcií, ako spätnej kompatibility. Preto keď som sa nad tým zamyslel, napísal by som to reálne takto:
'use strict'
var url = 't.php'
var $book = $('#book')
var $content = $('.content')
function loadAndRender (url, book, content) {
return function() {
var data = {
q: book.val()
}
$.post(url, data, 'html').then(
function (resp) {
content.html(resp)
}
)
}
}
$('.suggest').click(loadAndRender(url, $book, $content))
Nič rozumnejšie a prehľadnejšie ma naozaj nenapadá. Ani netuším čo je zlé na curried funkcii v callbacku click. Mne to naozaj pripadá prehľadné a rozumné. Rozhodne lepšie, ako sa silou mocou vyhnúť curried funkcii napríklad takouto blbosťout:
'use strict'
const url = 't.php'
const $book = $('#book')
const $content = $('.content')
const cb = function () {
$.post(this[0], {q: this[1].val()})
.then(data => this[2].html(data))
}
$('.suggest').click(cb.bind([url, $book, $content]))
Ale ak sa to rieši inak, napíš mi prosím naprosto konkrétne riešenie o ktorom si presvedčený, že by prešlo code review. Lebo mám pocit, že mi niečo uniká, že to robím zle. Lenže ja ani len netuším, že by to vôbec šlo urobiť lepšie, nieto ešte ako. Ak Ťa môžem poprosiť, fakt mi napíš riešenie o ktorom si presvedčený, že by CR prešlo.
Precti si ten serial co jsem sem psal o ajaxu, sice tam (zatim) neni dil venovanej jQuery, ale ty stejne mas kod ve vanilla javascriptu. A nasi diskuze s Walem si moc nevismej, to pro tebe neni dulezite. S dalsimy dotazy opet smeruj sem.
Myslim, ze jsme se uplne nepochopili.
Ten kod co jsem psal jako prepsani toho tveho by za danych okolnosti, pro dany
problem, prosel CR, protoze dela strucne a spravne to, co ma delat.
Vzdavat se arrow operatoru je zbytecny, pouzijes babel a kod co jsem napsal ti bude fungovat i v pet let starem IEcku.
Opet, to co ty by si realne napsal, je presne to, od ceho Elliott odrazuje.
Takze otazka zni, pokud bys pouzil babel a mohl si dovolit pouzit => operator, default argument value a const a let - pouzil bys to?
Hm... Ok. Ak teda Babel a nové konštrukcie, napíšem to teda inak. Bez jQuery. PS: A v tom článku autor predsa nemá nič proti curried funkciám. Naopak, ešte sa teší z toho, ako sa jednoducho píšu s využitím arrow funkcií. Teda, aspoň mám ten pocit, ešte som ho nečítal, len preletel očami. No nič, idem to znovu prepísať...
Takže takto by som to napísal s využitím najnovších features:
'use strict'
const URL = 't.php'
const BOOK = document.querySelector('#book')
const CONTENT = document.querySelector('.content')
const SEND = document.querySelector('.suggest')
const loadAndRender = (url, book, content) => () => {
let data = new FormData()
data.append('q', book.value)
fetch(url, {method: "POST", body: data})
.then(response => response.text())
.then(newContent => content.innerHTML = newContent)
}
SEND.addEventListener('click', loadAndRender(URL, BOOK, CONTENT))
Ja viem, zasa som použil "kari funkciu". Len ak som ten článok dobre pochopil, nenabáda autor práve na takéto riešenie? Veď tam vyslovene sadne. Akože nie je problém si to odpustiť:
'use strict'
const URL = 't.php'
const BOOK = document.querySelector('#book')
const CONTENT = document.querySelector('.content')
const SEND = document.querySelector('.suggest')
function loadAndRender (url, book, content) {
let data = new FormData()
data.append('q', book.value)
fetch(url, {method: "POST", body: data})
.then(response => response.text())
.then(newContent => content.innerHTML = newContent)
}
SEND.addEventListener('click', _ => {
loadAndRender(URL, BOOK, CONTENT)
})
A vybavené, žiadna curried funkcia. Len ... vážne si myslíš, že sa tam nehodí? Podľa mňa je prvé riešenie, s curry, lepšie. Mám rád korenené...
Ale hlavne mi povedz - ktoré riešenie z týchto dvoch by mi prešlo CR? Prvé? Druhé? S privretými očami obe?
A toto je môj favorit
Toto sa Ti proste MUSÍ páčiť, toto musí prejsť akoukoľvek prísnou CR -
stačí pridať JSDOC komentár a je to dokonalé!
'use strict'
const URL = 't.php'
const BOOK = document.querySelector('#book')
const CONTENT = document.querySelector('.content')
const SEND = document.querySelector('.suggest')
const loadAndRender = (url, book, content) => async function() {
let data = new FormData()
data.append('q', book.value)
let resp = await fetch(url, {method: "POST", body: data})
content.innerHTML = await resp.text()
}
SEND.addEventListener('click', loadAndRender(URL, BOOK, CONTENT))
Na to ti reknu asi tohle: pro tebe - OK, pro tazatele, ktery je novacek a pravdepodobne se jeste nikdy nesetkal s problematikou vraceni funkce z funkce a ani se na to neptal - zbytecne komplikovane.
Už dávno táto diskusia, medzi nami dvoma, nie je o tom čo je najlepšie
pre nováčika Ale nevadí,
že mi priamo neodpovedáš, proste si asi človek čo šetrí chválou
To síce podľa mňa dobré nie je,
ale nevadí, ja som spokojný i tak
A mimochodom ... viem, čo je pre nováčika dobré - odškolil som
bezmála tisícku ľudí na html, css, js - aaaj v tomto si verím
Len nech napíšem čokoľvek ...
Tebe vyhovieť je fakt problém
Prečo? Veď každé jedno
tu uvedené riešenie je plne funkčné
Ale tak musím povedať ... či C++, alebo Pythom, oboje sú dobré a
perspektívne jazyky - kašli na ten mess s menom PHP, to je nechutný zlepenec
z X jazykov a po syntaktickej stránky sa z každého jazyka inšpirovali tým
najškaredším možným riešením. Začínal som s PHP pre skoro 15 rokmi, ale
už ho nechcem ani vidieť, zhnusili mi ho...
tvrdíš o php, že je to slepenec humusných jazyků a pak se zastáváš javascriptu.. schizofrenie?
mam chut se z vasi diskuze začít bodat propiskou do krku a vykrvácet,......
jak je schopný někdo na něčem tak šíleně primitivním udělat funkcionální mrdku, jen proto, aby ukázal všechny principy nového ES standardu...
Mariane, ty toho vzdycky nakecas ale skutek utek ;D nebud tak negativni!
JAJ ako si chýbal! Už
ma musel kritizovať Taskkill, keďže si tu nebol!
JavaScript nie je zlepenec, len
sa inšpiroval skôr funkcionálnymi, imperatívnymi jazykmi, nie
deklaratívnymi. Takže ľudia odchovaní na C a klonoch ho proste nechápu a
majú za divný jazyk. Je iný, má fakt blbú krivku učenia, ale nie je to
zlepenec. A ... tým pádom ja nie som schizofrenik
Myslim to vážně.. ještě tam kromě curryingu narvěte higher order
funkce a přísahám, že se rituálně zasebevraždím
Yes, nějakou pěknou funkcičku vracející element, prosím pěkně!
??? A čo konkrétne máš proti curryingu, či higher order funkciám? Veď ani jedno z toho nie je žiadne zlo...
Sorry - ja jsem zhruba v pulce diskuze musel udelat neco uplne jineho, takze jsem sem vzdycky jen zaskocil a rychle odpovedel, proto jsem se naposledy vubec nevyjadril. Tak tady je muj nazor:
'use strict'
const URL = 't.php';
const book = document.getElementById('book');
const content = document.querySelector('.content');
const trigger = Array.from(document.querySelectorAll('.suggest')).reduce(elem => elem); // pro Mariana
//const trigger = document.querySelectorAll('.suggest').map;
const loadAndRender = (url, book, content) => () => fetch(url, { method: "POST", body: { q: book.value } }) // *1
.then(response => response.text())
.then(newContent => content.innerHTML = newContent)
trigger.addEventListener('click', loadAndRender(URL, book, content);
mam stale vyhrady k tomu, ze *1 ma zbytecne pristup k celemu objektu misto jen jeho obsahu ale w/e
Proti curryingu hodně.. je to věc vlastně povětšinu k hovnu, co přináší mess.. Co se týče higher-order, proti tomu nemám nic (tedy kormě JSX a reactu, kde oni i samotní Facebook zjistiili, co je tam za problm s výkonem).
Já mám ale obecně problém s dogmaty a je jedno, zda jde o funkcionální jazyk, či třeba objektový. Používat věci, tam kde mají smysl a kde něco přinesou - většinou čitelnost, flexibilitu, nebo výkon..
O výkonu v JS (a obecně dynamicky typovaném jazyku, nemůže být vůbec řeč.. Co se týče třeba higher order,. na té báziy funguje plno jazyků a dobře. Opět je to ale použito tam kde to má smysl.
A je prostě pitchovina věci naprosto zbytečně věci komplikovat jen proto aby byly funkcionální a super cool.
jak jde posouvání divů?
A toto riešenie?
'use strict'
const URL = 't.php'
const BOOK = document.querySelector('#book').value
const CONTENT = document.querySelector('.content')
const SEND = document.querySelector('.suggest')
const loadAndRender = (url, book, content) => async function() {
let data = new FormData()
data.append('q', book)
let resp = await fetch(url, {method: "POST", body: data})
resp.ok ? content.innerHTML = await resp.text() : null
}
SEND.addEventListener('click', loadAndRender(URL, BOOK, CONTENT))
Ale ved to je v poradku, stejnej nazor mam ja. Ale je zase otazka, jak moc je treba brat vazne to, kdyz nekdo proste chce psat veci jinak. Vzdyt je to vo nicem, jet hejty, akorat ti v petatriceti praskne cevka v hlave.
já si myslím, že ve 30ti. ŕekl jsem si, že do té doby postavím barák, zasadím strom a pak umřu (y) Pokud se dříve nbodnu do krku z Node.js
Ja osobne mam radsi v takhle jednoduchem pripade promisu, tady se jasne ukazuje proc. Misto abys pouzil then tak tam znasilnujes ternarni operator - kdyz uz tak bys pouzil neco jako
resp.ok && content.innerHTML = await resp.text();
ale to je humusarna.
Proste promisu sem.
Ale currying v JS má svoj význam:
'use strict'
const kari = parm => () => {
// žiadny this objekt, žiadny window objekt - žiadny bordel či časté omyly
}
$('elm').click(kari(parameter))
Ja jsem si naopak rekl, ze ze sveho zivota eliminuju maximum negativnich veci. Ze ma JSko daleko k dokonalosti vim, ale ze bych kvuli tomu dobrovolne devastoval svoje mentalni zdravi, to se asi nestane. Treba by ti taky takovej pristup udelal dobre.
This problem v callbacku resi fat arrow samo o sobe, tady bych zrovna jako resitele curring nevidel.
Navic, ja naprosto chapu proc se Marian ma chut ritualne objetovat bohum dotnetu - closure v jsku je zdroj hroznyho neporadku, to se neda poprit.
Áno, ale bez this a window nedostaneš do callbacku žiadny ďalší
parameter.
PS: A v iných jazykoch uzávery problém nie sú? Tie sú podľa mňa blbo
chápané v ktoromkoľvek jazyku...
rozumny jazyk s this problémem nemá To jen javascript
Ono se stačí kouknout do dokumentace přímo javascriptu a budeš překvapen
jak často se tam v popisu, co to dělá a proč objevují slova:
"exotic", "awkward", "use your feeling", "not-deterministic"
Na druhou stranu, kdyz se na tom jazyku nebude aktivne makat, nikdy se nikam nepohne. Ja o JSku rad premyslim jako o takovem gateway jazyce, proste te uvede do problematiky vseho (vcetne schopnosti videt nedostatky jazyka) a ty se pak muzes posunout dal.
Tam nejde o chapani closure, tam jde o to, ze v jsku je closure castej vinik memory leaku. Mimo jine.
Častý problém začiatočníkov s JS, x tisíc krát riešený na webe, je napríklad otázka "ako zavolať pre udalosť onclick callback aj s nejakým vlastným parametrom". Proste nech callback neobdrží len event objekt, ale plus nejaký vlastný parameter. A na to je predsa currying najelegantnejšie riešenie.
Ja netvrdim, ze vim o necem elegantnejsim. Jen rikam, ze v JSku jsou vzdycky aspon 3 zpusoby jak neco udelat a zadnej neni idealni - coz je presne to, co se stat nema. Ale co uz, proste usmev a mavat, ja se kvuli tomu stresovat nebudu.
No ony ti to ne uplně řeší že jo.. a obzvláště na prd je to u nějakých meta jazyků.. páč při debugu vidíš this, ale je to _this...
No ... ja netvrdím, že je JS dobrý jazyk. Je vážne špecifický. Dobrý jazyk je Java, má najelegantnejší syntax. Ale kým je JS jediný (a aj dobudúcna bude) natívne podporovaný jazyk v prehliadačoch a zároveň sú web aplikácie aktuálnym trendom, proste sa mu nedá vyhnúť a treba ho vedieť. A keď už ho viem a ide použiť aj na serveri, tak načo PHP? A načo dotnet core - špatný pokus o Javu kopírujúci princípy Node? Ako nie, že by to bolo zlé. Je to DOBRÉ, rýchle, atď. Len ... načo?
Zobrazeno 50 zpráv z 70.