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

Tvůrce

Zobrazeno 36 zpráv z 86.
//= 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.
Ten čtvrtý vzhled je úžasný. Mohl bych ho použít na svých
stránkách? (Pro odpočítávání různých věcí) - Samozřejmě až po
skončení soutěže
Takže, když jsi se tak těšil, tak zde je momentální verze - http://odpocet.filippyrek.cz/
Nakonec to udělám tak jako Michal, přehled všech vlastností a dema
SUper, ale nepostrádá to smysl, když jsi to udělal podle Michala?
Co jsem udělal podle Michala? Všechno jsem dělal sám!
Jediné co asi udělám podobně jako Michal bude ten seznam vlastností a
dem...
Je to ukázka nastylovaného a nenastylovaného...
no píšeš:
Nakonec to udělám tak jako Michal
Na něco jsi zapoměl
Nakonec to udělám tak jako Michal, přehled všech vlastností a dema
ok... Nechme to už radši
být...
Také se přidám. Neumí to nic extra, ale je to alespoň napsané
objektově
jen malá technická poznámka: je zbytečné procházet #odpocet, aby byl dokument validní a validně se v JavaScriptu jevil může být id použito jen jednou.
Zde je moje finální verze
Snažil jsem se to udělat tak, aby při upravování vzhledu a některých vlastností stačilo použít CSS.
Online: http://odpocet.filippyrek.cz
Download: https://drive.google.com/…MV3VSNl80TjQ
Pardon, špatný link. https://drive.google.com/…PbUFkSzQ2Wm8
Můj výtvor
https://drive.google.com/…eVZCX1E/edit?…
To s mým skriptem také jde.
http://finty.8u.cz/CountDown.js/
Já se snažil asi jako jediný o cross browser řešení be jquery nesmyslu. Asi nejspíš mám na něj opravdu averzi. Pomalejší věc jsem v javascriptu neviděl. Zlatý Clisure od googlu.
Vůbec jsem nečekal tak velkou účast, řešení je spoustu a většina z nich funguje skvěle. Pár řešení pouze trpělo nedostatkem, že se widget zobrazil až po vteřině, měl by tam být hned po načtení stránky. Zaměřil jsem se tedy na to, kdo to dotáhl nejdále.
Nejvíce se mi líbí řešení od Michal Maršáleka. Máš to vymakané, to
schovávání nul, placeholder když to skončilo, podporu skinů atd. Vím, že
nápad s posledním skinem je od Salátíka, ale prostě jsi své řešení
představil tak, že by ho od tebe koupil každý zákazník Gratuluji k placce. Napiš si o ní
Míše.
Všem ostatním děkuji za účast a budu se těšit u příští soutěže
Máš to hezké, ale lepší by bylo udělat to přes Konstruktor a
prototypy, tvůj OOP návrh je sice dobrý, ale pak to může někdy omezovat.
Viz třeba http://www.itnetwork.cz/…ani-tutorial
Já byl líný to stylovat. Proto jsem měl v prototypu ten update. Akorát
jsem nedodělal žádné callbacky pro každý element zvlášť. No třeba
příště to bude lepší. Chtěl jsem 3D, ale VML v IE je tak pomalé, že
jsem to vzdal.
musíš dávat těžší machry, pak nás bude soutěžit méně a bude to zajímavější.
Konstruktor používám, ale přijde mi přehlednější mít veškerou definici objektu v jednom bloku kódu (mezi { a }). Je k tomu nějaký závažný důvod, proč se metody definují přes ty prototypy?
Na druhou stranu ale bude víc případů, kdy bude soutěžit jen jeden.
co se devbook rozrůsta si myslím že už to nebude problém, možná leda tak u JS, kde ty tutoriály nejsou zatím na tak dobré úrovni jako třeba u C#.
Základní rozdíl: bez prototypu se při každém vytvoření objektu vytvoří nová anonymní funkce pro každou metodu.
Aha, takže v podstatě "jen" výkonnostní rozdíl?
Teď si nejsem jistý, ale myslím že se využívají k dědičnosti
atp.
Celkově je to takový lepší způsob. Víc by ti mohl říct určitě
Drahomír Hanák
Kromě toho, že je to několikanásobně rychlejší je hlavní výhoda asi v tom, že se metody objektu nevytvářejí pořád dokola. Vlastně v případě tvého objektu ani nemá cenu vytvářet objekt s kouzelném slovíčkem "new". Je to úplně stejné jako:
function Neco(parametr){
var objekt = {
parametr: parametr,
metoda:function(){
alert(this.parametr);
}
};
return objekt;
}
var objekt_neco = Neco('Ahoj');
objekt_neco.metoda();
A podle mě je přehlednější:
function Neco(parametr){
this.parametr = parametr;
};
Neco.prototype.metoda = function(){
alert(this.parametr);
};
var objekt_neco = new Neco('Ahoj');
objekt_neco.metoda();
Crofordovu metodu má cenu použít pouze v případě, že máš lokální proměnnou, která má být privátní.
Takže tvůj objekt CountDown by šel klidně předělat na:
function CountDown(element){
var date = new Date(element.dataset.date.replace(new RegExp(/-/g), "/"));
var notExpiredLabel = typeof element.dataset.notexpired == "undefined" ? "" : element.dataset.notexpired;
var expiredLabel = typeof element.dataset.expired == "undefined" ? "" : element.dataset.expired;
return function(){
var diff = Math.round((date.getTime() - new Date().getTime()) / 1000);
if(diff <= 0){
element.innerHTML = "<span class='expirationLabel'>" + expiredLabel + "</span>"
}
else{
var s = diff % 60;
var m = (diff - s) / 60 % 60;
var h = (diff - s - m * 60) / 60 / 60 % 24;
var d = (diff - s - m * 60 - h * 3600) / 60 / 60 / 24;
s = new TimePart(s, "secs", ["sekunda", "sekundy", "sekund"]);
m = new TimePart(m, "mins", ["minuta", "minuty", "minut"]);
h = new TimePart(h, "hours", ["hodina", "hodiny", "hodin"]);
d = new TimePart(d, "days", ["den", "dny", "dnů"]);
element.innerHTML = "<span class='expirationLabel'>" +notExpiredLabel + "</span><span class='countdowning'>" + d.formatedPart + h.formatedPart + m.formatedPart + s.formatedPart + "</span>";
}
}
}
A pak bych ho v cyklu volal:
countDowns[i] = CountDown(elements[i]);
setInterval(countDowns[i],1000);
Možná tam mám někde chybku, nekontroloval jsem to.
Nejde jen o výkon. Prototyp je jednoduchý objekt, se kterým jde snadno manipulovat (což se hodí např. pro dědičnost, různé "mixin" funkce atd.). Vytváří se pouze jednou (méně paměťově náročné) a řekl bych dokonce, že je to "best practice" co se týče objektů v JS. U velkého množství kódu v JS je to v podstatě jedno, protože jde jen o různé doplňky pro web. V JS se ale píší i velké single-page aplikace nebo dokonce serverové aplikace, kde to hodně vadí.
O výkonnost by se ale vývojáři měli zajímat. Přestože s ní nemají zrovna ve své aplikaci problémy (a JavaScript je dnes opravdu rychlý) neznamená, že by ji měli úplně ignorovat. Momentálně třeba vyvíjím aplikaci v JS, kde je výkon naprosto zásadní, protože tam zpracovávám celkem velké množství dat v reálném čase.
ADD private vlastnosti: dají se udělat i tak, že objekt zabalíme do closure funkce nebo použitím JSDoc anotace @private a o zbytek se postará Closure Compiler příp. jiný podobný nástroj.
Moc dobré vysvětlení jsem našel tady : http://stackoverflow.com/a/310914
Vážně doporučuji přečíst
Díky, přečetl jsem a už to chápu, díky taky Drahošovi.
Zobrazeno 36 zpráv z 86.