Autor Zpráva
Martin__
Profil *
 

var kolace = document.getElementsByTagName("table");
for(i=0; i<kolace.length; i++) {
if(kolace[i].className == "kolcek") {
kolace[i].getElementsByTagName("th")[0].onclick = function() {
<!--
Proč teď nefunguje kolace[i].innerHTML = "kliknuto"; ? Dík
-->
}
}
}


Otázku jsem položil doprostřed kódu. Dík
venca12
Profil
Protože jsi v kódu někde úplně jinde.

Uvědom si, že přiřazením funkce na událost onclick se ta funkce neprovede ihned a ani se neprovede na tom místě, kde ji přiřazuješ. V této části kódu tu funkci prostě jenom vytvoříš, přiřadíš, atp. ale voláš ji (spouštíš) na úplně jiném místě kódu v úplně jiný čas. Nehledě na to ve funkci nemůžeš používat lokální proměnné z jiné části programu.

A asi tam máš i logickou chybu.

Předpokládám, že chceš aby se po kliknutí na th, jeho obsah změnil na "Kliknuto". Zkus tam tedy napsat:
kolace[i].getElementsByTagName("th")[0].onclick = function() {

this.innerHTML = "kliknuto";
}
To způsobí, že kliknutí na element změní obsah (innerHTML) jeho samého.
Martin_
Profil *
venca12
už je mi to jasné. Díky.
Opravdu jsem po kliknutí chtěl změnit obsah tabulky s třídou "kolcek". Ještě před přečtením tvé odpovědí, jsem se to celé snažil aplikovat zde http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=8&topic=49 200 Jak tedy dostat proměnnou kolace[i] od té funkce?
venca12
Profil
Ok, tak tam logickou chybu nemáš. Předpokládám teda, že po kliknutí na th chceš změnit obsah tabulky v níž je to inkriminované th obsaženo.

K tomu doporučuju dvě věci. Nainstaluj si do firefoxe FireBug aktivuj ho, klikni na inspect vyber ten th element v pravy okynku přepni na DOM, najdi vlastnost parentNode, rozklikni ji a určitě něco napadne.

Kžy tedy potom budeš psát tu onclick funkci v th elementu, napíšeš tam
this.parentNode.innerHTML = '*fuck*';
a tím nastavíš obsah elementu table.

Btw. nedoporučuju používat innerHTML, protože jsem s tím měl myslím že na ie nějaký problémy. Raději používej DOM funkce, pro vytváření elementů createElement, appendChild, removeChild, createTextNode, firstNode, lastNode, atd., atd. mrkni někam na javascript referenci.
Martin_
Profil *
mrkni někam na javascript referenci
Kde ji prosím najdu?

Dík za FireBug, problém jsem s ním vyřešil.

Mám ještě jeden problém. Rád bych zničil jeden div a na tom samém místě v kódu vytvořil odstavec, jak by se to dalo provést? Dík
Martin_
Profil *
Zkoušel jsem to nějak takto:
data = "<p>ahoj</p>";
var div = document.getElementById("text1");
div.replaceChild(data, this);

ale to nefunguje.
venca12
Profil
Houuu, chlape, jasně že to nefunguje. Všechny ty metody, které jsem ti nahoře zvýraznil pracují s objekty DOMu, ne s řetězcem (i když ten je v js také objekt, ale to je jiná pohádka).

Pokud budeš chtít nahradit div v dokumentu, musíš nejdříve najít jeho rodiče a referenci na div a vytvořit element nový. Tzn element, který má v childNodes zahrnutý ten inkriminovaný div, div samotný a element p. Pokud máš ve stránce třeba něco jako tohle (li je rodič divu)

<li id="rodic">
<div id="text1">Ja jsem div</div>
</li>
pak už jen stačí provést následující kus kódu


// vytvorim element p
data = document.createElement('p');
// vytvorim text elemntu p (jo, je to kapanek komplikvanejsi)
text = document.createTextNode('ahoj');
// priradim text tomu p-ecku
data.appendChild(text);

// najdu ten inkriminovany div
div = document.getElementById('text1');

// najdu rodice divu
rodic = document.getElementById('rodic');

// v rodici nahradim stary za novy
rodic.replaceChild(data, div);
Rodiče divu můžeš získat i jinými způsoby, bez použití funkce getElementById, by to šlo třeba i pomocí div.parentNode. Tohle asi nebude nejčistší řešení (nahrazený objekt asi zůstane v paměti), ale na to sere pes.

Reference -> google "javascript reference"
Martin_
Profil *
venca12
Díky moc, dneska jsem se s Tebou hodně naučil. Ale mám stále jeden problém.
Rád bych nahradil div HTML kódem, který mám uložený v javascriptové proměnné. Obsah té proměnné bude vždy jiný, takže nemůžu začít tím, že vytvořím element p. Jak postupovat pak?
venca12
Profil
div.textContent, div.innerHTML (tady bych se jejich použití nebál, pokud se bude jednat skutečně o text a ne o html kód.
Martin_
Profil *
venca12
právě že by se mělo jednat o html kód
Martin_
Profil *
Mám tento kód

[pre<html>
<script type="text/javascript">
window.onload = function() {
function kal() {
var kalendare = document.getElementsByTagName("table");
for(i=0; i<kalendare.length; i++) {
if(kalendare[i].className == "calendar") {
mesic = kalendare[i].getElementsByTagName("th")[0].firstChild.data;
var rodic = kalendare[i].getElementsByTagName("thead")[0];
var co = rodic.getElementsByTagName("tr")[0];
var elm = document.createElement("tr");
elm.innerHTML = "<th>Text obalený TH</th>";
rodic.replaceChild(elm, co);
}
}
}
kal();
}
</script>
</head>
<body>

<table class="calendar">
<thead>
<tr>
<th colspan="7">Říjen 2007</th> <!-- tahle část se nahradí obsah proměnné elm -->
</tr>
</thead>
</table>

</body>
</html>][/pre]

Pro provedení scriptu se kód změní na

<table class="calendar">
<thead>
<tr>
Text obalený TH
</tr>
</thead>
</table>

ale obalení textu tagem TH zmizí, jak to?
Toto téma je uzamčeno. Odpověď nelze zaslat.