Avatar billede dennisbjorn Juniormester
11. januar 2012 - 21:10 Der er 11 kommentarer og
1 løsning

Dynamisk tilføjelse af input felter i form

Til en simpel form med kun et input felt, søger jeg en funktion, hvor brugerne kan tilføje x antal input felter efter behov.
Dvs. at funktionen skal tilføje en ny række med et ekstra input felt hver gang den kaldes.

Når formen submittes, må de indtastede data fra x antal input felter gerne postes som en kommasepareret streng.
Avatar billede olebole Juniormester
11. januar 2012 - 22:22 #1
<ole>

Det er ikke helt så enkelt, da IE før version 9 havde en meget sær måde at forholde sig til denne del af DOM specifikationen på.

Du kan skrive denne funktion:

var createElm = (function(doc){
    try {
        var o = doc.createElement("<input type='text'>");
        createStd = o = null;
        return createIE;
    }
    catch(e) {
        createIE = null;
        return createStd;
    }
    function createIE(sTag, oOpts) {
        var a = [], i = 0;
        for (x in oOpts) {
            if (x=="css") a[i++] = 'style="'+oOpts[x]+'"';
            else a[i++] = x+'="'+oOpts[x]+'"';
        }
        return doc.createElement("<"+sTag+(a.length>0?" "+a.join(" "):"")+">"+("input,link,img,area,".indexOf(sTag+",")?"":"</"+sTag+">"));
    }
    function createStd(sTag, oOpts) {
        var x, elm = doc.createElement(sTag);
        for (x in oOpts) {
            if (x=="css") elm.style.cssText = oOpts[x];
            if (x=="class") elm.className = oOpts[x];
            else elm.setAttribute(x, oOpts[x]);
        }
        return elm;
    }
})(document);

Så vil du kunne oprette et INPUT element og indsætte det i elementet med id="fooBar" med følgende kode:

var oOpts = {
    "type": "text",
    "name": "fornavn",
    "value": "Skriv dit navn",
    "class": "my-input-class",
    "css": "width:200px;background:#ff0"
};
var elm = createElm("input" oOpts);
document.getElementById("fooBar").appendChild(elm);


/mvh
</bole>
Avatar billede olebole Juniormester
11. januar 2012 - 22:24 #2
Der vil ikke være forskel på disse elementer og alle andre formelementer på siden. De vil alle blive postet på helt sædvanligvis og kan derfor på serveren findes ved hjælp af de name attributter, du har oprettet felterne med
Avatar billede dennisbjorn Juniormester
12. januar 2012 - 07:50 #3
Hej Ole - tak for dit script.
Jeg har ikke styr på hvordan jeg skal kalde funktionen - vil du hjælpe med at lave det færdig?


<html>
<head>

<script type="text/javascript">


var createElm = (function(doc){
    try {
        var o = doc.createElement("<input type='text'>");
        createStd = o = null;
        return createIE;
    }
    catch(e) {
        createIE = null;
        return createStd;
    }
    function createIE(sTag, oOpts) {
        var a = [], i = 0;
        for (x in oOpts) {
            if (x=="css") a[i++] = 'style="'+oOpts[x]+'"';
            else a[i++] = x+'="'+oOpts[x]+'"';
        }
        return doc.createElement("<"+sTag+(a.length>0?" "+a.join(" "):"")+">"+("input,link,img,area,".indexOf(sTag+",")?"":"</"+sTag+">"));
    }
    function createStd(sTag, oOpts) {
        var x, elm = doc.createElement(sTag);
        for (x in oOpts) {
            if (x=="css") elm.style.cssText = oOpts[x];
            if (x=="class") elm.className = oOpts[x];
            else elm.setAttribute(x, oOpts[x]);
        }
        return elm;
    }
})(document);



var oOpts = {
    "type": "text",
    "name": "fornavn",
    "value": "Skriv dit navn",
    "class": "my-input-class",
    "css": "width:200px;background:#ff0"
};
var elm = createElm("input" oOpts);
document.getElementById("fooBar").appendChild(elm);


</script>
 
</head>
<body>

<form name="brugerform" method="post" action="resultat.asp">
<div id="fooBar">
  <input type="text" name="nc">
</div>
<input type="button" onClick="doc();" value="tilføj felt">
<input type="submit" value="submit">
</form>

</body>
</html>
Avatar billede olebole Juniormester
12. januar 2012 - 15:50 #4
function doc() {
    var oOpts = {
        "type": "text",
        "name": "fornavn",
        "value": "Skriv dit navn",
        "class": "my-input-class",
        "css": "width:200px;background:#ff0"
    };
    var elm = createElm("input" oOpts);
    document.getElementById("fooBar").appendChild(elm);
}
Avatar billede dennisbjorn Juniormester
12. januar 2012 - 16:29 #5
kan desværre ikke få det til at virke...
Avatar billede olebole Juniormester
12. januar 2012 - 16:59 #6
Hvad sker der - og hvad sker der ikke? Udløses der JS-fejl? Tjekker du overhovedet for JS-fejl? At det ikke virker, er ikke en melding, der kan bruges til meget  =)

Nu har jeg selv testet og fundet ud af, at scriptet udløser en JS-fejl. Det er du nødt til altid at tjekke for, når du webudvikler. Der manglede et komma:

function doc() {
    var oOpts = {
        "type": "text",
        "name": "fornavn",
        "value": "Skriv dit navn",
        "class": "my-input-class",
        "css": "width:200px;background:#ff0"
    };
    var elm = createElm("input", oOpts); // <-- Her
    document.getElementById("fooBar").appendChild(elm);
}
Avatar billede dennisbjorn Juniormester
12. januar 2012 - 19:16 #7
Hej,

Jeg er ikke erfaren med JavaScript - så tak for tippet - jeg har nu aktiveret scriptfejl i min browser (IE9).

Har rettet kommafejlen, men der sker intet når man klikker på knappen 'tilføj felt'.

Får denne script-fejl:

Værdien af egenskaben 'appendChild' kan ikke hentes: Objektet er null eller er ikke defineret
Linje: 46
Tegn: 1
Kode: 0
Avatar billede olebole Juniormester
12. januar 2012 - 20:13 #8
<script type="text/javascript">
var createElm = (function(doc){
    try {
        var o = doc.createElement("<input type='text'>");
        createStd = o = null;
        return createIE;
    }
    catch(e) {
        createIE = null;
        return createStd;
    }
    function createIE(sTag, oOpts) {
        var a = [], i = 0;
        for (x in oOpts) {
            if (x=="css") a[i++] = 'style="'+oOpts[x]+'"';
            else a[i++] = x+'="'+oOpts[x]+'"';
        }
        return doc.createElement("<"+sTag+(a.length>0?" "+a.join(" "):"")+">"+("input,link,img,area,".indexOf(sTag+",")?"":"</"+sTag+">"));
    }
    function createStd(sTag, oOpts) {
        var x, elm = doc.createElement(sTag);
        for (x in oOpts) {
            if (x=="css") elm.style.cssText = oOpts[x];
            if (x=="class") elm.className = oOpts[x];
            else elm.setAttribute(x, oOpts[x]);
        }
        return elm;
    }
})(document);

function doc() {
    var oOpts = {
        "type": "text",
        "name": "fornavn",
        "value": "Skriv dit navn",
        "class": "my-input-class",
        "css": "width:200px;background:#ff0"
    };
    var elm = createElm("input", oOpts);
    document.getElementById("fooBar").appendChild(elm);
}
</script>

<form name="brugerform" method="post" action="resultat.asp">
<div id="fooBar">
  <input type="text" name="nc">
</div>
<div>
  <input type="button" onClick="doc();" value="tilføj felt">
  <input type="submit" value="submit">
</div>
</form>
Avatar billede dennisbjorn Juniormester
12. januar 2012 - 20:28 #9
Super - mange tak!

Smid et svar for point.
Avatar billede dennisbjorn Juniormester
12. januar 2012 - 20:50 #10
En detalje; kan jeg indsætte et linebreat et sted, således at inputfelter kommer under hinanden og ikke på en linie?

Ellers er det helt perfekt..:-)
Avatar billede olebole Juniormester
12. januar 2012 - 22:48 #11
Du kunne jo lægge elementerne ind i et DIV:

function doc() {
    var oOpts = {
        "type": "text",
        "name": "fornavn",
        "value": "Skriv dit navn",
        "class": "my-input-class",
        "css": "width:200px;background:#ff0"
    };
    var elm = createElm("div");
    var elm2 = createElm("input", oOpts);
    elm.appendChild(elm2);
    document.getElementById("fooBar").appendChild(elm);
}

Jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes. Men tak for tilbudet  =)
Avatar billede dennisbjorn Juniormester
13. januar 2012 - 07:15 #12
smukt - mange tak for hjælpen :-))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester