Autor Zpráva
Camo
Profil
Vitajte!

Potreboval by som testovať takýto kód:
if(neexistujucaPremenna){ ... }
else{ ... }
Myslel som, že ak premenna neexistuje tak to js vyhodnotí ako false, čo by som potreboval. Ale nefungovalo mi to. Nefungovalo mi ani =="undefined" ani ==null. Ako také niečo otestovať?
Radek9
Profil
Camo:
Nefungovalo mi ani =="undefined"
Ty se snažíš totiž porovnávat undefined (primitivní hodnotu proměnné) a "undefined" (textový řetězec). K ověřování takovéto proměnné se používá operátor typeof:
if(typeof nejakaPromenna=="undefined"){
  alert("Proměnná není definována.");
}
mag123
Profil *
if (typeof promenna == "undefined") {... // neexistuje }
else {... // existuje }
Camo
Profil
Dík, toto som potreboval.
Nox
Profil
Pokud máš zajištěno, že undefined má správnou hodnotu (viz např. obalovací kód jQuery), pak můžeš použít i
if( nejakaPromenna === undefined )
Radek9
Profil
Nox:
To ale nejde u proměnných, které nebyly definovány pomocí varu (popřípadě jako parametr funkce), hodí to error.
Chamurappi
Profil
Reaguji na Noxe:
Nemůže. Jakýkoliv pokus o čtení neexistující proměnné vyvolá výjimku.
_es
Profil
mag123:
if (typeof promenna == "undefined") {... // neexistuje }
else {... // existuje }
Tým sa testuje, či premenná existuje a súčasne nemá hodnotu undefined. Teda existujúcu premennú s hodnotou undefined to vyhodnotí nesprávne. Existencia premennej sa dá otestovať:
try{nejakaPremenna; alert("premenná existuje")}catch(e){alert("premenná neexistuje")}
Ide vlastne o aplikovanie z popisu v [#7].
Camo
Profil
_es:
Díky za obšírny popis problému.
Nox
Profil
Radek9, Chamurappi:
díky za opravu

_es:
předpokládám, že toto nejde nijak zapouzdřit, jelikož by se musela nějak předat ta proměnná a to samo o sobě by hodilo chybu ... je to tak? (napadá mě možná jen pomocí té funkce, jejíž název se nevyslovuje)
_es
Profil
Nox:
předpokládám, že toto nejde nijak zapouzdřit
Do jednej funkcie asi nie, možno niečo v tvare:
eval(f("premenná"))
Kde funkcia f by vrátila reťazec podobný príkazom v [#8].
No inak je testovanie existencie lokálnej premennej asi znakom zle navrhnutej aplikácie. Zmysel má možno tak testovanie existencie globálnych premenných, definovaných iným skriptom, tie sa dajú jednoducho otestovať:
"premenná" in window
peta
Profil
window["premenná"] misto eval?
Chamurappi
Profil
Reaguji na peta:
Tím nerozlišíš neexistující proměnnou od nenaplněné (+ viz [#11], nelze použít všude).
Camo
Profil
Ja som to pužil na testovanie IE6/7. Takto som ju nastavil:
<!--[if lt IE 8]>
<script type="text/javascript">
var isIE76=true;
</script>
<![endif]-->
A teda ak existuje, tak sa tomu prispôsobí nejaký kód. Testovať existenciu vlastnosti moc nešlo... Ide o scrolovanie okna. Väčšina browserov má scrolovanie na BODY, ale IE6/7 na HTML....
Alebo sa to dalo riešiť lepšie?
Radek9
Profil
Camo:
Zkus scrollovat přímo window. Tam by problém být neměl.
Nox
Profil
Camo:
Obecně vídám doporučené spíš testovat jednotlivé vlastnosti, než browsery ... tzn. jako (jen příklad) var scroll = body.scroll || window.scroll;
Camo
Profil
Radek9:
Díky moc, vymenil som window.scrollTo a body.scrollTop za window.scroll.
Ale celá táto vec sa týka skrytia/odkrytia scrollovacej lišty. To som riešil cez html/body.style.overflow="hidden/auto". Na to som potreboval vedieť čo sa scrolluje. Ale ak by existovalo nejaké univerzálne riešenie, tak neprotestujem.
Chamurappi
Profil
Reaguji na Cama:
Väčšina browserov má scrolovanie na BODY, ale IE6/7 na HTML....
Vážně? Tomu se mi skoro nechce věřit. Matně si vzpomínám, že Explorerové v quirku rolují <body> a že ve všech ostatních případech vládne <html>

vymenil som window.scrollTo a body.scrollTop za window.scroll
window.scroll existuje? Vím jen o window.scrollTo a window.scrollBy.

Na to som potreboval vedieť čo sa scrolluje.
Proč? Nestačí nastavit oba overflow stejně?
Camo
Profil
Chamurappi:
"window.scroll existuje?"
Zjavne áno a to vo väčšine browserov. Ale keď som skúšal nájsť nejaký odkaz na W3C a pod. tak som nenašiel. Čo teraz???

"Vážně? Tomu se mi skoro nechce věřit."
Skúšal som to vo FF, O, Saf, Ch, IE8,7,6. Je to väčšina? Ale asi mi chcete naznačiť, že by som mal skúsiť prehodiť to na html. To som vlastne neskúšal, lebo som kód začal písať s tým, že to bude logicky body a to HTML som začal riešiť až keď sa objavil problém... No teraz vidím, že som nepojedol všetku múdrosť sveta.

"Proč? Nestačí nastavit oba overflow stejně?"
Nie IE zobrazí obidva posuvníky a tie sa bijú medzi sebou...

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: