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 contentKö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
)innerHeight
outerHeight
Element.clientHeight
: mekkora a megjelenített
tartalom
Element.offsetHeight
: mekkora helyet foglal
rect = Element.getBoundingClientRect()
rect.top + window.scrollY
Element.scrollHeight
: az elem tartalmának magassága (a
nem láthatóakkal együtt)
Element.scrollTop
<html>
elemnél = window.scrollY
element.scrollHeight - element.scrollTop === element.clientHeight
Element.clientTop
: felső keret vastagságaElement.offsetTop
: az elemnek az
offsetParent
-től való távolságarequestAnimationFrame()
IntersectionObserver
const 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
})