Autor Zpráva
Michal Bůžek
Profil
Dobrej,
Poraďte mi jak na to, chci udělat otvírací a zavírací kategorie javascriptem, ale pomocí DOM - tzn. když je vyplý JS, tak se nezobrazí ani tlačítko na otevírání a zavírání.

Zaseknul jsem se ale na předání parametru funkci co se spouští onclickem ukázka:

	
h3=navigace.getElementsByTagName('h3');
a=[h3.length+1];

for(i=0;i<h3.length;i++){
	a[i]=document.createElement('a');
	a[i].appendChild(plus[i]); //jenom text odkazu
	a[i].href='#';
//-------------------------------------------------------------------- ---------------------
	a[i].onclick=makej(i); // tady potřebuju předat íčko, jenže to nejde |
//-------------------------------------------------------------------- ---------------------
}
function makej(i)
{
	alert(i);
}


Mám teda nějaký množství kategorií a do každý chci vložit odkaz s onclickem a chci dostat do funkce makej číslo i. Jediný co mě napadá, že by šlo je napsat ty linky v XHTML a pak jim dát parametr onclick="", což ale nechci, protože nechci aby tam ty odkazy při vyplym javascriptu byly (nejenom je zmizet přes CSS).

Děkuji za návrhy jak na to.
joe
Profil
Myslím, že by to takhle mělo jít. Jsi si jistý, že a[i] je platný element nebo že to neskončí nějakým řádkem v cyklu nad? Asi ne, ale přece... :-) Něco podobného jsem řešil. Jinak jako parametr té funkce - i - bude událost kliknutí.
Michal Bůžek
Profil
joe: no na 100% to takhle nejde, správný zápis je prý
a[i].onclick=makej;
- když tohle udělám a uvnitř funkce zadám i=1; tak to potom funguje.

ten zápis jak to mám nahoře v dotazu udělá to, že se funkce makej spouští při načtení stránky - pro každej odkaz zvlášť a při klikání na odkaz se už nespouští a prý to je normální chování, co jsem četl na netu. I tohle je špatně a.onclick=makej();

Dík za odpověď, ale tvoje řešení si neumim představit - jak jsi to přesně myslel?
joe
Profil
Michal Bůžek
Pravda, pokud zadáš na ten řádek makej() tak to bude volat funkci, musíš ji předat jen referenci na makej().

Mělo by fungovat

a[i].onclick = new Function("makej(" + i + ")");
Michal Bůžek
Profil
joe:
To dělá zase to samý - chová se to jako by tam bylo jen
makej(i);


Zkoušel jsem i to, že jsem napsal
a[i].onclick=function(){ makej(i); }


To sice funguje jak má - předává to ičko a spouští se jen při klikání, ale zase se kliká v době kdy proběhnul for cyklus a v ičku je hodnota 10, takže nezjistim na co jsem vlastně kliknul :-(
joe
Profil
Opravil jsem to, musíš to uvnitř new Function mít ještě v uvozovkách.

<html>
  <body>

<a href="#1" class="link">first</a>
<a href="#2" class="link">second</a>

<script>

var allLinks = document.getElementsByTagName('a');

for(var i = 0; i < allLinks.length; i++) {
	
	if(allLinks[i].className == 'link') {
		allLinks[i].onclick = new Function("test(" + (i + 1) + ")");
		
	}
	
}

function test(i) {
	alert(i);
}

</script>

  </body>
</html>
Kajman_
Profil *
takže nezjistim na co jsem vlastně kliknul

A makej(this) nestačí? Pokud tedy jen potřebujete objekt, na který se kliklo.
Michal Bůžek
Profil
joe
Díky moc fakt to funguje, ale vůbec nevim jaktože to funguje - neměl bys ještě aspoň link, kde se to co si udělal vysvětluje?

Ještě mám malej problémek, že se stránka při klikání reloaduje u HTML parametru onclick se to dělá pomocí return false; ale když to dám nakonec funce makej, tak to stále reloaduje, určitě víš jak na to ;-)
Michal Bůžek
Profil
Kajman_
Tak to potom ale nefunguje když má makej parametr - teď jsem to zkoušel i s this a je to stejný jako, když tam dám i.
joe
Profil
Michal Bůžek
Tak pak můžeš napsat to samý, jako když to dáváš do HTML.
 new Function("return test(" + (i + 1) + ")");

a ve funkci vrátíš false ;)

Pokud bys přidával událost pomocí addEventListener | attachEvent tak to je složitější.

Tak to potom ale nefunguje když má makej parametr - teď jsem to zkoušel i s this a je to stejný jako, když tam dám i.
Použití this je bezpečnější a je lepší použít právě addEventListener...

---

Ještě k tomu, kde by se to dalo najít. Vzpomněl jsem si na to, protože už jsem to jednou potřeboval.
Nevím k čemu ti bude vysvětlení, hlavně že to funguje :), možná se něco dočteš.
peta
Profil
Michal Bůžek
str = "return test(" + (i + 1) + ")";
new Function(str);

new mujObjekt(parametry)

function objSouradnice(x,y)
{
this.x = x;
this.y = y;
this.z = x*y;
}
var xxx = new objSouradnice(2,3)
alert(xxx.x)
alert(xxx.y)
alert(xxx.z)

var xxx = {
'x': 2,
'y': 3,
'z':2*3
}
alert(xxx.x)
alert(xxx.y)
alert(xxx.z)

jakpsatweb - javascript - objekt
new Function tam asi zminene nebude.
Michal Bůžek
Profil
joe
Děkuju, to mě nenapadlo s tim returnem ;-) super,

Vysvětlení mi je k tomu, že bych se rád přiučil co jsem to vlastně udělal, protože až zase něco budu dělat pak budu chytřejší, ptát se tady na rady je až poslední možnost, když už fakt nevim :-) Prostě rád bych uměl javascript, i když stránky nedělám profesionálně :-)
los
Profil *
Namiesto konštruktoru Function môžeš použiť takýto zápis:
a[i].onclick = (function(i) {
	return function() { return makej(i); } }
)(i);


Ty asi potrebuješ iba to, aby si sa vo funkcii makej nejako dostal k elementu h3. V tom prípade by som dal tým h3 nejaké id (ručne/skriptom), nastavil a[i].href = "#" + h3[i].id a vo funkcii makej by som žiaden index nepotreboval, takže by to obsluhovala rovnaká funkcia bez parametrov. Prípadne si ten index môžeš uložiť do nejakého atribútu toho odkazu.

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: