Autor Zpráva
radecek
Profil
Ahoj,

snazim se vytvorit naseptavac pro vyhledavaci pole. Vsechno vim jak udelat az na jednu drobnost, nechci psat:
<input type="text" name="hledat" onclick="septej()"><div id="div_septej"></div>

Ale pouze:
<input type="text" name="hledat" onclick="septej()">

Takze potrebuju vytvorit nejak div, vychazim z teto funkce, kterou jsem si nasel na netu:
function addElement(obj)
{
  // create a new div element
  // and give it some content
  newDiv = document.createElement("div");
  newDiv.innerHTML = "<h1>Hi there and greetings!</h1>";

  // add the newly created element and it's content into the DOM
  my_div = document.getElementById(obj);
  document.body.insertBefore(newDiv, my_div);
}

Chtel bych aby se mi po zmene inputu vzdycky obnovil vytvoreny div. Samozdrejme kdyz dam do createElement do onkeydown vytvori se mi elementu zase hodne - to bych osetril podminkou jestli element neexistuje tak ho vytvor. Vytvorit ho umim, ale nedokazu ho vytvorit ve funkci naseptavace.

Kod ktery funguje jak ma vytvari nove divi vzdy po zmackniti klavesi:
<input type="text" name="hledat" onkeydown="addElement(this.id)">

Takhle bych si to nejak predstavoval:
function septej(input)
{
  input.style.color =  input.style.color == "red" ? "black" : "red";  //kontrola funkcnosti JS
  if (input.value){
    addElement(input.id);  //funkce na pridani elementu
    send_to("kuk", "/ajax/sept.php?v="+input.value, true);  //ajax..
  } else {
    document.getElementById("kuk").innerHTML = "";
  }
}
...
<input type="text" name="hledat" onkeydown="septej(this)">

Chybu kterou mi hlasi FF debuger:
Chyba: uncaught exception: [Exception... "Node was not found" code: "8" nsresult: "0x80530008 (NS_ERROR_DOM_NOT_FOUND_ERR)" location: "http://localhost/javascript/ajax.js Line: 55"]

Dekuji za vasi odpoved
Joker
Profil
radecek
1. Tomu <div>u se ve funkci addElement nikde nenastavuje ID, takže getElementById ho pak nenajde.
2. Já bych to udělal tak, že bych ten <div> vygeneroval skrytý třeba po načtení stránky a potom ho jen zobrazoval/skrýval a nastavoval mu nějaký obsah.
Chamurappi
Profil
Reaguji na radecka:
Na první pohled mi připadá jako nesmysl zjišťovat ID elementu, který mám v this, toto ID předávat funkci a v ní pomocí document.getElementById opět dohledávat ten element, který jsem měl v this. Smysluplnější verze:
<input type="text" name="hledat" onkeydown="addElement(this)">
A ve skriptu pak:
function addElement(my_div)
{
  newDiv = document.createElement("div");
  newDiv.innerHTML = "<h1>Hi there and greetings!</h1>";
  document.body.insertBefore(newDiv, my_div);
}
radecek
Profil
Chamurappi
Bohuzel toto nejde.. Error: Error: uncaught exception: [Exception... "Node was not found" code: "8" nsresult: "0x80530008 (NS_ERROR_DOM_NOT_FOUND_ERR)" location: "file:///C:/Documents%20and%20Settings/Radek/Plocha/naseptavac/js.js Line: 6"]

// JavaScript Document
function addElement(my_div)
{
  newDiv = document.createElement("div");
  newDiv.innerHTML = "<h1>Hi there and greetings!</h1>";
  document.body.insertBefore(newDiv, my_div);
}
...
This: <input type="text" name="hledat1" onkeydown="addElement(this)" id="neco1"><br>
Get:  <input type="text" name="hledat1" onkeydown="addElement(document.getElementById('org_div1'))" id="neco1">


Pres GET to jde, pres this uz ne, chyba je vyse.
Chamurappi
Profil
Reaguji na radecka:
Pres GET to jde, pres this uz ne
Problém není v parametru, ale v té funkci. Říkáš v ní, že se má nový <div> přidat do <body> před něco. Pokud tohle něco není přímým potomkem <body>, vyskočí výjimka.

Chceš-li dát nový <div> před element předaný v argumentu, ať je kde je, uprav funkci takto:
function addElement(my_div)
{
  newDiv = document.createElement("div");
  newDiv.innerHTML = "<h1>Hi there and greetings!</h1>";
  my_div.parentNode.insertBefore(newDiv, my_div);
}
radecek
Profil
Funguje to :) Diky moc. Jeste prosim jak by se dalo nastavit na input vlasnost onkeydown, pres nejakou JS funkci?
Chamurappi
Profil
Reaguji na radecka:
document.getElementById("ídéčko").onkeydown = function()
{
  addElement(this);
};
Nebo u formulářových prvků při použití atributů „name“:
document.jménoFormuláře.jménoPrvku.onkeydown = function()
{
  addElement(this);
};
radecek
Profil
Tak uz vsechno funguje jak ma, ale stejne se mi nelibi jedna vec div se vygeneruje v kodu pred input. Chtel bych ho posunout za nej.
<div></div><input /> //mam
<input /><div></div> //chci

Existuje nejaka metoda insertBihind? Bohuzel jsem nic takoveho nanasel. Nebo jak toto zastilovat bohuzel float mi fungovalo jen v opere tak jak bych chtel..
Chamurappi
Profil
Reaguji na radecka:
Můžeš zjistit následujícího sourozence elementu a dát nový <div> před něj:
my_div.parentNode.insertBefore(newDiv, my_div.nextSibling);
Mimochodem, lomítka do <input>ů píšeš zbytečně, prohlížeče je berou jako chybu a ignorují je.

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: