Autor Zpráva
Daniel Vrbík
Profil
Ahoj,
potřeboval bych poradit. Mám seznam s checkboxy a potřeboval bych, aby když zaškrtnu checkbox tak se mi na jiné místo v kódu zapsala hodnota, vztahující se k tomu checkboxu. Analogicky samozřejmě aby když checkbox odškrtnu, tak se zase vymazala. Asi by to nemělo být těžké, ale přiznám se, že jsem začátečník a nějak mi to už nemyslí. Tady je část kódu, kterou mám:

//tahle funkce řeší jiné věci v tom zaškrtávácím seznamu a do ní to potřebuju naroubovat
function zaskrtavani (vrstva1, vrstva2, vrstva3, vrstva4, vrstva5){
    var vrstva1, vrstva2, vrstva3=document.getElementById(vrstva3).style;
    if (vrstva2=='turist') {vrstva2=turist;}
    if (vrstva2=='cyklo') {vrstva2=cyklo;}
    if (vrstva2=='podklad') {vrstva2=podklad;}
    if (vrstva2=='body2') {vrstva2=body2; vrstva4=control2; vrstva5=infoControls2; zapnuta="'dp:body2'"} //hodnotu proměnné zapnuta potřebuju zapisovat, když se zaklikne checkbox
    if (vrstva2=='body3') {vrstva2=body3; vrstva4=control3; vrstva5=infoControls3; zapnuta="'dp:body3'"}
    if (vrstva2=='body4') {vrstva2=body4; vrstva4=control4; vrstva5=infoControls4; zapnuta="'dp:body4WGS84'"}
    if (vrstva2=='body5') {vrstva2=body5; vrstva4=control5; vrstva5=infoControls5; zapnuta="'dp:body5'"}
    if (vrstva2=='body6') {vrstva2=body6; vrstva4=control6; vrstva5=infoControls6; zapnuta="'dp:body6'"}
    if (vrstva2=='body7') {vrstva2=body7; vrstva4=control7; vrstva5=infoControls7; zapnuta="'dp:body7'"}
        
    if (vrstva1.checked)
    {
    map.addLayer(vrstva2);
    map.setLayerZIndex(podklad, 4);
    map.setLayerZIndex(turist, 5);
    map.setLayerZIndex(cyklo, 6);
    map.setLayerZIndex(uzemi, 7);
    map.setLayerZIndex(body2, 7);
    map.setLayerZIndex(body3, 7);
    map.setLayerZIndex(body4, 7);
    map.setLayerZIndex(body5, 7);
    map.setLayerZIndex(body6, 7);
    map.setLayerZIndex(body7, 7);
    map.setLayerZIndex(hover, 8);
    map.setLayerZIndex(select, 8);
    vrstva3.display='block';
    vrstva4.activate();
    vrstva5.click.activate();
    
    }
    else
    {
    map.removeLayer(vrstva2, false);
    map.setLayerZIndex(podklad, 4);
    map.setLayerZIndex(turist, 5);
    map.setLayerZIndex(cyklo, 6);
    map.setLayerZIndex(uzemi, 7);
    map.setLayerZIndex(body2, 7);
    map.setLayerZIndex(body3, 7);
    map.setLayerZIndex(body4, 7);
    map.setLayerZIndex(body5, 7);
    map.setLayerZIndex(body6, 7);
    map.setLayerZIndex(body7, 7);
    map.setLayerZIndex(hover, 8);
    map.setLayerZIndex(select, 8);
    vrstva3.display='none';
    vrstva4.deactivate();
    vrstva5.click.deactivate();
    
    }
}

infoControls2 = {
            click: new OpenLayers.Control.WMSGetFeatureInfo({
                url: 'http://localhost:8080/geoserver/wms', 
                title: 'Identify features by clicking',
                layers:[body2, body3, body4, body5, body6, body7],
        vendorParams: {"QUERY_LAYERS": [<!-- sem je potřebuju vložit, aby to vypadalo zhruba nějak takhle-->'dp:body2', 'dp:body3','dp:body4WGS84','dp:body5','dp:body6','dp:body7']},
        queryVisible: true})
        };

