Autor Zpráva
Rex
Profil *
Je na tohle nějaké velmi jednoduché řešení? Nějaký jednoduchý kód? Prošel jsem tady ty návody a hraju si s tím už dost dlouho, ale stále tam mám nějaké chyby.
panther
Profil
Rex:
a tvůj kod, který nějak nefunguje, si máme domyslet? Jak nefunguje? Ukaž.
Rex
Profil *
Použil jsem tenhle návod:

<a href="#" id="avice" onclick="this.style.display = 'none'; document.getElementById('vice').style.display = 'block';">Více...</a>
<div id="vice" style="display: none;">Skrytý text...
<br>
<a href="#" onclick="document.getElementById('vice').style.display = 'none'; document.getElementById('avice').style.display = 'block'">Méně...</a>
</div>

Sice funguje, ale když tam upravím text, tak se mi zobrazí ihned po načtení stránky, není tedy skrytý.

Moderátor panther: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
TomasJ
Profil
Rex:
<html>
<head>
<script>
function Show_Hide(elemid,btnid)
{
  var elem = document.getElementById(elemid); //Načtení elementu s obsahem navíc
  var bttn = document.getElementById(btnid); //Načtení elementu pro ovládání (Více / Méně)
  elem.style.display = (elem.style.display=="none") ? "block" : "none"; //Pokud je prvek skryt (display:none), nastaví se 'block', v opačném případě 'none'
  bttn.innerHTML = (elem.style.display=="none") ? "Více..." : "Méně..."; //Pokud je předchozí prvek skryt, text na ovládání (<a></a> se nastaví na 'Více...', jinak 'Méně...'
}
</script>
</head>
<body>
<div id="vice" style="display:none;">Skrytý text...</div>
<a href="javascript:void(0);" id='ovladani' onclick="Show_Hide('vice','ovladani');">Více...</a>
</body>
</html>

Funguje to a mně to při obnově nebo novém načtení stránky nechá skrytý.
Rex
Profil *
Už mi funguje i ten předchozí kód, akorát, když kliknu na Více pro zobrazení obsahu, stránka se posune úplně nahoru. Jak docílit, aby se stránka neposunula úplně nahoru, ale zůstala na stejném místě?
TomasJ
Profil
Rex:
Nedávej do <a href""> mřížku (#), která odkazuje na kotvy. Dej tam třeba href="javascript:void(0);" nebo "javascript:return false;"
EDIT: Myslím, že můj kód je efektivnější a úspornější, ale jak myslíš :)
Witiko
Profil
TomasJ:
Když už jsme u toho, viděl jsem (na eBay myslím) následující kód na odkazech - javascript:{}. Přemýšlel jsem, jestli to má nějaké výhody kromě originality a zbytečného vytvoření a zahození prázdného objektu. :-)

Jinak ta funkce zbytečně hledá element ve kterém mění text, stačilo by předat this. Pokud dovolíš, mírně bych jí upravil a to sice na:
var pointerCache = {};
  
function showHide(element, button) {
  if(typeof element === "string")
    element = pointerCache[element] === undefined?
      (pointerCache[element] = document.getElementById(element)):
       pointerCache[element];
  if(typeof button === "string")
    button = pointerCache[button] === undefined?
      (pointerCache[button] = document.getElementById(button)):
       pointerCache[button];
  if(element.style.display === "none") {
    element.style.display = "block";
    button.children[0].style.display = "block";
    button.children[1].style.display = "none";
  } else {
    element.style.display = "none";
    button.children[0].style.display = "none";
    button.children[1].style.display = "block";
  }
}


...


<span id="vice" style="display:none;">Skrytý text</span><br>
<a href="javascript:void(0);" onclick="showHide('vice', this);">
  <span style="display:none;">Méně</span>
  <span style="display:block;">Více</span>
</a>
Chamurappi
Profil
Reaguji na Witika:
Přemýšlel jsem, jestli to má nějaké výhody kromě originality a zbytečného vytvoření a zahození prázdného objektu. :-)
Kdyby se vytvářel objekt, vracelo by to "[object Object]". Zápis {} je v tomto případě prázdný blok.
Pokud musím použít odkaz, většinou používám href="javascript:;", nebo "javascript:// Lidsky srozumitelný popis prováděné činnosti.".


Reaguji na TomaseJ:
nebo "javascript:return false;"
To vyvolá chybu, ne? Nejsi uvnitř funkce, return tam nemá co dělat. (Navíc false není undefined.)
joe
Profil
Chamurappi:
Pokud musím použít odkaz, většinou používám
Na co používat odkaz, když se pak nevyužije? Není lepší span?

Witiko
Možná se pletu, ale přijde mi tvá cache docela k ničemu :), nejenom, že na pár elementů to snad ani nemá smysl, ale pokud by jich náhodou bylo více, budeš je zbytečně uchovávat, i když je třeba dál už nikde nepoužiješ.

