Just nu i M3-nätverket
Gå till innehåll

Välj ur listbox och skicka värdet vidare


Fangprod

Rekommendera Poster

Har en listbox där man väljer veckodag. Men jag får inte funktionen SetDay att fungera riktigt, kanske är helt ute och cyklar

 

<FORM name="ddlist">

Välj dag<BR>

<select name="valjdag" onChange="SetDay()">

<option value="mandag">Måndag</option>

<option value="tisdag">Tisdag</option>

<option value="onsdag">Onsdag</option>

<option value="torsdag">Torsdag</option>

<option value="fredag">Fredag</option>

</select>

</FORM>

 

function SetDay() {

if (document.ddlist.valjdag.options_ [document.ddlist.valjdag.selectedIndex].value = "Onsdag")

{

alert("Onsdag")

{

if (document.ddlist.valjdag.options_[document.ddlist.valjdag.selectedIndex].value = "Torsdag")

{

alert("Torsdag")

 

Länk till kommentar
Dela på andra webbplatser

Kontroll av likhet görs med == inte = i Javascript, fast jag ser inte behovet av någon test i just ditt exempel. För att förkorta ditt script lite och dessutom se till att det följer standard, så ändra till:

 

<select name="valjdag" onChange="SetDay([color="#0000ff"]this[/color])">

 

function SetDay(oSel) {
sDayValue=oSel.options[oSel.selectedIndex].value;
sDayText=oSel.options[oSel.selectedIndex].text;
alert(sDayText);
}

 

Länk till kommentar
Dela på andra webbplatser

Jag bygger vidare här på det ni, Anjuna Moon, gav mig innan, tack för det.

 

I koden som jag skrev innan vill jag styra att olika lager, i detta fall kartlager, ska visas beroende på vilken dag jag väljer.

Man väljer alltså veckodag först, sedan ska de styra vilka lager som man kan tända och släcka med följande checkboxar.

 

 

<FORM name="f">

<input type="checkbox" name="check1" onClick="showlayer()">Vägar

<br><input type="checkbox" name="check2" onClick="showLayer_()">Byggnader

</FORM>

 

function showLayer(obj,lname){

 

parent.mapplet.document.applets[0].getExplorer().setLayerVisibility_(lname,obj.checked)

}

 

För Vägar och Byggnader finns det alltså olika lager för olika dagar.

Tacksam för lite tips på hur man gör.

 

Länk till kommentar
Dela på andra webbplatser

Jag behöver lite mer info. Gissar jag rätt att du vill att ex. kryssrutan Vägar skall anropa showLayer med olika parametrar beroende på vilken dag som är vald? Eller är det så att beroende på vilken dag man väljer så skall olika kryssrutor visas?

 

Länk till kommentar
Dela på andra webbplatser

Jag kan tyvärr inte ge någon kod men tankegången borde väl vara följande.

 

 

Om användaren klickar i checkbox 1 (och ENBART 1) ska lagret vägar (eller vad det heter) visas medan alla andra lager döljs.

 

Om användaren klickar i checkbox 2 ska lagret byggnader visas och alla andra andra döljas.

 

 

 

Om användaren skulle klicka i 1 +2 ska de visas medan alla andra döljs.

 

 

Fråga:

Vad fyller valet av veckodag för funktion? Är det olika vägar och byggnader bereonde på vilken dag det är?

Låter ju helsjukt. jepp på torsdag spränger vi Stora hotellet till grunden medan vi till på fredagen byggt upp det igen ;)

 

Länk till kommentar
Dela på andra webbplatser

Det är det första du skriver som stämmer: "kryssrutan Vägar skall anropa showLayer med olika parametrar beroende på vilken dag som är vald"

 

Länk till kommentar
Dela på andra webbplatser

Ok, titta på det här exemplet.

 

[log]

<html><head>
<title>Untitled</title>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
   <!--
	var nDay=0;
	var Roads=new Array('RoadsMonday','RoadsTuesday');
   	function SelectDay(oSel) {
		nDay=oSel.options[oSel.selectedIndex].value;

	}
   	function ShowLayer(oChk){
		parent.mapplet.document.applets[0].getExplorer().setLayerVisibility_(Roads[nDay],oChk.checked);
	}
//-->
   </SCRIPT>
</head><body>

<select onchange="SelectDay(this);">
<option selected="selected" value="0">Måndag</option>
<option value="1">Tisdag</option>
</select>

<input type="checkbox" onClick="ShowLayer(this);">Vägar<br>
</body></html>

[/log]

 

I arrayen Roads lägger du in namnen på de lager som i appleten representerar veckans olika vägar (vad nu det betyder =). Har du nu valt Måndag och kryssar i rutan så skickas alltså lagernamnet 'RoadsMonday' till appleten.

 

Länk till kommentar
Dela på andra webbplatser

Tackar! Funkar jättebra!

 

Kan ju avslöja att det handlar om nåt så roligt som sophantering där det ska vara möjligt att se vilka sträckor sopbilarna kör beroende på dag

 

 

 

Länk till kommentar
Dela på andra webbplatser

Jag fortsätter här, känns som jag är ute på djupt vatten.

 

I ovanstående kod som Anjuna Moon skrivit ihop åt mig, hur ska det se ut om man har en kryssruta ibockad och sedan byter dag i listboxen. Då ska lagret för den andra dagen visas och det föregående lagret ska släckas. Jag har testat med bl.a. if-sats och även testat med VBScript, men tror att jag helt enkelt är för dålig.

Tack på förhand

 

Länk till kommentar
Dela på andra webbplatser

Då ska lagret för den andra dagen visas och det föregående lagret ska släckas

Pratar du om html-lager nu eller är det fortfarande lagren i applet:en du syftar på (i det senare fallet vet jag ju inte vilka metoder du skapat i applet:en för att släcka lager).

 

Om det gäller html-lager, så kan du utöka det tidigare scriptexemplet till följande:

 

[log]

<html><head>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
var nDay=0;
var Roads=new Array('RoadsMonday','RoadsTuesday');
var arrLayers=new Array('lyrMon','lyrTus');
var oActiveLayer=null;
function SelectDay(oSel) {
nDay=oSel.options[oSel.selectedIndex].value;
if (oActiveLayer) {
	oActiveLayer.style.display='none';
}
oActiveLayer=document.getElementById(arrLayers[nDay]);
oActiveLayer.style.display='';
}
function ShowLayer(oChk){
parent.mapplet.document.applets[0].getExplorer().setLayerVisibility_(Roads[nDay],oChk.checked);
}
//-->
</SCRIPT>
</head><body onload="oActiveLayer=document.getElementById(arrLayers[0]);">
<div id="lyrMon">Lager måndag</div>
<div style="display:none;" id="lyrTus">Lager tisdag</div>
<select onchange="SelectDay(this);">
<option selected="selected" value="0">Måndag</option>
<option value="1">Tisdag</option>
</select>

<input type="checkbox" onClick="ShowLayer(this);">Vägar<br>
</body></html>

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Det är lagren i applet:en jag menar. Från början syns de inte på kartan men med hjälp av kryssrutan tänder och släcker man dessa olika kartlager. Dessa kartlager finns i applet:en och har default-läge släckta

 

Denna funktion tänder och släcker lagrena

function ShowLayer(oChk){

parent.mapplet.document.applets[0].getExplorer().setLayerVis

ibility_(Roads[nDay],oChk.checked);

 

 

 

Länk till kommentar
Dela på andra webbplatser

Ok, lite knepigare, jag antar följande:

- Du har fler än en kryssruta

- Om en eller fler kryssrutor är valda och du byter dag skall de gamla lagren som är tända med dessa släckas, samtidigt som alla redan ikryssade rutor skall fortsätta vara ikryssade och respektive nya lager tändas?

 

Tänker jag rätt då?

 

 

[inlägget ändrat 2005-11-23 11:30:19 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Antar att du försvann på lunch, så jag skrev ihop ett exempel enligt de antagningar jag gjorde. Koden finns formatterad här: http://e307e86e23a5bae9.paste.se/

 

EDIT: Lägg märke till den inte helt snygga namnsättningen av checkboxarnas id, orkade inte lösa det på annat sätt.

 

Missa heller inte det som står i BODY-taggen samt att jag satt ett id på FORM-taggen (Detta av att jag envetet vägrar att referera till forms via document.forms[x] =)

[inlägget ändrat 2005-11-23 12:02:37 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Jepp, du har tänkt rätt och jag har testat koden. Vad jag inte riktigt fick att fungera är när man byter dag så är de gamla lagren fortfarande tända och de nya tänds också, alltså det bygger på.

 

Länk till kommentar
Dela på andra webbplatser

Hm, det var konstigt. Har faktiskt testat just detta. Släng in lite alerts i koden för att testa värden, ex. precis innan HideLayer körs.

 

Länk till kommentar
Dela på andra webbplatser

Satte in alert efter HideLayer och före ShowLayer så fungerar det perfekt, men tar jag bort alert så verka den inte köra HideLayer

 

Länk till kommentar
Dela på andra webbplatser

Jag tänkte snarare att du gör en

 

alert(arrActiveLayers[nId])
HideLayer(arrActiveLayers[nId]);

 

för att kontrollera att det som skickas till HideLayer verkligen är namnet på det tidigare tända lagret.

 

Länk till kommentar
Dela på andra webbplatser

Jo då, den visar rätt namn för det tidigare tända lagret, men det ligger fortfarande kvar i kartbilden tillsammans med det nya tända lagret

 

Länk till kommentar
Dela på andra webbplatser

  • 2 veckor senare...

Några frågor till har dykt upp angående koden du(Anjuna Moon) gjorde åt mig för nån vecka sedan, vet inte om du kollar av dessa inlägg mer. (För er andra finns koden ett par inlägg upp)

 

I koden är den ena kryssrutan döpt till Vägar och den andra till Annat. Säg att man har andra kartlager som ska tändas och släckas med "Annat" kryssrutan (AnnatMonday, AnnatTuesday,...) då borde man väl skapa en till Array, var Annat = new Array('AnnatMonday', 'AnnatTuesday') eller går det att lägga i samma Array och hänvisa två lager(RoadsMonday och AnnatMonday till samma dag i selectboxen?

Om man lägger det i två olika Arrays hur ser det då ut i funktionen ShowLayer?

 

/Marcus

 

Länk till kommentar
Dela på andra webbplatser

Du kan göra det på båda sätt, men för tydighetens skull så föreslår jag att du använder dig av en ny array, Annat. Ändra ShowLayer till:

 

function ShowLayer(oChk){
nId=parseInt(oChk.id);
switch (nId) {
case 1:
  sActiveLayer=Roads[nDay];
 break;
case 2:
  sActiveLayer=Annat[nDay];
break;
}
arrActiveLayers[nId]=sActiveLayer;
parent.mapplet.document.applets[0].getExplorer().setLayerVisibility_(sActiveLayer,oChk.checked);
}

 

Länk till kommentar
Dela på andra webbplatser

Koden fungerar bra förutom att kartlagrena i appleten inte uppdateras så som det är tänkt, men förmodligen är det något i appleten.

Det är när jag har kryssat i Roads eller Annat eller båda två för en dag och byter dag i selectboxen som den får svårt att uppdatera kartlagrena, den tänder de nya kartlagrena men släcker inte de gamla.

Men om jag sätter in några alerts på vissa ställen, markerade i koden nedan, så tänds och släcks lagrena precis som det ska. Finns det något knep istället för att använda alerts(vilket inte är snyggt, blir så många knapptryckningar), t ex någon slags refresh eller reload eller timer som gör att uppdateringarna går lite i olika steg. Känns precis som appleten behöver lite andrum för att fixa alla kommandon hit och dit :)

 

 

<script LANGUAGE="JavaScript" TYPE="text/javascript">

<!--

var nDay=0;

var Roads=new Array('RoadsMonday','RoadsTuesday','RoadsWednesday','RoadsThursday','RoadsFriday');

var Annat=new Array('AnnatMonday','AnnatTuesday','AnnatWednesday','AnnatThursday','AnnatFriday');

var arrActiveLayers=new Array();

var oFrm;

 

function SelectDay(oSel) {

nDay=oSel.options[oSel.selectedIndex].value;

oEls=oFrm.elements;

for (i=0;i<oEls.length;i++) {

o=oEls;

if (o.type=='checkbox'){

if (o.checked) {

nId=parseInt(o.id);

HideLayer(arrActiveLayers[nId]);

ShowLayer(o);

}

}

}

}

 

function HideLayer(lyr) {

 

här!--> alert(lyr)

parent.mapplet.document.applets[0].getExplorer().setLayerVisibility(lyr,false);

 

}

 

function ShowLayer(oChk){

nId=parseInt(oChk.id);

switch (nId) {

case 1:

sActiveLayer=Roads[nDay];

här!--> alert(sActiveLayer)

break;

case 2:

sActiveLayer=Annat[nDay];

här!--> alert(sActiveLayer)

break;

}

arrActiveLayers[nId]=sActiveLayer;

parent.mapplet.document.applets[0].getExplorer().setLayerVisibility(sActiveLayer,oChk.checked);

}

//-->

</script>

 

Länk till kommentar
Dela på andra webbplatser

Jo, det verkar ju helt klart som det är appleten som inte hinner med. Visst kan man göra delays, frågan är ju bara hur långa dessa skall vara. En delay som funkar hos dig kanske inte räcker på andra plattformar. Men du kan få ett förslag iallafall på denna lösning. Återkommer strax

 

Länk till kommentar
Dela på andra webbplatser

Ok, lägg till följande globala variabler (ändra nDelayMS till ett högre värde om det behövs):

 

var oChk;
var nDelayMS=500;

 

och ändra funktionen SelectDay till:

 

[log]

function SelectDay(oSel) {
nDay=oSel.options[oSel.selectedIndex].value;
oEls=oFrm.elements;
for (i=0;i<oEls.length;i++) {
	oChk=oEls[i];
	if (oChk.type=='checkbox'){
		if (oChk.checked) {
			nId=parseInt(oChk.id);
			HideLayer(arrActiveLayers[nId]);
			setTimeout(ShowLayer,nDelayMS);
		}
	}
}
}

[/log]

 

samt ta bort parametern till ShowLayer

function ShowLayer(){

 

Länk till kommentar
Dela på andra webbplatser

Jag tog bort alertsen i koden i förra inlägget och la dem här istället, och det fungerar också bra, det blir lite färre knapptryckningar också. Om det kan ha någon betydelse för var man lägger delays. Ligger alertsen här påverkar det ju inte när man trycker i och ur kryssrutorna manuellt.

 

function Selectday(oSel)

 

nDay=oSel.options[oSel.selectedIndex].value;

oEls=oFrm.elements;

for (i=0;i<oEls.length;i++) {

o=oEls;

if (o.type=='checkbox'){

if (o.checked) {

nId=parseInt(o.id);

här-->alert("Innan HideLayer " +nId)

HideLayer(arrActiveLayers[nId]);

här-->alert("Innan ShowLayer " +nId)

ShowLayer(o);

 

 

Länk till kommentar
Dela på andra webbplatser

Min gissning är att appleten behöver lite tid efter att anropet i HideLayer har gjorts, innan man får anropa påslagning av andra lager. Det var därför jag satte timeout:en på just ShowLayer, så den väntar 500ms innan den anropas.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...