Napadlo mě použítí pole, ale nějak jsem se v tom nedokázal zorientovat. Budu rád za každou radu, už jsem docela zoufalý.

Díky
Dan

Moderátor panther: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
_es
Profil
Daniel Vrbík:
aby když zaškrtnu checkbox
1) https://developer.mozilla.org/en/DOM/element.onclick
2) vlastnosť checked elementu typu checkbox.

tak se mi na jiné místo v kódu zapsala hodnota
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=106539#document-write
Daniel Vrbík
Profil
_es:
nějak asi nerozumím jak mi to pomůže. To "aby když zaškrtnu/odškrtnu checkbox" řeší právě část
if (vrstva1.checked){}else{}
, ale nevím jak pak tu hodnotu proměnné zapnuta zapsat do řádku
vendorParams: {"QUERY_LAYERS": [<!-- sem je potřebuju vložit, aby to vypadalo zhruba nějak takhle: 'dp:body2', 'dp:body3','dp:body4WGS84','dp:body5','dp:body6','dp:body7'-->]},

ne jako alert nebo něco jiného.

Abych vysvětlil na co to potřebuju, tak pomocí checkboxů se zapínají vrstvy v mapě a spouští se další funkcionalita, která je dostupná pouze pro ty zaplé vrstvy a neřeší ty vyplé.

Dan
_es
Profil
Daniel Vrbík:
infoControls2 je definovaná ako globálna vlastnosť, nie ako premenná, premenná sa definuje pomocou príkazu var, viď tu.

sem je potřebuju vložit
Ako by si tam chcel niečo vkladať? Ak to chceš zmeniť, uprav to manuálne v kóde. Alebo daj namiesto toho konštantného objektu premennú a inde ju môžeš upraviť. No na to, čo chceš, ti bude asi treba zavolať metódu OpenLayers.Control.WMSGetFeatureInfo ako konštruktor s novým parametrom a ak chceš mať vrátenú hodnotu uloženú, tak znovu zavolať kód na riadkoch 56 až 63.
Daniel Vrbík
Profil
_es:
tak chyba je asi na mojí straně. Před samotnou funkcí zaskrtavani je toto:
var body2, body3, body4, body5, body6, body7, cyklo, turist, gphy, sat, podklad, uzemi, hover, select, control2, control3, control4, control5, control6, control7, infoControls2, infoControls3, infoControls4, infoControls5, infoControls6, infoControls7, zapnuta, zapnute;

tedy pokud to dobře chápu, tak infocontrols2 je globální proměnná

nerozumím tomu, co znamená "uprav to manuálně v kódu", kdyby mi to stačilo, tak to tak už mám, ale já potřebuju, aby se mi to měnilo podle toho, co je zaplé. Jo, nějakou proměnnou, ale jak? Na to se ptám. Já to možná vysvětluju blbě, já nevím. To infocontrols2 tam třeba vůbec nemusí být, to se může vypisovat třeba do alertu.

Dan
_es
Profil
Daniel Vrbík:
tedy pokud to dobře chápu, tak infocontrols2 je globální proměnná
Áno, potom je, ale to je aj tak len vedľajšie.

Jo, nějakou proměnnou, ale jak? Na to se ptám. Já to možná vysvětluju blbě, já nevím.
Ty asi vôbec nepotrebuješ nejakú zmenu nejakého riadku kódu, či zmenu nejakej premennej, ale aby sa po nejakej akcii, niečo so stránkou stalo. Niečo, čo má na starosti nejaké rozšírenie, ktoré na stránku sťahuješ. Tak teda zavolaj pri tej akcii tú metódu toho rozšírenia OpenLayers.Control.WMSGetFeatureInfo, ktorá má tú zmenu zabezpečiť, so správnym argumentom. Ak chceš len zmeniť, čo sa má stať až po kliknutí na niečo (asi, keďže sa vlastnosť objektu volá click), tak daj do volania tej metódy globálnu premennú, teda nie niečo {voľačo}, ale NázovPremennej, kde bude v tej premennej ten objekt, ktorý si hocikedy upravíš.
Daniel Vrbík
Profil
_es:
ta akce, která má se stránkou něco udělat je právě to zaškrtnutí checkboxu, to píšu už na začátku. Já to zkusím vysvětlit úplně od začátku. Takže, jedná se o mapu, ta mapa je tvořená kromě jiných také z šesti bodových vrstev ('dp:body2', 'dp:body3','dp:body4WGS84','dp:body5','dp:body6','dp:body7'), které jdou zapnout a vypnout. To se provádí zaškrtnutím checkboxu a na to navázaným věcem. Každý bod té vrstvy nese nějakou informaci, kterou bych chtěl vypsat do nějakého divu ve chvíli, když na něj kliknu, to je zajištěno právě pomocí toho infocontrols. V něm je definováno, kterých vrstev se to kliknutí bude týkat pomocí řádku
vendorParams: {"QUERY_LAYERS": []},

pokud bych do hranatých závorek nic nenapsal, bude se to týkat pouze jedné zapnuté vrstvy, tedy pokud dojde k překryvu 3 bodů, kde každý bude v jiné vrstvě, tak po kliknutí se mi vypíše hodnota do divu jenom jednoho bodu a ne všech tří. Naopak, když bych do hranatých závorek napsal všech šest vrstev, potom se mi budou na kliknutí vypisovat informace i z vrstev, které nebudou zapnuté, tedy nebudou vidět, tedy je to nežádoucí. Proto mě napadlo, že bych mohl do těch hranatých závorek vložit proměnnou, jejíž hodnota by se měnila podle toho, které vrstvy jsou zapnuté, tedy jednou by tam bylo třeba 'dp:body2', 'dp:body3', při zapnutí další vrstvy zase 'dp:body2', 'dp:body3','dp:body6', při vypnutí některé z těchto by z ní zase zmizela a při vypnutých všech vrstvách by tam nebylo nic. Tím bych vyřešil problém zobrazování hodnot z vrstev, které nejsou zapnuté a zároveň by mi to vypsalo hodnoty všech bodů, které jsou vidět a jsou pod sebou (na stejné souřadnici).

To, že je někde v tom kódu napsáno click je nějaký relikt, to tam vůbec být nemusí, tam může být napsáno rovnou new OpenLayers.Control.WMSGetFeatureInfo({...

Já doufám, že teď už jsem snad vysvětlil co vlastně potřebuju :)

Dan
_es
Profil
Daniel Vrbík:
Nebudem kvôli tebe študovať aplikačné rozhranie nejakej JS knižnice, to si naštuduj ty. Ako a do akých premenných si uložíš rôzne pomocné dáta záleží od teba. Základný princíp je jednoduchý:
document.getElementById("idCheckboxu").onclick=function(){
if(this.checked){Checkbox je zaškrtnutý, niečo sprav, prípadne aj spusti nejaké metódy JS knižnice}
else{Checkbox nie je zaškrtnutý, niečo sprav, prípadne aj spusti nejaké metódy JS knižnice}
}
Z toho kódu tipujem, že ide o metódu OpenLayers.Control.WMSGetFeatureInfo, no možno treba zavolať aj inú metódu, naštuduj si rozhranie tej knižnice.
Bez poriadnej úvahy nad kódom to asi nepôjde.
Daniel Vrbík
Profil
_es:
základní princip chápu, ale v tom dalším jsme se asi nepochopili. Rozhodně jsem po nikom nechtěl, aby studoval JS knihovnu kterou používám. I tak díky za snahu.

Dan
_es
Profil
Daniel Vrbík:
ale v tom dalším jsme se asi nepochopili.
V čom ďalšom? Potrebuješ „nakopnúť“ v tomto?:
var o={vlastnost1:hodnota1, pole1:[p1, p2, p3]}
o.vlastnost1=ináHodnota;
o.pole1[0]=ináHodnota; //zmena prvého prvku poľa v objekte
NejakýObjekt.VnorenýObjekt.f(o) // zavolanie metódy f s argumentom-objektom o
Daniel Vrbík
Profil
_es:
tak já to zkusím ještě jinak, protože z toho v čem mě "nakopáváš" moc rozumný nejsem (ve smyslu mého problému). Zapomeň na kód napsaný v prvním příspěvku, ber tenhle:
<script>
var zapnuta, zapnuteVrstvy

function zaskrtavani (vrstva1, vrstva2){
	var vrstva1, vrstva2;
	if (vrstva2=='body2') {zapnuta="a"}
	if (vrstva2=='body3') {zapnuta="b"}
	if (vrstva2=='body4') {zapnuta="c"}
	if (vrstva2=='body5') {zapnuta="d"}
	if (vrstva2=='body6') {zapnuta="e"}
	if (vrstva2=='body7') {zapnuta="f"}
		
	if (vrstva1.checked)
	{
	zapnuteVrstvy=//tady potřebuju, aby se mi zapisovalo: a, b, c, d, e, f podle toho, které checkboxy jsou zrovna checked
	alert(zapnuteVrstvy);
	}
	else
	{
	zapnuteVrstvy=//tady potřebuju, aby se mi zapisovalo: a, b, c, d, e, f podle toho, které checkboxy jsou zrovna checked
	alert(zapnuteVrstvy);
	}
}
</script>

<body>
<form name="vrstvy">
<ul>
        <li>
	<input type="checkbox" name="body2" id="body2" onClick="zaskrtavani(document.forms.vrstvy.body2, 'body2');">
	</li>
	<li>
	<input type="checkbox" name="body3" id="body3" onClick="zaskrtavani(document.forms.vrstvy.body3, 'body3');">
	</li>
        <li>
	<input type="checkbox" name="body4" id="body4"  onClick="zaskrtavani(document.forms.vrstvy.body4, 'body4');">
	</li>
	<li>
	<input type="checkbox" name="body5" id="body5" onClick="zaskrtavani(document.forms.vrstvy.body5, 'body5');">
	</li>
	<li>
	<input type="checkbox" name="body6" id="body6" onClick="zaskrtavani(document.forms.vrstvy.body6, 'body6');">
	</li>
	<li>
	<input type="checkbox" name="body7" id="body7" onClick="zaskrtavani(document.forms.vrstvy.body7, 'body7');">
	</li>
</ul>
</form>
</body>


takže když bude checkbox body2 checked v alertu se objeví "a", když k tomu potom zaškrtnu body5 v alertu bude "a, d", když pak vyškrtnu body2, bude alert obsahovat "d" a tak podobně. Myslím si, že základní princip zaškrtnutí a odškrtnutí checkboxu mám správně, ale nevím jestli je správně toto:
if (vrstva2=='body2') {zapnuta="a"}
	if (vrstva2=='body3') {zapnuta="b"}
	if (vrstva2=='body4') {zapnuta="c"}
	if (vrstva2=='body5') {zapnuta="d"}
	if (vrstva2=='body6') {zapnuta="e"}
	if (vrstva2=='body7') {zapnuta="f"}

jestli by tam nemělo být spíš zapnuta1, zapnuta2 atd. nebo dokonce úplně něco jiného. Prostě nevím jak zapsat ty unikátní hodnoty které jsou pod každým checkboxem do jedné proměnné podle toho, které ty checkboxy jsou zaškrtnuté.

Asi potřebuju nakopnout v úplných základech, já nevím.

Dan
_es
Profil
Daniel Vrbík:
> function zaskrtavani (vrstva1, vrstva2){
> var vrstva1, vrstva2;
Druhý riadok tejto časti kódu je nezmyselný, argumenty funkcie sú automaticky lokálnymi premennými tej funkcie.
Máš tam veľa nezmyslov, skús si o JS niečo viac naštudovať.
Ak tvrdíš, že základnému princípu v [#8] rozumieš, prečo ho nepoužiješ?:
onClick="zaskrtavani(document.forms.vrstvy.body2, 'body2');"
Na aký element sa kliklo, zistíš oveľa jednoduchšie z objektu this, ak je funkcia priradená tak ako v [#8] v JS kóde, nie v HTML atribúte. Načo tam predávaš dva argumenty, nepotrebuješ ani jeden, tak ako v [#8]. Prečo nezisťuješ vlastnosť checked aj pri iných checkboxoch, ktorých stav chceš zistiť, než na ktorý sa kliklo? Aj keď, možno to ani nie treba, veď inak ako kliknutím na príslušný checkbox a teda aj spustením funkcie sa nedá ten element prepnúť. Porozmýšľaj, čo bude v premennej zapnuta po overení všetkých podmienok - ako chceš z tej premennej zistiť stav všetkých tých checkboxov?
Daniel Vrbík
Profil
_es:
ano vím, druhý řádek tam být nemusí, ale pokud vím, tak ničemu nevadí, ale ok. Pokud tomu dobře rozumím, tak všechno co mi vytýkáš je jenom o jiném stylu zápisu (netvrdím, že ten můj je nějak hezký, ale je to jen jiný způsob). Pokud použiju tento kód #8, tak potom ho tam musím mít tolikrát, kolik mám checkboxů, pro každé id jeden nebo ne? Vlastnost checked nezjišťuju u jiných proto, že nejsou při načtení stránky zaškrtnuté a popravdě nevím, jak pomocí kódu výš zjistit které jsou zaškrtnuté. A to jak z proměnné zaškrtnutá zjistit stav checkboxů já právě nevím, proto se ptám.
_es
Profil
Daniel Vrbík:
Pokud použiju tento kód #8, tak potom ho tam musím mít tolikrát, kolik mám checkboxů, pro každé id jeden nebo ne?
Nie nemusíš:
document.getElementById("idPrvehoCheckboxu").onclick=document.getElementById("idDruhehoCheckboxu").onclick=...function(){...

nevím, jak pomocí kódu výš zjistit které jsou zaškrtnuté.
Ale veď už v [#8] si mal nepriamo zistenie objektu elementu checkboxu (document.getElementById("idCheckboxu")), takže ak máš objekt, tak predsa nie je problém použiť jeho vlastnosť checked, teda napríklad document.getElementById("idCheckboxu").checked
Daniel Vrbík
Profil
_es:
ok, tuhle fintu jsem neznal. Nicméně mi to asi pořád nedochází, nešlo by to ukázat v nějakém širším kontextu, třeba na tom kódu [#11] (jakože na tom, že mám nějaký seznam checkboxů)? Protože já pořád nějak nevím, jak teda pomocí tohoto dostanu do nějaké proměnné všechny ty hodnoty co tam potřebuju.
_es
Profil
Daniel Vrbík:
Protože já pořád nějak nevím, jak teda pomocí tohoto dostanu do nějaké proměnné všechny ty hodnoty co tam potřebuju.
Akej premennej? Aké hodnoty? Naštuduj si, ako sa pracuje v JS s objektmi (Object), či s poliami (Array), nie je to nič zložité, a ukladaj si do nich, čo len chceš, trebárs aj stav formulárových elementov. Trebárs to môže byť aj objekt v takom tvare v akom ho posielaš do tej metódy v prvom kóde.

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:

0