Kliensoldali webprogramozás
Horváth Győző
Egyetemi docens
1117 Budapest, Pázmány Péter sétány 1/c., 4.725-as szoba
horvath.gyozo@inf.elte.hu
→ Böngésző API

C++, dinamikus, OOP, funkcionális
class Library {
books = [
{title: 'A case for Christ', author: 'Lee Strobel'},
// ...
]
booksByAuthor(author) {
return this.books.filter(book => book.author === author)
}
}
const lib = new Library()
const strobels = lib.booksByAuthor('Lee Strobel')
for (const b of strobels) {
console.log(b.title);
}

document.querySelector('css selector')document.querySelectorAll('css selector')elem.addEventListener(típus, fgv)Progressive enhancement
2006-2010
| Weboldal | Webalkalmazás |
|---|---|
| Tartalom | Funkció |
| Működik JS nélkül | JS kell hozzá |
| Fogyasztás | Létrehozás |
| Egyszerű | Komplex |
| Szerveroldali | Kliensoldali |
noscript tag, alt attribútum, táblázat
mint layout, canvas fallback content| Könnyed lefokozás | Progresszív fejlesztés |
|---|---|
| Kiindulás: teljes funkcionalitású verzió | Kiindulás: alap funkció |
| Ha valami nem elérhető, akkor azt kihagyva érhető el a funkció | Ha valami elérhető, akkor azt elérhetővé teszi |
| Fentről lefele építkezik | Lentről felfele építkezik |



Forrás: Todd Parker, Scott Jehl, Maggie Costello Wachs, Patty Toland: Designing with Progressive Enhancement: Building the Web that Works for Everyone, 1st Edition
Nagyon régi kód :)
<p id="printthis">
<a href="javascript:window.print()">Print this page</a>
</p>
<p id="printthis">
<a href="javascript:window.print()">Print this page</a>
</p>
<noscript>
<p class="scriptwarning">
Printing the page requires JavaScript to be enabled.
Please turn it on in your browser.
</p>
</noscript>
Kell egyáltalán nyomtatás funkció?
<p id="printthis">Thank you for your order. Please print this page for your records.</p>
const pt = document.getElementById('printthis');
if(pt && typeof window.print === 'function'){
const but = document.createElement('input');
but.setAttribute('type','button');
but.setAttribute('value','Print this now');
but.onclick = function(){
window.print();
};
pt.appendChild(but);
}







Fejlesztett változat

Alap változat

Fejlesztett változat

Alap változat




Content Delivery Network

<!-- index.html -->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
<script src="index.js"></script>
// index.js
_.countBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': 1, '6': 2 }
scroll, resize események nagyon gyakran
hívódhatnak meg// custom throttle
let waiting = false
window.addEventListener('scroll', function (e) {
if (!waiting) {
doSomething()
window.requestAnimationFrame(function () {
waiting = false
});
waiting = true
}
});
// lodash throttle metódus
window.addEventListener('scroll', _.throttle(doSomething, 100))
window
scrollY (pageYOffset)innerHeightouterHeight
Element.clientHeight: mekkora a megjelenített
tartalom

Element.offsetHeight: mekkora helyet foglal

rect = Element.getBoundingClientRect()
rect.top + window.scrollYElement.scrollHeight: az elem tartalmának magassága (a
nem láthatóakkal együtt)

Element.scrollTop
<html> elemnél = window.scrollYelement.scrollHeight - element.scrollTop === element.clientHeightElement.clientTop: felső keret vastagságaElement.offsetTop: az elemnek az
offsetParent-től való távolsága


requestAnimationFrame()IntersectionObserverconst observer = new IntersectionObserver(onObserve, {
threshold: 0.0,
})
function onObserve(entries) {
entries.forEach(entry => console.log(entry))
}
observer.observe(target)
const mutationObserver = new MutationObserver(onMutate)
function onMutate(records) {
records.forEach(record => console.log(record));
}
mutationObserver.observe(document.body, {
subtree: true,
childList: true,
attributes: true
})