Autor Zpráva
sniclman
Profil *
Dobrý den,
mám javascript na vytvoření tabulky s dvěma tlačítky, které pak vykonávají různé funkce.

function addForm(object){
newTable = document.createElement("table");
newTable.style.width="600px";
newTable.border=1;

newTr = document.createElement("tr");
newTable.appendChild(newTr);

functions = new Array(addFormRow, delForm);
values = new Array("Přidat hodnotu", "Smazat tabulku");
for(x in functions){
var newTd = document.createElement("td");
newTr.appendChild(newTd);
var newInput = document.createElement("input");
newInput.type="button";
newInput.value=values[x];
newInput.onclick = function(){return functions[x](this);};
newTd.appendChild(newInput);
}
object.parentNode.insertBefore(newTable, object);}

function addFormRow(){alert('add');}

function delForm(){alert('delete');}

<input type="button" value="Přidat volitelný formulář" onClick="addForm(this);">

potřeboval bych aby dvě tlačítka v tabulce měly na onClick funkce addFormRow(this) a delForm(this)
Problém je, že obě tlačítka dostanou funkci, která je v řetězci funkcí jako poslední delForm(this).
Můžete mi prosím poradit kde je chyba.
Chamurappi
Profil
Reaguji na sniclmana:
newTable.appendChild(newTr);
To ti funguje ve všech prohlížečích? Nebylo by lepší používat insertRow?

for(x in functions){
Smyčka for-in se nehodí na procházení cyklů.
Také bys mohl používat var.

newInput.onclick = function(){return functions[x](this);};
Hodnota x v okamžiku zavolání funkce není stejná, jako byla v době jejího vzniku. Viz Lexikální uzávěr.
sniclman
Profil *
Chamurappi:
Děkuji za dodatečné rady.
Nakonec jsem to vyřešil.
newInput.onclick = new Function(functions[x]+"(this)");
Chamurappi
Profil
Reaguji na sniclmana:
To je docela nápaditá příšernost.
sniclman
Profil *
Chamurappi:
Tak jsem se podíval na ty lexikální uzávěrky.
Výsledek by mohl být relativně dobrý.
(function(x){newInput.onclick = function(){return functions[x](this);};})(x);
Radek9
Profil
sniclman:
Tohle ti v cyklu zbytečně vytváří vždy dvě nové funkce. Dej tu obalovací ven a uvnitř cyklu ji volej.
sniclman
Profil *
Tak ještě jeden problém.
Funguje mi funkce pro přidávání ale nefunguje mi druhá funkce.
Vůbec ji to nechce druhému inputu přiřadit.

newTr = newTable.insertRow(1);
functions = new Array(addFormRow, delForm);
values = new Array("Přidat položku", "Smazat formulář");
for(x=0; x<=1; x++){
newTd = newTr.insertCell(x);
newInput = document.createElement("input");
newInput.type="button";
newInput.value=values[x];
(function(x){newInput.onclick = function(){return functions[x](this);};})(x);
newTd.appendChild(newInput);}


Radek9:
Nerozumím. Mohl bys uvést prosím příklad?


sniclman:
Tak ještě jeden problém.
Vyřešeno.

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: