webForumDet fria alternativet

Göra om funktion

JavaScript

2 svar · 429 visningar · startad av Asa

Medlem sedan dec. 20011 860 inlägg
Frågan#1

Har en funktion som funkar bra men vill lägga till ett inputfält där man fyller i antal och när man klickar på KÖP skall texten som är i knappen KÖP sant värdet i inputfältet antal skickas till textarearutan som det gör som standard. Går detta?

Ska stå
Bokens namn - 1st
Bokens namn - 1st
Bokens namn - 1st
Bokens namn - 1st

<script type="text/javascript">

var cPos,
    fObj,
    ieC = Boolean(document.selection && document.selection.createRange);

function OrderForm(str) {
    if (ieC) {
	if (typeof cPos != "undefined")
	    cPos.text = str + (cPos.text.charAt(cPos.text.length - 1) == '') ? '' : '';
	else
	    fObj.value = str + '';
    }

    else if (typeof window.HTMLTextAreaElement != "undefined")
	fObj.value = fObj.value.substring(0, fObj.selectionStart) + str + '' + fObj.value.substring(fObj.selectionEnd);

    else fObj.value += str + '';
}

function sC() {
    cPos = document.selection.createRange().duplicate();
}

window.onload = function() {
    fObj = document.forms["vbform"].elements["message"];

    if (ieC) {
	fObj.onclick  = function() { sC(); }
	fObj.onkeyup  = function() { sC(); }
	fObj.onselect = function() { sC(); }
    }
}

</script>

<form name="vbform">
	<input type="text" name="antal1" value="1"> <input type="button" value=" K&Ouml;P bok 1 " class="Button" onclick="OrderForm('Bok namn 1\n'); return false;"><br />
	<input type="text" name="antal2" value="1"> <input type="button" value=" K&Ouml;P bok 2 " class="Button" onclick="OrderForm('Bok namn 2\n'); return false;"><br />
	<textarea cols="20" rows="5" name="message"></textarea>
</form>
Medlem sedan aug. 20039 340 inlägg
#2

Din kod funkar bara i IE, och jag är osäker på vad den faktiskt gör, så jag tog mig friheten att skriva ny kod, som förhoppningsvis gör det du vill och lite till.
När du trycker på en av köp-knapparna kollas först att man skrivit in ett giltigt antal. Sedan letar koden upp rätt rad i textboxen och petar in rätt antal böcker. Om boken redan finns i listan ersätts den med rätt antal. Skriver man noll tas oken bort ur listan. Allt som kan tänkas stå sist på raden bevaras, så man kan lämna kommentarer för varje bok.
Koden bör funka i "alla" webbläsare.

Notera dock att koden i knapparna är lite annorlunda, varje knapp måste skickaa med rätt name-attribut för motsvarande antalsruta. Dessutom tog jag bort return, då det är helt onödigt för button-knappar. (Till skillnad från submit-knappar och länkar)

Om det inte funkar som du vill, känn dig fri att klaga. :)

<script type="text/javascript">
function OrderForm(bookTitle, numName) {
	var mObj = document.getElementsByName('message')[0];
	var numBooks = document.getElementsByName(numName)[0].value;

	// En gegga av tecken som kollar om värdet är numeriskt.
	if (!/^\d*$/.test(numBooks)){
		alert('Vänligen ange ett giltigt antal böcker för ' + bookTitle + '!');
		return;
	}

	// Hämta värdet i message och dela upp det i rader
	var message = mObj.value.split(/\n+/g);

	// Gå igenom varje rad
	for(var i = 0; i<message.length; i++){
		var row = message[i];	// Plocka ut en rad

		// Kolla om raden matchar med den boken vi letar efter
		if(row.indexOf(bookTitle)==0){
			// Om användaren har angivit noll böcker eller lämnat rutan tom...
			if (numBooks<1){
				message[i] = '';	// Ta bort boken (Blankraden tas hand om i nästa sats)

				// Sätt ihop hela textmassan och spara
				mObj.value = message.join('\n').replace(/\n+/, '\n').replace(/^\n*/, '');

				return;	// Hittades boken är vi klara och kan smita ut bakvägen
			}else{
				// Användaren har angivit ett nummer större än noll
				var restOfLine = row.substr(bookTitle.length);	// Resten av raden

				// Här gör vi det jobbigt för oss och bevarar vad som kan råka
				// stå efter antalet, så man kan lämna kommentarer
				restOfLine = restOfLine.replace(/^\s*-*\s*\d+st\s*/, '');

				// Bygg ihop raden igen
				message[i] = bookTitle + ' - '+ numBooks +  'st ' + restOfLine;

				// Sätt ihop hela textmassan och spara
				mObj.value = message.join('\n').replace(/\n+/, '\n').replace(/^\n*/, '');

				return;	// Hittades boken är vi klara och kan smita ut bakvägen
			}
		}
	}
	message.push(bookTitle + ' - '+ numBooks +  'st');	// Lägg till boken

	// Sätt ihop hela textmassan och spara
	mObj.value = message.join('\n').replace(/\n+/, '\n').replace(/^\n*/, '');
}
</script>

<form name="vbform">
	<input type="text" name="antal1" value="1"> <input type="button" value=" K&Ouml;P bok 1 " class="Button" onclick="OrderForm('Bok namn 1', 'antal1'); "><br />
	<input type="text" name="antal2" value="1"> <input type="button" value=" K&Ouml;P bok 2 " class="Button" onclick="OrderForm('Bok namn 2', 'antal2'); "><br />
	<input type="text" name="antal3" value="1"> <input type="button" value=" K&Ouml;P bok 3 " class="Button" onclick="OrderForm('Bok namn 3', 'antal3'); "><br />
	<textarea cols="20" rows="5" name="message"></textarea>
</form>
Medlem sedan dec. 20011 860 inlägg
#3

Perfekt! Precis det jag behövde. Supertack till dig :)

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