Možná vám JS odborníkům přijde dobrý všechno ošetřovat, viz
if(typeof element === "string")
a podobný blbůstky, já bych nad tu funkci radši napsal JSDoc, který jasně řekne, co se má dané funkci předat. Nemám moc rád, když můžu předávat objekt/string, je to snad možné i v jiném (objektovém) jazyce? Místo toho bych radši vyhodil vyjímku hned na začátku funkce a jinak normálně pokračoval, přijde mi to tak daleko přehlednější.

Mimo to, ti to skončí chybou, pokud zadáš nějaký neexistující string.
Chamurappi
Profil
Reaguji na joa:
Není lepší span?
Pokud musím použít odkaz, tak není.

je to snad možné i v jiném (objektovém) jazyce?
Řekl bych, že je. Také je v řadě jazyků možné přetěžování, které jde jinou cestou k témuž výsledku.

přijde mi tvá cache docela k ničemu :), nejenom, že na pár elementů to snad ani nemá smysl
Ona je k ničemu zejména proto, že už je víceméně stejný aparát přítomen uvnitř prohlížeče. Proto je ostatně metoda getElementById přítomna jen na documentu, prohlížeči stačí udržovat jednu hešovací tabulku.
joe
Profil
Chamurappi:
Pokud musím použít odkaz, tak není.
Právě nevidím žádný důvod, proč bys musel použít odkaz, když se ve skutečnosti o odkaz nejedná...

Řekl bych, že je. Také je v řadě jazyků možné přetěžování...
O tom, co se píše na wiki jsem nevěděl. Ale moc se mi to nelíbí, radši bych použil interface, když už. Sice tam je napsaná nevýhoda, ale přijde mi to jako hezčí řešení, ve kterém bych se vyznal rychleji :-)

Co se přetěžování týká, tak v té metodě se pracuje s příslušným objektem. Dá se tak sice pomocí podmínek dobrat ke stejnému výsledku, ale proč to tak dělat, když to jde udělat jednoduše :-)
Str4wberry
Profil
Právě nevidím žádný důvod, proč bys musel použít odkaz, když se ve skutečnosti o odkaz nejedná...

A já bych důvod viděl. Při jakoby odkazu by se mělo dát JS funkci spustit jen s klávesnicí po označení použitím Tabu.
joe
Profil
Str4wberry:
Pokud se nastaví tabindex, pak může mít fokus i ten span.
Str4wberry
Profil
To potom ano, neříkám, že nemůže.
Witiko
Profil
Chamurappi:
Proto je ostatně metoda getElementById přítomna jen na documentu, prohlížeči stačí udržovat jednu hešovací tabulku.
To je také pravda. :-) Člověk se často nechá, nedávaje pozor, zmást voláním funkce, jež pak nutně považuje za zlo, které je nutné minimalizovat ukládáním hodnot, aby se nutnosti dalších volání zamezilo.

joe:
Možná vám JS odborníkům přijde dobrý všechno ošetřovat, viz
Možná kdyby sis to přečetl pořádně, tak bys viděl, že mi nejde o ošetřování čehokoliv, pouze o zjištění, jestli uživatel předal element nebo jeho ID. A jelikož javascript nemá nativní podporu přetěžování, tak si musím jaksi proklepnout, co mi od uživatele přišlo, ručně. :-) Pravda je, že jsem mohl udělat daný test restriktivnější, jelikož by někdo mohl poslat objekt String.

Mimo to, ti to skončí chybou
Ošetřování, jestli element s daným ID existuje apod. nechávám na kýmkoliv, kdo by danou funkci případně použil. Zastávám pravidlo, že kontroly argumentů na začátku funkce by se měly aplikovat až pokud praxe prokáže, že je to potřeba. Pakliže sepíšu script o kterém vím, že funkci špatné elementy nepředá, tak mohu v noci v klidu spát i když na začátek funkce nedám řadu testů delších než funkce sama. A už rozhodně jimi nebudu floodovat fórum, to ať si každý dopíše podle potřeby. :-)

Jinak ten script osobně nepoužívám, sepsal jsem ho tu spatra pro Rexe. Osobně bych element v tomto případě vůbec nehledal, jelikož bych si tyto skrývavé / odkrývavé elementy generoval uzavřeně scriptem.

já bych nad tu funkci radši napsal JSDoc
Držím palce, osobně jsem to u tak krátké a průhledné funkce nepovažoval za nutné.
joe
Profil
Witiko:
Možná kdyby sis to přečetl pořádně, tak bys viděl, že mi nejde o ošetřování čehokoliv
Já si to přečetl pořádně a vím k čemu jsi to tam psal, jen nevidím důvod předávat dva možné typy, když můžu vždycky předávat jen jeden a to třeba Element a nebo ten String a tím pádem zkrátit kód samotné funkce.

Držím palce...
To není o tom, jestli je funkce krátká nebo dlouhá. Já to tak třeba dělám, přijde mi to pohodlné, protože mi pak NetBeans (a možná i jiné) ukážou, co tam patří. A pokud to tam není, tak se zbytečně musim přesouvat do kódu té funkce a zkoumat, co vlastně všechno můžu za parametry dosadit. Samozřejmě není problém tam napsat Element|String :) Ale to je každého věc, jak si píše kódy.

