Autor Zpráva
preca1
Profil
Ahoj,
mam dvě funkce, které by měly skrývat/ukazovat jeden div. Obě se mi zdaj stejný, ale jedna ten div neskrývá/neukazuje. Vysvětlí mi prosím někdo proč? Firebug neukazuje žádnou chybu.
<script>
function funguje() {
var div = document.getElementById("div").style;
  if (div.display == "none") {
    document.title = "funguje";
    div.display = "block";
  } else {
    document.title = "funguje víc";
    div.display = "none";
  }
}

function nefunguje() {
var div = document.getElementById("div").style.display;
  if (div == "none") {
    document.title = "nefunguje";
    div = "block";
  } else {
    document.title = "nefunguje víc";
    div = "none";
  }
}
</script>
<a href="#" onClick="funguje();">funguje</a>
<div id="div">
text ke skrytí
</div>
<a href="#" onClick="nefunguje();">nefunguje</a>

Živá ukázka. To s tim titlem tam mam, abych věděl, jestli se vůbec něco děje.

Dík
DoubleThink
Profil *
display je vlastnost objektu style.
Do proměnné div se uloží jen jeho hodnota (string pravděpodobně). Žádná vazba mezi proměnnou a objektem dokumentu nevznikne.
fireball_
Profil
DoubleThink
Upřesnil bych to :), promiň.

---

v prvním příkladu se ti do proměné div uloží reference (odkazová proměnná) na objekt s kterým později můžeš dál pracovat. Toto řešení se často používá při optimalizaci, protože je to taková "zkratka". Nevyhledáváš stále dokola stejný podobjekt.

v druhém příkladu se do proměnné div neuložila reference na objekt, ale jen hodnota vlastnosti display (primitivní proměnná).
Witiko
Profil
Prostý objekt je refenčním datovým typem, proto se proměnné nepřiřadí data, nýbrž pointer alias packa, reference, odkaz, ukazatel na tento objekt. (typeof document.getElementById("div").style == "object")
Atribut display obsahuje data typu String. Se Stringem (ačkoliv jde také o objekt) se v javascriptu zachází jako s základním datovým typem, proto se proměnné přiřadí data, která daný atribut v danou chvíli obsahuje. (typeof document.getElementById("div").style.display == "string")

Například Array je v javascriptu referenční datový typ, ale v mnoha jiných jazycích (např. php a jsem si celkem jistý, že i C, C++, Java pokud vím přistupuje k problematice podobným způsobem jako ECMAscript) se stejně jako String chová jako typ základní datový, základním důkazem tohoto tvrzení budiž [] != [] - neporovnávají se data, ale pointery dvou rozdílných instancí Array. Má to své výhody i nevýhody (například kopírování polí v javascriptu nejde vyřešit pomocí pole1 = pole2, opět by se kopíroval pouze pointer na jeden a ten samý objekt, na druhou stranu díky své objektové podstatě je možné zjistit délku pole bez volání metod přes .length atribut a stejně tak možnost předání pointeru a ne jen dat je sama o sobě v mnoha situacích vysvobozením)

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:

0