Autor Zpráva
Mufna
Profil
Zdravím Vás. Nefunguje mi skrytí odstavce <p>. Pokud v JS funkcích, které uvádím níže, vynechám .document.getElementsByTagName("p"), tak skrývání (i odkrývání) funguje. Já bych to ale potřeboval upravit tak, aby to bralo pouze ID tagu <p>, nikoli tagu <h3>. Můžu sice dát tagu <h3> jiné ID, čímž by se to vyřešilo (to mám vyzkoušené a funguje to), ale přece jen bych rád z toho vycucnul pouze to <p> s příslušným ID. Poradíte mi, co s tím ? Předem díky.

function makeVisible(pID) {
  document.getElementById(pID).document.getElementsByTagName("p").style.visibility = "visible";
}

function makeHidden(pID) {
  document.getElementById(pID).document.getElementsByTagName("p").style.visibility = "hidden";
}

HTML kód pro jeden kompletní box vypadá takto:
<div class="catBox" onclick="document.location='/adresar/'" onmouseover="makeVisible('cat-1')" onmouseout="makeHidden('cat-1')">
    <h3 id="cat-1"><a href="/adresar/"> NADPIS </a></h3>
    <p id="cat-1">
      <a href="/adresar/podadresar1/"><span>odkaz 1</span></a>
      <a href="/adresar/podadresar2/"><span>odkaz 2</span></a>
      <a href="/adresar/podadresar3/"><span>odkaz 3</span></a>
      <a href="/adresar/podadresar4/"><span>odkaz 4</span></a>
    </p>
</div>
Witiko
Profil
Toto nelze udělat. Různým prvkům nelze přiřadit shodné id, id je míněn jako unikátní identifikátor daného elementu, tímto způsobem se používá name.

id - Unikátní identifikátor, příslušný element lze vyhledat pomocí documentElement.getElementById(String id)
name - Identifikátor, který může příslušet skupině prvků. Stojí na něm například input radio buttony, nebo css (kde lze však danou funkčnost nahradit pomocí className). Příslušné elementy lze vyhledat pomocí documentElement.getElementsByName(String name)

K funkcím:
document.getElementById(pID).document.getElementsByTagName("p").style.visibility = "visible";


Toto nebude fungovat, pokud není element s daným id iframe (tzn. pointer na window objekt stránky v iframe). Objekt document dědí pouze globální objekt window, proto zde odkazujete na atribut jménem document, který nalezený element nebude obsahovat. Navíc nelze měnit styl všem objektům najednou, funkce getElementsByTagName nenavrací pointer na element, nýbrž pole nalezených elementů, kterým můžete (musíte) procházet cyklem. Toto by mělo fungovat lépe:

document.getElementById(pID).getElementsByTagName("p")[index v navráceném poli].style.visibility = "visible";


I s cyklem:

var elementy = document.getElementById(pID).getElementsByTagName("p");
for(var index = 0; index < elementy.length; index++) {
  elementy[index].style.visibility = "visible";
}


Každopádně toto řešení silně nedoporučuji. Používat k tomuto cyklus je vysoce neelegantní a naprosto nepotřebné obzvlášť ve vašem případě, kdy vám (podle všeho) jde o skrytí / zobrazení jednoho elementu.
Mufna
Profil
Witiko

Takže mi tedy nezbývá než jinak pojmenovat ID u tagu <h3> ? To mě mrzí. Je pravda, že tohle
function makeVisible(pID) {
  document.getElementById(pID).style.visibility = "visible";
}

<div class="catBox" onclick="document.location='/adresar/'" onmouseover="makeVisible('cat-1')" onmouseout="makeHidden('cat-1')">
    <h3 id="nejak-jinak-nez-cat-1"><a href="/adresar/"> NADPIS </a></h3>
    <p id="cat-1">
      <a href="/adresar/podadresar1/"><span>odkaz 1</span></a>
      <a href="/adresar/podadresar2/"><span>odkaz 2</span></a>
      <a href="/adresar/podadresar3/"><span>odkaz 3</span></a>
      <a href="/adresar/podadresar4/"><span>odkaz 4</span></a>
    </p>
</div>


funguje spolehlivě
Witiko
Profil
Jak už jsem se zmínil, můžete, pokud chcete operovat se skupinou objektů, pracovat s atributem name namísto id. Nebo uzavřít celou skupinu prvků do jednoho bloku s určitým id.

Jinak v mém předchozím příspěvku vám v druhé polovině vysvětluji, proč skrývání nefunguje (odkazujete na neexistující atribut). Předpokládám, že funkce voláte s atributem "catBox". V tom případě po funkční stránce shodná id dvou podřazených elementů ani nevadí. Ta vadí "pouze" celkově. Jednoduše dva tagy nemohou mít stejné id.
panther
Profil
Mufna:
JS není moje silná stránka, ale nejde v JS zaměřit ten nadpis a odstavec kontextově přes rodičovský element, který by jediný měl ID? Mám pocit, že by to jít mělo.
Witiko
Profil
panther:
kontextově přes rodičovský element, který by jediný měl ID?

Nebo uzavřít celou skupinu prvků do jednoho bloku s určitým id. [#4]
I s cyklem:[#2]

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