Mimochodem v kódu se spoléhá jen na to, že style.display je buď 'none' a nebo 'block', může však být i 'inline-block', 'table', ...
Witiko
Profil
joe:
se spoléhá jen na to
Ano, spoléhá. Pro specifické potřeby prosím upravit. :-)

a to třeba Element a nebo ten String
Problémem je také to, že klasický řetězec není instance objektu String. Jde o prostý datový typ, který se na instanci objektu dočasně převede při použití tečkového operátoru, aby se mohly využít metody prototypu String. Stejně tak Number. Viz.:
new Number(1) !== 1
new String("text") !== "text"

(new Number(1) instanceof Number) === true
typeof new Number(1) !== "number"

(1 instanceof Number) === false
typeof 1 === "number"

(new String("text") instanceof String) === true
typeof new String("text") !== "string"

("text" instanceof String) === false
typeof "text" === "string"

A jelikož znám málo lidí, kteří řetězce a čísla definují jako instance prototypů, tak se obávám, že kontrola jedná-li se o String by neuspěla. :-) Milovník objektovosti úpí ale jediná kontrola, jedná-li se skutečně o String, je if(typeof proměnná === "string" || proměnná instanceof String).
Chamurappi
Profil
Reaguji na joa:
Ale moc se mi to nelíbí, radši bych použil interface, když už.
Konkrétně v tomto případě jak?

ale přijde mi to jako hezčí řešení, ve kterém bych se vyznal rychleji :-)
Věc názoru. Programátoři jsou blázni s mnohdy navzájem nekompatibilním šílenstvím :-)

nevidím důvod předávat dva možné typy, když můžu vždycky předávat jen jeden a to třeba Element a nebo ten String
Nepochopil jsem Witikovu reakci na tuto větu, tak se jí chopím sám.
Z hlediska běžného lajckého použití je jednodušší předávat přímo ídéčko (tedy řetězec), ale také je vhodné nechat si otevřená vrátka pro elementy, které ID nemají a dohledávají se jinak, a tedy které jsou předané přímo.


Reaguji na Witika:
Milovník objektovosti úpí ale jediná kontrola, jedná-li se skutečně o String, je if(typeof proměnná === "string" || proměnná instanceof String).
Ovšem instance Stringu z jednoho rámu není instancí Stringu z druhého rámu. Stoprocentně neprůstřelné by mělo být:
if(Object.prototype.toString.apply(proměnná) === "[object String]")
Ale to je zbytečně důkladné, v praxi se používají klasické řetězce.
joe
Profil
Chamurappi:
Takhle by to nefungovalo? Možná v tom nevidím ten hlavní problém a nějak si to zjednodušuju. Ale přijde mi to jako úplně to samé, jen s tím rozdílem, že s použitím interfacu můžu rychle zjistit, jaké instance objektů můžu dát do metody InTheForest().

Witiko:
Pěkně jsi vypsal co se čemu rovná a nerovná, vím kam se budu dívat, až to budu potřebovat.

Ale tak to jsem asi nemyslel objekt String, ale "string", klasický řetězec. Kdo se v tom má vyznat, když to někde objekt je, jinde není :-)
Chamurappi
Profil
Reaguji na joa:
Takhle by to nefungovalo?
Fungovalo. Tímto konkrétním případem jsem myslel tento konkrétní případ. Prakticky by musel řetězec i element mít stejný interface, ne?
Možná jsem trochu minul, když jsem tě poslal na ducktyping, protože tohle není přímo ducktyping, ale spíš dynamické typování (v něm také není JS unikát).
Witiko
Profil
Chamurappi:
Nepochopil jsem Witikovu reakci na tuto větu
joe je viditelně znalý Javy, tvrdil, že by rád využil interface. Proto jsem z „Element a nebo ten String“ usuzoval, že chce typ přetížení rozlišit tím, jestli je předaný argument instancí String nebo Element. A jelikož prosté řetězce nejsou instancí String, poukázal jsem na to v odpovědi.

if(Object.prototype.toString.apply(proměnná) === "[object String]")
Pěkné, připomíná mi to aplikování metod z prototypu pole na objekty poli podobné (jako například sliceování arguments).

Array.prototype.slice.call({length: 3, 0: "Quak!", 1: "Quaaaaaak!", 2: "Quaaak?"}, 1);
// navrátí ["Quaaaaaak!", "Quaaak?"]

Tohle je mimochodem skutečně typický příklad ducktypingu, na který odkazuješ joa. Jazyk bez kachen by se takovému kontextu asi vzpouzel.

joe:
Pěkně jsi vypsal co se čemu rovná a nerovná, vím kam se budu dívat, až to budu potřebovat.
Skutečně se to hodí jen do knihoven pro lid, kde si člověk jednotlivé funkce a typy argumentů hlídá a vždy po zavolání pečlivě testuje. Jinak ve skutečnosti, jak říká Chamurappi, se používají spíše malý string a number. Jazyk umožňuje nad nimi spouštět funkce Number a String prototypu, takže skutečně není důvod činit jinak. :-)

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: