Autor | Zpráva | ||
---|---|---|---|
MilanX Profil |
#1 · Zasláno: 13. 7. 2014, 00:27:13
Jsem začátečník a potřeboval bych poradit.
V JavaScriptu potřebuji používat hodnoty z rozjížděcího menu mimo funkci. Mám tento kód, ale někde dělám chybu. Díky moc za každou radu. <form name="rozjizdeci"> <select name="menu" onChange="prejdi(document.rozjizdeci.menu.options [document.rozjizdeci.menu.options.selectedIndex].value)"> <optgroup label="Kolo:"> <option value=pr.400>Kolo male</option> <option value=pr.500>Kolo velke</option> </optgroup> </select> </form> <script> document.rozjizdeci.menu.onchange=function(){var kolo = document.rozjizdeci.menu.value}; </script> <form name="hodnota"> <input type="hidden" name="skryte" value="kolo"> </form> <script> alert(document.hodnota.skryte.value) </script> |
||
_es Profil |
#2 · Zasláno: 13. 7. 2014, 01:00:18
MilanX:
Nastavenie udalosti onchange pomocou HTML atribútu onchange v 3. riadku je neskôr prepísané v 12. riadku iným spôsobom zachytenia udalosti, teda v dôsledku toho nebude fungovať (ten prvý spôsob). Na čo ti tam je druhý formulár, keď nemá odosielacie políčko? Prečo s tou hodnotou nepracuješ v kóde v HTML atribúte onchange , alebo vo funkcii priradenej do vlastnosti onchange (12. riadok) (len jedným spôsobom)? Premenná kolo je k ničomu, lebo to je len lokálna premenná funkcie a po skončení funkcie je „zahodená“ a neexistuje.
|
||
MilanX Profil |
#3 · Zasláno: 13. 7. 2014, 01:56:23
_es:
To je pravda, nevšiml jsem si, že si vlastně onchange přepisuji... Abych to upřesnil, tak potřebuji to, co vyberu v rozjížděcím menu dostat do scriptu jako globální proměnnou, nyní je použita v příkazu alert, ale ve skutečnosti bude dále použita jako proměnná pro více funkcí. Můžeš mi pomoci s kódem? Předem děkuji. |
||
_es Profil |
#4 · Zasláno: 13. 7. 2014, 02:49:48
MilanX:
„potřebuji to, co vyberu v rozjížděcím menu dostat do scriptu jako globální proměnnou,“ Nepotrebuješ skôr v JS zareagovať na to, že sa zmenila hodnota selectu? Alebo chceš odoslať formulár už pri zmene selectu? Inak, platnosť premenných vyplýva z toho, kde sú definované pomocou var , no výmena dát medzi funkciami pomocou globálnych premenných nie je obvykle dobrý nápad. Okrem toho, tá hodnota je prístupná z výrazu document.rozjizdeci.menu.value , takže ti nijaká, špeciálne na to, premenná netreba.
|
||
MilanX Profil |
#5 · Zasláno: 13. 7. 2014, 23:06:17
Zareagovat v JS je možná také řešení. V principu potřebuji změnou selectu překreslit Raphael (SVG) dokument. Pokud ve scriptu použiji pouze
<script> alert(document.rozjizdeci.menu.value) </script> |
||
_es Profil |
#6 · Zasláno: 14. 7. 2014, 00:25:28
MilanX:
„tak se hodnota načte pouze při načtení stránky, při změně selectu již alert "mlčí".“ No veď na to máš predsa tú udalosť onchange . Čo ti bráni, aby „alert nemlčal“, použiť:
<select onchange="alert(this.value)" ...> <script> objektSelectu.onchange = function(){alert(this.value)}; </script> |
||
MilanX Profil |
#7 · Zasláno: 14. 7. 2014, 09:01:04
Tomu rozumím, ale první možnost je mimo script a druhá možnost je uvnitř funkce. Já bych ale potřeboval hodnotu dostat do scriptu jako globální proměnou. Vím, že jsi psal, že globální proměnná mezi funkcemi není obvykle dobré řešení, ale prozatím bych to v kódu opravdu potřeboval.
|
||
_es Profil |
#8 · Zasláno: 14. 7. 2014, 10:40:05
MilanX [#7]:
Ako „mimo skript“, či „vo vnútri funkcie“? Môžeš predsa volať hocijakú funkciu - nielen alert .
„V principu potřebuji změnou selectu překreslit Raphael (SVG) dokument.“ <script> function tvojaFunkciaNaPrekreslenie(hodnota){ // Tu to podľa argumentu hodnota „prekreslíš“ } </script> <select onchange="tvojaFunkciaNaPrekreslenie(this.value)" ...> |
||
MilanX Profil |
#9 · Zasláno: 14. 7. 2014, 22:00:16
Znamenalo by to vytvořit na vykreslení každé entity funkci, čemuž jsem se chtěl vyhnout. Níže je větší část kódu, možná tě napadne ještě jiné řešení.
<!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>Vykres</title> <script type="text/javascript" src="./srcExt/raphael-min.js"></script> </head> <body> <div style="width: 1000px; height: 560px; border:1px solid rgb(160,160,160);background-color: rgb(249,249,249) "> <form name="rozjizdeci"> <select name="menu" onChange="prejdi(document.rozjizdeci.menu.options [document.rozjizdeci.menu.options.selectedIndex].value)"> <optgroup label="Kola:"> <option value=400>Kolo male</option> <option value=500>Kolo velke</option> </optgroup> </select> </form> <div id=prostor></div> <script> var PLATNO_REF_X = 9 var PLATNO_REF_Y = 30 var PLATNO_X = 1000 var PLATNO_Y = 560 //Rozmer kresliciho platna-------------------------------------------------------------------------- var paper = Raphael(PLATNO_REF_X, PLATNO_REF_Y, PLATNO_X, PLATNO_Y); //Kola --------------------------------------------------------------------------------------------- var prumer = XXX //zde potrebuji hodnotu ze selectu!!! var c1 = paper.circle ( 200, 300, prumer); //zde ji pouziji var path = [] path.push(["M200,300,L"+(prumer+200)+","+(prumer+300)]); //zde ji take pouziji a jeste ve spouste dalsich geometrickych entit... var BasicAxis = paper.path(path); </script> </html> |
||
_es Profil |
#10 · Zasláno: 14. 7. 2014, 22:28:04
MilanX:
No ale všetok kód medzi <script> a </script> musíš aj tak obaliť do funkcie, aby si ho mohol volať opakovane a nie len pri načítaní stránky. Takže si daj do tej obaľovacej funkcie parameter podľa rady v [#8] a máš to:
<select name="menu" onchange="vykresli(+this.value)"> <optgroup label="Kolo:"> <option value=400>Kolo male</option> <option value=500>Kolo velke</option> </optgroup> </select> <script> function vykresli(prumer){ Tu daj kód z [#9] okrem 36. riadku } vykresli(400); </script> |
||
MilanX Profil |
#11 · Zasláno: 14. 7. 2014, 23:32:15
Tak mi to začíná fungovat :-). To jsem netušil že to musím celé obalit do funkce, staticky se mi totiž geometrické entity vykreslovaly korektně, tak jsem v tom neviděl problém... Ještě bych měl dotaz. Při výběru nové hodnoty v selectu se mi vykreslí nová geometrie, ale stará zůstane, jak bych měl zajistit to, aby byla vykreslena vždy pouze ta aktuální?
|
||
_es Profil |
#12 · Zasláno: 15. 7. 2014, 00:07:29
MilanX:
„staticky se mi totiž geometrické entity vykreslovaly korektně, tak jsem v tom neviděl problém...“ To nebolo „staticky“, ale vo fáze načítania stránky - potom skript skončí a ako inak ho chceš využiť znovu bez toho, aby ti z neho zostali nejaké definované funkcie? „...aby byla vykreslena vždy pouze ta aktuální?“ To už si nájdi v dokumentácii JS knižnice, čo používaš. |
||
MilanX Profil |
#13 · Zasláno: 15. 7. 2014, 00:12:38
Moc díky za rady, zas jsem se posunul o kousek dál.
|
||
Časová prodleva: 10 let
|
0