webForumDet fria alternativet

Slider i JavaScript, hjälp med bugg

6 svar · 415 visningar · startad av jazzil

jazzilMedlem sedan maj 2003151 inlägg
#1

Tjena .. jag har byggt en slider i JavaScript och den har några buggar som jag skulle vilja ha hjälp med att fåbort.

Sidan med slidern

Om man nu tar min slider och dra den mot vänster så stannar den på noll men dra du vidare med musen så hoppar den till baka till där den började asså på 20 och gör jag så att den stannar kvar på noll även om man gå på minus tal?

window.onload = function(){ 
	ArrowDiv = document.getElementById(ArrowName); 
	TextField = document.getElementById(TextFieldToFill);
	HiddenTField = document.getElementById(HiddenField);
	laVal = replaceSubstring(ArrowDiv.style.left,"px","");//Replace substring är bara en funtion som är säkrare att anända än Regular expression ditot.
}
document.onmouseup = function(){
	active = false; 
	var RounderValue = replaceSubstring(ArrowDiv.style.left,"px", "");
	Round20(RounderValue);
}
document.onmousedown = function(e){
    var evt;
    if (typeof(evt = window.event) != "undefined" && evt.srcElement == ArrowDiv){
	active = true;
	lpos   = evt.screenX;
	curL   = ArrowDiv.offsetLeft;
    }
    else if (typeof (evt = e) != "undefined" && e.target == ArrowDiv){
	active = true;
	lpos   = evt.pageX;
	curL   = ArrowDiv.offsetLeft;
    }
}
document.onmousemove = function(e){
    var evt;
    output = null;
    if (active)
    {
		if (typeof(evt = window.event) != "undefined")
		{
			if(curL + (evt.screenX - lpos) <= Values[0]-1){
				ArrowDiv.style.left = "0";
			}
			else if(curL + (evt.screenX - lpos) >= (Values[Values.length-1]+1)){
				ArrowDiv.style.left = Values[Values.Length-1] + "px";
			}
			else{
				ArrowDiv.style.left = curL + (evt.screenX - lpos);
			}
   	 	}
		else if (typeof(evt = e) != "undefined")
		{
			if(curL + (evt.pageX - lpos) <= Values[0]-1){
				ArrowDiv.style.left = "0";
			}
			else if(curL + (evt.pageX - lpos) >= (Values[Values.length-1]+1)){
				ArrowDiv.style.left = Values[Values.Length-1] + "px";
			}
			else{
				ArrowDiv.style.left = curL + (evt.pageX - lpos) + "px";
			}
    	}
    	output = replaceSubstring(ArrowDiv.style.left,"px", "");   	
		Glue(output);
	}
}
function TextFiller(value)
{
	for(var i=0;i<(Values.length+1);i++)
	{
		if(value == Values[i])
		{
			TextField.value = ValueNames[i];
			HVal = i+1;
			HiddenTField.value = HVal;
			break;
		}
	}
}
function Glue(value)
{ 
    var i = 0;
	while(i < Values[Values.length-1]+1)
	{
		if(value >= (i-AttachPixels) && value <= (i+AttachPixels)){
			ArrowDiv.style.left = i + "px";
			laVal = value;
			TextFiller(i);
			break;						
		}
		i=i+20;	
	}
}
//Kan tänkamig att det är här som det är fel
function Round20(CurrVal)
{ 
	var topNr,botNr,NextVal;
	if(CurrVal > laVal){
		NextVal = parseInt(laVal)+20;
		topNr = NextVal-CurrVal;
		botNr = CurrVal-laVal;
		if(topNr > botNr){
		Glue(laVal);
		}
		else{
		Glue(NextVal);
		}
	}
	else{
		NextVal = parseInt(laVal)-20;
		topNr = laVal-CurrVal;
		botNr = CurrVal-NextVal;
		if(topNr < botNr){
			Glue(laVal)
		}
		else{
		Glue(NextVal);
		}
	}
}

Tacksam för alla svar!
Får passa på att ursäkta att koden är dåligt komenterad.

//Kim Sevandersson

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Tja!

I onmousemove() finns några felaktigheter. Du försöker accessera en Length-egenskap hos Array som givetvis inte finns ;) (hint: length). I samma händelsehanterare skulle jag även tilldela left-egenskapen "0px" istället för "0".

Hoppas att detta hjälper.

:)

jazzilMedlem sedan maj 2003151 inlägg
#3

Ska prova tack!

jazzilMedlem sedan maj 2003151 inlägg
#4

Det fixade lite Felmeddelande som jag har kliat mig i huvvet för innan, tack för det :)
Men det värkar som om den buggen jag talar om bara existerar i FireFox

@ndersMedlem sedan juni 200032 969 inlägg
#5

Hos mig (jag kör IE6), verkar den fungera, men själva "markören" försvinner när man börjar dra i den. :(

Peter SMedlem sedan dec. 20025 483 inlägg
#6

Ser koden ut enligt nedan då?

document.onmousemove = function(e){
    var evt;
    output = null;
    if (active)
    {
		if (typeof(evt = window.event) != "undefined")
		{
			if(curL + (evt.screenX - lpos) <= Values[0]-1){
				ArrowDiv.style.left = "0";
			}
			else if(curL + (evt.screenX - lpos) >= (Values[Values.length-1]+1)){
				ArrowDiv.style.left = Values[Values.length-1] + "px";
			}
			else{
				ArrowDiv.style.left = curL + (evt.screenX - lpos);
			}
   	 	}
		else if (typeof(evt = e) != "undefined")
		{
			if(curL + (evt.pageX - lpos) <= Values[0]-1){
				ArrowDiv.style.left = "0px";
			}
			else if(curL + (evt.pageX - lpos) >= (Values[Values.length-1]+1)){
				ArrowDiv.style.left = Values[Values.length-1] + "px";
			}
			else{
				ArrowDiv.style.left = curL + (evt.pageX - lpos) + "px";
			}
    	}
    	output = replaceSubstring(ArrowDiv.style.left,"px", "");   	
		Glue(output);
	}
}

Om jag sparar ned din sida och testar den lokalt med dessa ändringar, uppstår inte problemet som du beskriver längre.

:)

jazzilMedlem sedan maj 2003151 inlägg
#7

Jag hade ändrat rätt, kanske javascriptet var chachat eller ngt..

aja .. tackar för all hjälp.

128 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)