webForumDet fria alternativet

Ändra färg på input-ruta - har lite problem med det

JavaScript

20 svar · 810 visningar · startad av haider

Medlem sedan jan. 2003956 inlägg
Frågan#1

Tjena,

Jag har ett script enligt följande.
function changecolor(id)
{
document.getElementById(id).style.backgroundColor="#FF8282";
}
</script>

Följande skriver jag för att trigga igång scriptet:
onKeyDown="changecolor(this.id)" onChange="changecolor(this.id)"

Problemet är följande; Även om jag trycker ctrl, tex för att kopiera (ctrl c förstås) så blir den röd. Jag vill att den bara ska reagera när jag verkligen skriver in något.
Ligger problemet i onChange eller?

Medlem sedan aug. 20068 090 inlägg
#2

onfocus?

(kör du xhtml ska det väl heller inte finnas några stora bokstäver, va?)

Medlem sedan juni 20019 519 inlägg
#3
function changecolor(id)
{
	var el = document.getElementById(id);
	if(el.value.length>0)
	{
		document.getElementById(id).style.backgroundColor="#FF8282";
	}
}

Om längden är större än 0 i textboxen borde väl fungera?

Medlem sedan jan. 2003956 inlägg
#4

Hmm, vad menar du nu Danne?
Med stora bokstäver menar du att man ska skriva onchange och inte onChange eller?

Och hur kommer onfocus in i bilden? Menar du att när <input> hamnar i fokus så ska den se om något ändras? Kan testa, men kommer den att skilja en knapptryckning om det är ctrl eller något annat?

Medlem sedan aug. 20068 090 inlägg
#5

haider skrev:

Hmm, vad menar du nu Danne?
Med stora bokstäver menar du att man ska skriva onchange och inte onChange eller?

Och hur kommer onfocus in i bilden? Menar du att när <input> hamnar i fokus så ska den se om något ändras? Kan testa, men kommer den att skilja en knapptryckning om det är ctrl eller något annat?

Öh... jag är nog ute o hojar. :r
Kan inte mycket om js alls.
Jo alltså: kör man xhtml så ska det inte finnas några stora bokstäver alls i källkoden (onFocus ska vara onfoucs) men det kanske inte webbläsarna bryr sig om...

Och att javascriptet ska exekveras när <input> hamnar i focus alltså.

Men jag fattade nog ganska fel och ber om ursäkt ifall mitt svammel snarare leder till förvirring än hjälp....

Medlem sedan sep. 2004828 inlägg
#6

du får helt enkelt reagera på onkeydown (eller onkeyup) och kolla vilken tangent som tryckts innan du ändrar färg

Medlem sedan mars 20041 505 inlägg
#7

Räcker det inte med onchange? Det triggas ju varje gång värdet ändras, dvs. när man skriver något.

Medlem sedan sep. 2004828 inlägg
#8

Nej, bara när rutan tappar fokus

Medlem sedan mars 20041 505 inlägg
#9

Ja ser man på, det trodde jag inte. :e

The change event occurs when a control loses the input focus and its value has been modified since gaining focus.

http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents

Medlem sedan jan. 2003956 inlägg
#10

Danne: det är lugnt. Ibland behövs såna inlägg för att få en att undra om man själv är tokig eller nåt ;)

Stefan: Ditt förslag är nog det enda tänkbara. Men då spelar det alltså ingen roll om man använder onkeydown eller onchange eller vilket som, bara javascriptet gör kontrollen om hurvida det är ett tecken man knappade in eller om det var ctrl eller något annat som inte är ett tecken.

voigtann1: såg att jag hade missat ditt inlägg.
Vad menar du med "Om längden är större än 0 ..."?
Om textrutan innehåller mer än 0 tecken? Den innehåller ju en mängd tecken, men om jag bara trycker ctrl så blir den röd. Så det är ju snarare att kolla hur långt tecknet som man knappade i är (det är ju 1, och större än 0).

alltså: kan man i kontrollen utföra en check om det man knappade in är 1 tecken långt eller 0? För då har vi lösningen :)

Medlem sedan jan. 2003956 inlägg
#11

änione else som kan svaret? specifikt detta med att kolla om inmatningen är större än 0 tecken.

Medlem sedan juni 20008 205 inlägg
#12

