Autor Zpráva
MilanX
Profil
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
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
_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
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
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>
tak se hodnota načte pouze při načtení stránky, při změně selectu již alert "mlčí".
_es
Profil
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)" ...>
alebo
<script>
objektSelectu.onchange = function(){alert(this.value)};
</script>
Akosi stále nerozumiem, kde je problém, alebo čo „riešiš“.
MilanX
Profil
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
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
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
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
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
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
Moc díky za rady, zas jsem se posunul o kousek dál.

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: