Avatar billede jokkejensen Novice
08. februar 2007 - 11:03 Der er 15 kommentarer og
2 løsninger

tilføje/redigere dom -ligge et div omkring element og span under

Hey.

Jeg har et script til at validere nogle tekst input felter på en form.

Jeg kunne godt tænke mig at smide et div omkring og et span under disse input felter.

nogen der lige kan sætte mig igang, gerne et færdigt eksempel på hvordan:

<input type="text" id="tekstFelt" />

forvandles til :

<div>
<input type="text" /><br />
<span>&nbsp;</span>
</div>

Med et btnclick.

På forhånd tak.
Avatar billede anri Novice
08. februar 2007 - 11:53 #1
Forstår ikke het spørgsmålet..  Vil du ændre det beskrevne på klient-siden via javascript?
Avatar billede phliplip Nybegynder
08. februar 2007 - 12:18 #2
Hmm..

Måske det havde været lettere for dig at ligge en <div> rundt om <input> til at starte med og så ændre innerHTML på det div!?

<div id="mitUnikkeId"><input type="text" id="tekstFelt" /></div>

function changeDiv() {
  var elm = document.getElementById('mitUnikkeId');
  elm.innerHTML = '<div><input type="text" /><br /><span>&nbsp;</span></div>';
}
Avatar billede phliplip Nybegynder
08. februar 2007 - 12:18 #3
Selvfølgelig skal du lige sørge for at trække value fra input feltet med over i det input du laver i innerHTML!
Avatar billede phliplip Nybegynder
08. februar 2007 - 12:20 #4
Eller hov..

function changeDiv() {
  var elm = document.getElementById('mitUnikkeId');
  elm.innerHTML = '<div>'+elm.innerHTML+'<br /><span>&nbsp;</span></div>';
}

Sådan måske.. ved ikke om den så automatisk får den indtastede value med. Men ellers kan det også sagtens fikses!
Avatar billede jokkejensen Novice
08. februar 2007 - 13:25 #5
Jeg vil gerne have et svar på min beskrivelse.

Jeg vil ligge noget omkring et allerede eksisterende input felt.

/JJ
Avatar billede jokkejensen Novice
08. februar 2007 - 13:32 #6
grundet det skal være dynamisk, og noget udviklerene i huset ikke konstant skal overveje, endvidere giver det lidt flottere markup i mine øjne.
Avatar billede jokkejensen Novice
08. februar 2007 - 14:46 #7
anri >> ja jeg ønsker at lave noget validering..

Dette validering skal ændre et input fejt fra:

<input type="text" />

til

<div>
<input type="text" /><br />
<span>&nbsp;</span>
</div>

På klient siden.
Avatar billede jokkejensen Novice
08. februar 2007 - 14:46 #8
hvis det fejler..
Avatar billede olebole Juniormester
08. februar 2007 - 15:42 #9
<ole>

Én metode kunne være at oprette elementerne og så skifte input-elementet ud på følgende måde:

var o = document.getElementById("tekstFelt");
var oo = o.cloneNode(true);
var oDv = document.createElement("div");
var oBr = document.createElement("br");
var oSp = document.createElement("span");
oSp.appendChild(document,createTextNode(" "));
oo.attributes.removeNamedItem("id");
oDv.appendChild(oo);
oDv.appendChild(oBr);
oDv.appendChild(oSp);
o.parentNode.replaceChild(oDv, o);

/mvh
</bole>
Avatar billede olebole Juniormester
08. februar 2007 - 15:46 #10
phliplip >> Din løsning (08/02-2007 12:18:10) overskriver elementerne, hvorfor alt, der måtte være knyttet til elementerne (f.eks. event-handlers, sat med script/DOM), går tabt.
Når du overskriver et element - ved at overskrive dets parent's innerHTML - er der ikke længere tale om det samme element ... blot et, der på overfladen er magen til  ;o)

- og så har innerHTML aldrig været en valid property - og er helt ubrugelig under XHTML  =)
Avatar billede phliplip Nybegynder
08. februar 2007 - 17:02 #11
Okidoki!

Så blev jeg klogere i dag også ;)
Avatar billede jokkejensen Novice
09. februar 2007 - 09:36 #12
Endnu engang tak ole.

Kyler du et svar...

Tak for din tid phliplip !

/JJ
Avatar billede olebole Juniormester
09. februar 2007 - 14:26 #13
Efter at have tænkt over problematikken, ville jeg nu nok selv vælge en anden fremgangsmåde. For det første er der ikke nogen grund til at bruge et span (inline-element) og et br-element. Du kan blot bruge et div i stedet for de to  ;o)

Hvis ikke der er tale om en masse felter i formen, kunne det måske endda være smartere at lægge ud med en HTML, der ser sådan ud:

<div>
<input id="tekstfelt" type="text">
<div style="display:none">&nbsp;</div>
</div>

- så kunne du, når du validerer - og der opstår en fejl - skrive noget à la (vælg selv, hvordan det skal se ud):

var o = document.getElementById("tekstfelt");
var css = o.parentNode.style;
css.background = "ffff00";
css.border = "1px solid red";
css.padding = "10px";
var oo = o.parentNode.getElementsByTagName("div")[0];
oo.firstChild.nodeValue = "En fejl-tekst";
oo.style.display = "block";

- og det modsatte, hvis der ikke findes fejl ved elementet.
Laves det OOP'et, kan det gøres endnu mere 'sexy'  ;o)
Avatar billede phliplip Nybegynder
09. februar 2007 - 14:36 #14
ole: Nu vi er ved det, ville man opnå noget performance mæssigt ved undgå at bruge innerHTML og bruge appendChild etc etc i stedet? Især hvis vi snakker om at det skal køres en hel del gange!
Avatar billede jokkejensen Novice
11. februar 2007 - 21:24 #15
Problemet er at ...

Jeg sidder som frontend udvikler i et "større" web-konsulent hus.. For at formindske mit arbejde mindst muligt har jeg brug for en "outtathebox" løsning.

Så jeg ikke skal bede udviklerne om at skrive ex:
<div>
<input id="tekstfelt" type="text">
<div style="display:none">&nbsp;</div>
</div>


men var <input id="tekstfelt" type="text" />

Vi arbejder efterhånden i en del af de større danske CMS systemer (synkron, dynamicweb, composite - og skal til at igang med siteCore) , og det er 10000% lettere hvis jeg bare har den her JS fil jeg kan smække på/ flytte rundt/ opdatere alene som er uafhængig af CMS'et.

Derfor ønsker jeg bare at knytte det på tekstfeltet, og jeg ønsker ikke at formode der ligger noget omkring.

du skriver : "Efter at have tænkt over problematikken" <- mener du hermed det første forslag ikke er optimalt ?

/JJ
Avatar billede umle-keera Nybegynder
12. februar 2007 - 16:42 #16
function inputWrapper(objHTMLElement) {
    var div = document.createElement('div');
    var span = document.createElement('span');
    span.appendChild(document.createTextNode(' '));
    div.appendChild(span);
    objHTMLElement.parentNode.insertBefore(div, objHTMLElement);
    div.insertBefore(objHTMLElement, span);
}


inputWrapper køres så med hvert input felt du ønsker, så du skal selv lige loope igennem alle, eller køre det på de specifikke felter hvor det skal bruges.
Avatar billede olebole Juniormester
21. marts 2007 - 13:38 #17
umle-keera >> med al respekt, så giver din kode ikke megen mening (omend den virker)  =)

I de to sidste linjer indætter du først div'et foran 'objHTMLElement' - hvorefter du indsætter 'objHTMLElement' i div'et foran span'et ... men uden at fjerne 'objHTMLElement' fra DOM'en først. Det er vist ikke logisk  ;o)

Desuden skal du passe på rækkefølgen af DOM-handlinger. Hvis der havde været sat en eller flere event-handlers på elementerne, ville IE leak'e memory med den viste rækkefølge. Den mest hensigtsmæssige rækkefølge er:

function inputWrapper(objHTMLElement) {
    var div = document.createElement('div');
    objHTMLElement.parentNode.insertBefore(div, objHTMLElement);
    var span = document.createElement('span');
    div.appendChild(span);
    span.appendChild(document.createTextNode(' '));
    objHTMLElement.parentNode.removeChild(objHTMLElement);
    div.insertBefore(objHTMLElement, span);
}
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