Autor Zpráva
jogurt
Profil
Zdravim,
poradte mi prosim, jak v bookmarkletu definovat (a zavolat) funkci.
Napriklad mam takovyto bookmarklet:
javascript:(
	function(){
		function hlaseni(parametr){alert("parametr: "+parametr);}
		document.body.innerHTML+="<div onClick='hlaseni(\"ahoj\");' style='position:absolute; top:20px; width:50%; background-color:red;'>klikni me</div>";
	}
)()

Bookmarklet na strance vytvori cerveny DIV, ktery ma v udalosti onClick funkci definovanou tez v tom bookmarkletu. Tento priklad mi vsak nefunguje. Konzola hlasi, ze funkce hlaseni neni definovana.
Jak ji mam definovat?
_es
Profil
funkcia hlaseni je vnorená a teda nie je definovaná globálne.
Teda buď nevytváraj funkciu hlaseni a daj do onclick všetko, bez vlastných funkcií, alebo definuj funkciu hlaseni globálne.
jogurt
Profil
Je to prave docela dost kodu volaneho na vice mistech (ten alert byl jen ilustracne). Jak ji teda muzu definovat globane? Pujde to v tom bookmarkletu?
_es
Profil
jogurt
Normálne do stránky niekde na začiatok vložiš:
<SCRIPT>function hlaseni(...</SCRIPT>
Asi by sa ti zišlo niekde trochu naštudovať základy JavaScriptu, napríklad http://www.jakpsatweb.cz/javascript/.
jogurt
Profil
Zaklady znam.
Vytvarim si bookmarklet hlavne proto, ze kod stranky nemuzu menit. Jinak bych se tady neptal. Znova teda ta sama otazka: Pujde to v tom bookmarkletu? Ja verim, ze pujde. Uz jsem videl bookmarklety, ktere si definuji a pouzivaji funkce. Napriklad tento: http://supergenpass.com/genpass/.
_es
Profil
Globálnu funkciu môžeš definovať:
window.hlaseni = function(/*parametre*/){/*kód*/};
Alebo aj "normálne", no nesmieš celý kód uzavrieť do function(){/*kód*/}();.
Funkcia musí byť definovaná ako globálna, nie vnorená v inej funkcii, teda:
javascript:"var hlaseni1 = function(/*parametre*/){/*kód*/}; /*ďalší kód*/"
alebo:
javascript:"function hlaseni2(/*parametre*/){/*kód*/} /*ďalší kód*/"

Nejako si trochu odporuješ, píšeš, že je toho kódu veľa, no chceš tú istú funkciu definovať v každom bookmarklete.
Keď bude tá funkcia definovaná v jednom bookmarklete, tak by mala byť prístupná aj v iných, no samozrejme musí byť najprv spustený ten, kde je definovaná.
Kajman_
Profil *
Nešlo by udělat nový div a pak mu zkusit teprve přiřadit k události this.hlaseni?
Kajman_
Profil *
Vlastně this ani nemusí být, ta funkce by tam měla být. Jen tam asi nepůjde parametr, když se to neobalí ještě anonymní funkcí...

div.onclick = function() { hlaseni("ahoj"); };
jogurt
Profil
_es
O jakych bookmarkletech mluvis? Delam pouze jeden, ktery do stranky pridava urcitou strukturu HTML kodu, kde je nekolik mist s nekolika udalostmi, ktere potrebuji, aby spoustely jeden stejny kod.

Prave jsem to vyresil definovanim globalne:
window.nazev_funkce=new Function("kod");
(primo v tom bookmarkletu).

Dekuji vam obema za pomoc.
_es
Profil
jogurt
Tak potom to je jasnejšie. No je možné aj využiť jednu funkciu viacerými bookmarkletmi. Pretože všetky globálne funkcie zostávajú definované aj po ukončení kódu, takže by si mal myslieť aj na negatíva toho. Aby sa ti potom tie globálne názvy nepredefinovali, ak by si tých bookmarkletov robil viac.

Z troch možností si si vybral štvrtú najhoršiu. Takto definovaná funkcia môže byť menej výkonná. Miesto globálnych funkcií by to bolo asi lepši spraviť tak, ako to načrtol Kajman_. To uzavretie celého kódu do function(){/*kód*/}() je práve preto, aby nevznikali globálne funkcie a využili sa výhody vnorených funkcií. Aj keď sa to dá obísť tak, ako si to obišiel ty. Možno sa ti bude hodiť http://diskuse.jakpsatweb.cz/index.php?action=vthread&topic=95593&forum=8&page=-1#4
jogurt
Profil
Moje funkce ma par radku a pripada mi vykonna dostatecne. Navic, kdybych ji definoval jen pro nejaky onclick, nepujde zase volat odjinud, ani ze samotneho bookmarkletu. Diky za rady.

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: