webForumDet fria alternativet

Hjälp med formulär

JavaScript

12 svar · 935 visningar · startad av Wasted

Medlem sedan okt. 20067 inlägg
Frågan#1

Hej,

Jag skulle behöva lite hjälp med ett formulär som jag håller på att bygga. Så här är tanken att slutprodukten ska se ut:

http://img269.imageshack.us/img269/5268/pictureli.jpg

Jag tror ni förstår hur scriptet är tänkt att fungera, när man trycker på "Add person" så läggs dyker en ny textinput upp och samma sak med "Add children". Här är koden:

<html>
<head>

<script language="javascript">

var counter = 0;
var person1counter = 0;
var person2counter = 0;
var person3counter = 0;

function addperson() {
counter++;
document.getElementById('divq').innerHTML += "Person: " + counter + " <br><input type='text' name='q" + counter + "' value='' /> <br><div id='divaq" + counter + "'></div><input type='button' onclick='addchild" + counter + "()' value='Add child'> <br><br>";
}

function addchild1() {
person1counter++;
document.getElementById('divaq1').innerHTML += "Child: " + person1counter + " <input type='text' name='q1alt" + person1counter + "'><br>";
}

function addchild2() {
person2counter++;
document.getElementById('divaq2').innerHTML += "Child: " + person2counter + " <input type='text' name='q2alt" + person2counter + "'><br>";
}

function addchild3() {
person3counter++;
document.getElementById('divaq3').innerHTML += "Child: " + person3counter + " <input type='text' name='q3alt" + person3counter + "'><br>";
}
</script>

</head>
<body>

<form name="form">
<input type="button" onclick="addperson()" value="Add person" />
</form>
<div id="divq">

</div>
</body>
</html>

Det jag behöver hjälp med är följande:

1. När jag lägger till en ny person så resetas/töms informationen som jag har knappat in i dom tidigare inputsen. Hur ska jag göra för att förhindra det?

2. Hur ska jag göra för att radera senast tillagda input?

Kan tillägga att jag är nybörjare på Javascript.

/Wasted

Medlem sedan okt. 20067 inlägg
#2

Problem nummer 2 är nu löst. Däremot så har jag inte en aning om hur jag ska lyckas lösa det första. Någon som har några idéer?

Medlem sedan juni 20031 837 inlägg
#3

Det beror nog på att du skriver om html-koden för fälten när du gör

document.getElementById('divq').innerHTML += .....
Medlem sedan okt. 20067 inlägg
#4

The_Hulk skrev:

Det beror nog på att du skriver om html-koden för fälten när du gör

document.getElementById('divq').innerHTML += .....

Okej, kan jag undvika det på något sätt eller måste jag börja om från början och göra på något helt annat sätt? :(

Medlem sedan juni 20031 837 inlägg
#5

Du får skapa html-elementen dynamiskt med hjälp av document.createElement och sedan lägga till dem på rätt ställe med obj.appendChild(newObj)

du kan läsa lite mer om det här: http://www.dustindiaz.com/add-and-remove-html-elements-dynamically-with-javascript/

Medlem sedan juni 20019 519 inlägg
#6
<html>
	<head>
	<script language="javascript">
		var counter = 0;
		
		function format(str) {
			for(i = 1; i < arguments.length; i++) {
				var n = new RegExp("\\{" + (i-1) + "\\}","img");
				str = str.replace(n, arguments[i]);
			}
			return str;
		}

		function addperson() {
			counter++;
			var Design = "<label for='q{0}'>Person #{0}:</label><input type='text' name='q{0}' id='q{0}' /><div id='child_q_{0}'></div><input type='button' onclick='addchild(this)' value='Add child' />";

			var childElement = document.createElement("div");
			childElement.id = "q_"+counter;
			childElement.innerHTML = format(Design, counter);
			document.getElementById('divq').appendChild(childElement);
		}
		function addchild(el) {
			var childDesign = "Child: {0} <input type='text' name='{1}_alt_{0}'>";
			var div = el.parentNode;
			var childDiv = document.getElementById("child_" + div.id);

			var childElement = document.createElement("div");
			var length = childDiv.children.length+1;
			childElement.id = "item_" + (+childDiv.children.length)+1;
			childElement.innerHTML = format(childDesign, length, div.id);
			childDiv.appendChild(childElement);
		}

	</script>
</head>
<body>
<form name="form">
	<input type="button" onclick="addperson()" value="Add person" />
	<div id="divq"></div>
</form>

</body>
</html>

Eller så skriver du det med jquery.

Medlem sedan juni 20031 837 inlägg
#7

voigtann1 skrev:

Eller så skriver du det med jquery.

Vad är det för skillnad mot mitt svar förutom att du orkade skriva hela lösningen?

Medlem sedan juni 20019 519 inlägg
#8

The_Hulk skrev:

Vad är det för skillnad mot mitt svar förutom att du orkade skriva hela lösningen?

absolut inget, jag har suttit på lunchen och gjorde detta, sen att jag inte uppdaterat sidan är en bara en lathet av mig.

Dock med jquery så kan slipper du appendChild() metoderna då de inte är de snabbaste att jobba mot DOM:en på en del webbläsare.

Medlem sedan juni 20031 837 inlägg
#9

Ahh, trodde du menade att ditt exempel var skrivet med jQuery men nu förstår jag hur du menade. Det var därför jag inte riktigt fick ihop det :)

Medlem sedan juni 20019 519 inlägg
#10

hehe, nej jquery koden hade nog varit ännu mindre (min kod är ett snabbt exempel) men den fungera på ett ungefär och har inga begränsningar på hur många "parents" som kommer i formuläret.

Medlem sedan okt. 20067 inlägg
#11

Tack så mycket för hjälpen, fungerar alldeles utmärkt! :)

Jag förstår dock inte riktigt hur koden fungerar (jag är nybörjare på JavaScript), framförallt inte första delen och alla {0}:

		function format(str) {
			for(i = 1; i < arguments.length; i++) {
				var n = new RegExp("\\{" + (i-1) + "\\}","img");
				str = str.replace(n, arguments[i]);
			}
			return str;
		}

Jag antar att det är någon form av räknare?

Medlem sedan juni 20019 519 inlägg
#12

str = format("Hej {0}! Välkommen till {1}", "Wasted", "webForum");

str kommer då bli: "Hej Wasted! Välkommen till webForum"

Det är bara en funktion för att enklare kunna skriva texter utan att bryta strängen för att infoga texter.

Medlem sedan okt. 20067 inlägg
#13

Okej, tack!

Jag har ytterligare en fråga (förhoppningsvis den sista... ;)), jag skulle under varje person vilja lägga till en knapp som tar bort senast tillagda barn. Jag har lagt till en knapp som tar bort senast tillagda person med följande kod:

	function removePerson() {
		var r = document.getElementById("q_" + counter + "");
		r.parentNode.removeChild(r);
		counter--;
                }

Jag plockar alltså bort hela "person-div:en" eller vad man ska kalla den. Med barnen så är jag inte alls lika säker på hur jag ska gå tillväga. Några idéer? :)

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)