Utnyttja det faktum att Javascript är dynamiskt och hitta på ett eget fält för att se om värdet ändrats sen sist. Typ:

function changecolor(elmt){
    if (elmt.value != elmt.previousValue){
        elmt.style.backgroundColor="#FF8282";
        elmt.previousValue = elmt.value;
    }
}

<input ... onkeypress="changecolor(this)" />
Medlem sedan jan. 2003956 inlägg
#13

aha, detta torde vara det awesomaste sättet o lösa det på :D

Medlem sedan jan. 2003956 inlägg
#14

Kanoners!
For the record: Kan du ge fler exempel på var man kan använda sig av detta? Vid första anblicken trodde jag mig kunna komma på massor av användningsområden, men kom inte på fler saker än just fält som man ändrar och vill kolla strax efter.
Eller är det just då bara?

Medlem sedan juni 20008 205 inlägg
#15

Det är användbart varje gång man vill ge ett objekt funktionalitet som inte finns i dess ursprungliga design. Användbart för... nästan allt :) Bara fantasin sätter gränser.

Medlem sedan jan. 2003956 inlägg
#16

Låt oss lägga fantasin åt sidan, för då kommer jag bara avslöja mig med att inte ha så mycket javascript fantasi.

Den tycks inte känna av backspace.
Om jag shift-markerar ett stycke och trycker backspace så torde den väl ha reagerat på att innehållet inte är detsamma?

Medlem sedan jan. 2003956 inlägg
#17

haider skrev:

Låt oss lägga fantasin åt sidan, för då kommer jag bara avslöja mig med att inte ha så mycket javascript fantasi.

Den tycks inte känna av backspace.
Om jag shift-markerar ett stycke och trycker backspace så torde den väl ha reagerat på att innehållet inte är detsamma?

provade med onkeydown och det tycks funka nu

edit: fel av mig att skriva innan jag har testat ordentligt. onkeydown tycks lyssna på alt-knappen konstigt nog. Borde kanske ta paus, har ju ont i huvudet o allt...

Medlem sedan jan. 2003956 inlägg
#18

Så här gjorde jag nu.
Jag utgick från Spangos script och skrev en till function:

function changecolor_bs(elmt){
if(window.event.keyCode == 8){
	elmt.style.backgroundColor="#FF8282";
	}
}

Ovanstående är endast för backspace igenkänning.
Så utöver onkeypress, kör jag även en onkeydown="changecolor_bs(this)" som alltså är kompatibel med backspaces vilket onkeypress inte var.

Är det rätt så? kan man skriva en snyggare kod?

Medlem sedan jan. 2003956 inlägg
#19

Kan man kombinera både changecolor och changecolor_bs så att det blir en och samma funktion och som man kör både genom onkeypress och onkeydown (för backspace igenkänning)?
Eller måste man göra som jag gjorde här, det vill säga två funktioner?

Medlem sedan aug. 20039 340 inlägg
#20

Du kan inte (enkelt) återanvända samma funktion för båda sakerna, men ignet hinrar förstås att du flyttar själva färgbytet till en separat funktion, så du bara behöver redigera färgvärdet på ett ställe.

<sxcript>
function changeColor(elmt){
	elmt.style.backgroundColor = "#FF8282";
}

function keyDownHandler(elmt, args){
	var ev = window.event || args[0];

	if(window.event.keyCode == 8)
		changeColor(elmt);
}

function keyPressHandler(elmt){
    if (elmt.value != elmt.previousValue){
        changeColor(elmt);
        elmt.previousValue = elmt.value;
    }
}
</script>

Dock tror jag att följande är vad du egentligen vill göra:

<script>
function changeHandler(elmt){
	if (elmt.origValue == elmt.value)
		elmt.style.backgroundColor = "";
	else
		elmt.style.backgroundColor = "#FF8282";

}
function setOrigValue(){
	var elmt = document.getElementById("field");

	elmt.origValue = elmt.value;
}
</script>
<body onload="setOrigValue();">
<input id="field" onkeyup="changeHandler(this)" onchange="changeHandler(this)" />

Denna kod sparar originalvärdet och jämför redigeringar med det. Alltså, om man redigerar tillbaka fältet till originalvärdet så kommer färgen försvinna.

263 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)