Autor Zpráva
TomasJ
Profil
Zdravím, udělal jsem si javascriptovou kalkulačku a dělám pro ni nápovědy.
Mám vlastní funkci která vytvoří element a napíše do něj předvolený text. Až nastaví vzhled rámečku a obsah, pokračuji na konec,
kde nastavuji zničení rámečku (3 sekundy + (délka textu nápovědy*50)).
Problém je v tom že nápověda vyjede, ale po tom nastaveném čase nezmizí.
Prohlížeč (Mozilla Firefox) mi vyhodí ošklivou chybu (ale až po tom určeném čase):

Chyba: uncaught exception: [Exception... "Component returned failure code: 0x80004003
(NS_ERROR_INVALID_POINTER) [nsIDOMHTMLDivElement.removeChild]" nsresult: "0x80004003
(NS_ERROR_INVALID_POINTER)" location: "JS frame :: file:///C:/Documents%20and%20Settings/Tom%C3%A1%C5%A1/Plocha
/Testy%20-%20PHP,%20HTML,%20CSS,%20JS/Calc.html :: DeleteHint :: line 58" data: no]


Kód pro vytvoření:
function Hint(id,text,col,bgcol)
{
  if(!document.getElementById(id)) //tímto kontroluji zda už element neexistuje a pokud ano, nevytvoří se
  {
    if(!col){col="black";}
    if(!bgcol){bgcol="#ffffe1";}
    var div = document.createElement("div");
    var hints = document.getElementById("hints");
    div.id=id;
    div.innerHTML=text;
    div.className="hint";
    div.style.cssText = 
      "border:1px solid "+col+";"+
      "background:"+bgcol+";"+
      "color:"+col+";";
    hints.appendChild(div);
    hints.innerHTML+="\n"; //toto mám jen pro přehlednos[prejs]t ve zdrojovém kódu.
    setTimeout("DeleteHint("+id+")",(3000+(text.length*50)));
  }
}

A kód pro zničení: TADY JE TA CHYBA (řádek 3)
function DeleteHint(id)
{
  document.getElementById("hints").removeChild(document.getElementById(id)); //ŘÁDEK 58
}


V HTML mám zapsaný tag <div> s id="hints" (<div id="hints"></div>) kam se vytváří ony nápovědy.
Při najetí na nějaké tlačítko mi vyskočí ta nápověda.
Akce kterou volám:

<button onmouseover='Hint("division","Funkce dělení.");' onClick="Enter(this.form, '/');" class="bttn o">&divide;</button>

U každého tlačítka je text nápovědy jiný a id samozřejmě taky. Nevíte jak to opravit?

EDIT:
Tak jsem zjistil že hodnota, která přichází do removeChild je null. Ale jakto?
Chamurappi
Profil
Reaguji na TomaseJ:
Nepoužívej eval, ani jeho obdoby.
V timeoutu voláš doslova toto: DeleteHint(division). V proměnné division může být element s id="division" (záleží na prohlížeči, na režimu), ale rozhodně tam není řetězec, aby document.getElementById vrátilo něco smysluplného.
TomasJ
Profil
Chamurappi:
Děkuji! Už to funguje. Použil jsem
setTimeout(function(){DeleteHint(id);},3000+(text.length*50));
a jde to jak má. Ještě jednou děkuji :)

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: