Listener je funkce, která reaguje na nějakou událost v appletu.[br]Musíme ji jednak naprogramovat, jednak ji musíme při načítání appletu "registrovat", k čemuž jsou v GeoGebra Apps API připravené funkce.[br]V našem appletu tedy máme:[br][br]function ggbOnInit() {[br] ggbApplet.registerClickListener("vyznac");[br]}[br][br]Funkci daného jména naprogramujeme tak, aby po kliknutí na objekt s názvem [color=#ff0000]AA[/color] vyznačení všech objektů zrušila a po kliknutí na kterýkoliv jiný objekt tento zvýraznila (předepsaným způsobem).[br][i]Poznámka:[/i] V appletu ani nepoužíváme tlačítko, jen bod – jen jako demonstraci, že se nemusí klikat vždy jen na tlačítko. Ale mohlo by, samozřejmě.[br][br]Funkce si ještě zaslouží komentář, dvě větve podmínky (ošetření, je-li objekt, na který klikáme, ovladač,[br]nebo vyznačovaný objekt v konstrukci) jsou zde úmyslně řešeny různě, [br]první (if (par == "AA")) trochu nedbale, nestará se o typ objektu (a v tomto případě to nevadí), [br]druhá větev (else) je napsána pečlivěji a zkoumá, jestli jsme kliknuli na bod nebo čáru. Někdy (jindy) se to může hodit.[br][br]function vyznac(par) {[br] var typ = ggbApplet.getObjectType(par); [color=#3c78d8]// zjistíme, nač jsme kliknuli[/color][br] if (par == "AA") { [color=#3c78d8]// když je to klikátko-tlačítko (které ruší zvýraznění)[/color][br] var pocet = ggbApplet.getObjectNumber();[br] for (i = 0; i < pocet; i++) { [color=#3c78d8] // projedeme všechny objekty[/color][br] var jmeno = ggbApplet.getObjectName(i);[br] if (jmeno != "AA") { [color=#3c78d8] // a pokud ten objekt není to naše klikátko[/color][br] ggbApplet.setLineThickness(jmeno, 2);[br] ggbApplet.setPointSize(jmeno, 3);[br] ggbApplet.setColor(jmeno, 0, 0, 0);[br] } [color=#3c78d8]// nastavíme mu "tuctový" vzhled[/color][br] }[br] } else { [color=#6aa84f] // pokud jsme ale klikli na objekt, tak ho chceme zvýraznit[/color][br] if (typ != "point") {[br] ggbApplet.setLineThickness(par, 8); [color=#6aa84f]// a tak bude čára tlustší[/color][br] } else {[br] ggbApplet.setPointSize(par, 6); [color=#6aa84f]// a bod větší[/color][br] }[br] ggbApplet.setColor(par, 255, 0, 0); [color=#ff0000]// a jakýkoliv objekt červený[/color][br] }[br]}[br][br]Kód, který provádíme se všemi objekty, můžeme také úsporněji[br]zapsat pomocí javascriptové iterace přes prvky pole:[br]pole.forEach(nejaka_funkce); [br]například napíšeme-li si funkci s názvem zbledni, pak zapíšeme:[br][br]var prvky = ggbApplet.getAllObjectNames(); [br]prvky.forEach(zbledni);
Pokud nám nevyhovuje hromadné rušení zvýraznění (třeba se jen "uklikneme" a chceme zrušit zvýraznění jen toho jednoho objektu), můžeme z aktuálního stavu objektu nějak poznat, zda je zvýrazněný nebo ne, a podle toho kliknutím stav změníme. To jde řešit různě. Třeba zkoumat barvu... [br]Nebo k tomu účelu využijeme nějakou zrovna nepoužívanou vlastnost. V naší ukázce je to vrstva objektu. V appletu jsme nepotřebovali objekty skládat do vrstev, tak si to můžeme dovolit.[br]Pak v appletu není žádné tlačítko pro vrácení vzhledu a reakce na kliknutí vypadá například takto:[br][br]function vyznac(par) {[br] var i = ggbApplet.getLayer(par); [color=#3c78d8]// zjistíme, ve které vrstvě objekt leží (nevyznačené leží v 0)[/color][br] ggbApplet.setLayer(par, Math.abs(1 - i)); [color=#3c78d8]// a změníme ji 0 <--> 1[/color][br] var typ = ggbApplet.getObjectType(par); [color=#3c78d8]// stejné jako nahoře, můžeme se starat o typ a nemusíme[/color][br] if (i == 1) { [color=#3c78d8]// byl-li objekt zvýrazněný (ve vrstvě 1)[/color][br] ggbApplet.setLineThickness(par, 2); [color=#3c78d8]// nastavíme mu "tuctový" vzhled[/color][br] ggbApplet.setPointSize(par, 3);[br] ggbApplet.setColor(par, 0, 0, 0);[br] } else { [color=#6aa84f]// jinak (ve vrstvě 0)[/color][br] if (typ != "point") {[br] ggbApplet.setLineThickness(par, 8); [color=#6aa84f]// čára bude tlustší[/color][br] } else {[br] ggbApplet.setPointSize(par, 6); [color=#6aa84f]// a bod větší[/color][br] }[br] ggbApplet.setColor(par, 255, 0, 0); [color=#ff0000]// a kterýkoliv objekt červený[/color][br] }[br]}[br]