Avatar billede nsm-sg Nybegynder
16. februar 2012 - 16:47 Der er 19 kommentarer

Hvordan erstatter jeg HTML tags med Javascript?

Jeg har brug for lidt hjælp. Hvordan laver jeg en javascript funktion som erstatter noget indenfor nogle HTML tags?

Det konkrete eksempel er at jeg gerne vil erstatte følgende:
<span class="ProductMenu_MenuItemBold">VAREGRUPPE</span>

Så det ser spledes ud:
<span class="ProductMenu_MenuItemBold">- VAREGRUPPE</span>

Altså der skal tilføjes et eller flere tegn til den oprindelige tekst.

Jeg har ikke mulighed for at angive et ID, samt funktionen skal gerne kunne bladre igennem alle <span class="ProductMenu_MenuItemBold"> og angive samme tegn foran teksten, uanset hvad der står indenfor SPAN.


Håber på at nogen af jer kan hjælpe lidt hurtigt :)
Avatar billede olebole Juniormester
16. februar 2012 - 17:02 #1
<ole>

Det er lidt skidt, du kun har et klassenavn at arbejde udfra. Har du ID på et element, de pågældende elementer ligger i, så man kan lave en lidt mere effektiv løsning?

/mvh
</bole>
Avatar billede niklask Nybegynder
16. februar 2012 - 17:42 #2
Det kan vel gøres ved hjælp af jQuery:

$(document).ready(function () {
  var currentText = $(".ProductMenu_MenuItemBold").html();
  $(".ProductMenu_MenuItemBold").html("- " + currentText);
});
Avatar billede niklask Nybegynder
16. februar 2012 - 17:44 #3
Prøvede lige at tilføje flere span tags med forskelligt indhold, det virker ikke. Vender tilbage hurtigst muligt.
Avatar billede niklask Nybegynder
16. februar 2012 - 17:47 #4
Sådan, det skulle virke nu:

$(document).ready(function () {
  $(".ProductMenu_MenuItemBold").each(function (index) {
      $(this).html("- " + $(this).html());
  });
});
Avatar billede olebole Juniormester
16. februar 2012 - 18:01 #5
@niklask: Det var præcis den slags ineffektive løsninger, jeg prøvede at undgå ved at spørge efter det element, spannene ligger i  *o)

En mere effektiv løsning ville være:

var sVal, aSp = document.getElementsByTagName("span");
for (var i=0,j=aSp.length; i<j; i++) {
    if (aSp[i].className==="ProductMenu_MenuItemBold") {
        sVal = aSp[i].firstChild.nodeValue;
        aSp[i].firstChild.nodeValue = "- "+sVal;
    }
}

- men det kan gøres endnu bedre med et svar på mit spørgsmål
Avatar billede niklask Nybegynder
16. februar 2012 - 18:41 #6
#5
Kan du uddybe det? Hvad er der ineffektivt ved denne løsning?
Avatar billede olebole Juniormester
16. februar 2012 - 18:52 #7
Scriptet roder hele dokumentet igennem efter spannene - i stedet for at lede i et enkelt element. Derudover bruger jQuery internt en hel del unødige processer for at gøre det samme, som jeg skrev ovenfor.

Skulle der være oprettet eventhandlers eller andre programmatiske refrencer indenfor spannene, vil disse blive overskrevet. Det kan resultere i, at andre scripts ikke fungerer - og det kan medføre memory leaks. Det skyldes, at jQuery ikke bruger DOM, men innerHTML til at rette indholdet.
Avatar billede olebole Juniormester
16. februar 2012 - 18:57 #8
En forbedring af mit eget eksempel kunne være noget i stil med:

var sVal, aSp = document.getElementById("mitDiv").document.getElementsByTagName("span");

Det er ikke sjældent hurtigere at bruge et library som jQuery - og man behøver ikke lære at programmere for at bruge dem.

Alt har en pris, og prisen er her, at man ikke lærer de mest basale programmeringsprincipper - at koden ofte bliver væsentligt mindre effektiv - samt at man binder sig til kun at kode gennem librariet.
Avatar billede niklask Nybegynder
16. februar 2012 - 19:12 #9
Mange tak for det. Man lærer noget nyt hver dag ;)
Avatar billede olebole Juniormester
16. februar 2012 - 19:22 #10
Selvtak. Hvis der er en mening med livet, må det være at lære hver dag ... hele livet  *o)
Avatar billede nsm-sg Nybegynder
16. februar 2012 - 20:05 #11
@olebole: Det tætteste ID jeg har i koden er den tabel som alle disse SPAN ligger i.

<table id="ProductMenu_Table" border="0" cellspacing="0" cellpadding="0" width="100%">

Kan det ID bruges og har du en brugbar kode jeg kan afprøve?
Avatar billede olebole Juniormester
16. februar 2012 - 20:32 #12
Ja:

var sVal, aSp = document.getElementById("ProductMenu_Table").document.getElementsByTagName("span");
for (var i=0,j=aSp.length; i<j; i++) {
    if (aSp[i].className==="ProductMenu_MenuItemBold") {
        sVal = aSp[i].firstChild.nodeValue;
        aSp[i].firstChild.nodeValue = "- "+sVal;
    }
}

- og det skal køres på onload - eller du kan lægge scriptet i bunden af siden eller i hvertfald efter tabellen.
Avatar billede nsm-sg Nybegynder
16. februar 2012 - 21:05 #13
Men hvis jeg ikke kan lave en onload i body, hvordan kan jeg så aktivere denne?
Avatar billede olebole Juniormester
16. februar 2012 - 21:32 #14
Du kan skrive sådan:

function handleSpans() {
    var sVal, aSp = document.getElementById("ProductMenu_Table").document.getElementsByTagName("span");
    for (var i=0,j=aSp.length; i<j; i++) {
        if (aSp[i].className==="ProductMenu_MenuItemBold") {
            sVal = aSp[i].firstChild.nodeValue;
            aSp[i].firstChild.nodeValue = "- "+sVal;
        }
    }
}
if (window.addEventListener) window.addEventListener("load", handleSpans, false);
else window.attachEvent("onload", handleSpans);

- hvilket er en lidt pænere måde at få noget afviklet på onload
Avatar billede nsm-sg Nybegynder
16. februar 2012 - 21:41 #15
Hmm... der sker umiddelbart ikke noget, uanset om denne kommer i toppen eller i bunden af html siden.

<script type="text/javascript">
function handleSpans() {
    var sVal, aSp = document.getElementById("ProductMenu_Table").document.getElementsByTagName("span");
    for (var i=0,j=aSp.length; i<j; i++) {
        if (aSp[i].className==="ProductMenu_MenuItemBold") {
            sVal = aSp[i].firstChild.nodeValue;
            aSp[i].firstChild.nodeValue = "- "+sVal;
        }
    }
}
if (window.addEventListener) window.addEventListener("load", handleSpans, false);
else window.attachEvent("onload", handleSpans);
</script>

Skal der bruges jQuery til det her?
Avatar billede nsm-sg Nybegynder
16. februar 2012 - 22:10 #16
UPDATE - denne fungerer KUN i IE hvis jeg sætter koden i head, men virker altså IKKE i hverken Firefox eller Chrome.

Nogen idéer til hvad der kan gøres?
Avatar billede olebole Juniormester
16. februar 2012 - 22:53 #17
Sorry! Første linje skal se sådan ud:

var sVal, aSp = document.getElementById("ProductMenu_Table").getElementsByTagName("span");
Avatar billede olebole Juniormester
16. februar 2012 - 22:54 #18
- men du er nødt til at tjekke dine browseres fejlmeddelelser. Ellers kan du ikke webudvikle  *o)
Avatar billede nsm-sg Nybegynder
17. februar 2012 - 05:01 #19
@olebole: Det er meget fornemt. Det hjalp på problemet.
Nu virker det efter hensigten. Smid et svar, så jeg kan give dig point.

Hvis jeg evt. ville ønske at smide et <img> ind foran teksten i <span>, skulle der så en større ændring af koden til?
Lige nu kan jeg se at den blot udskriver koden ude på siden, men ikke fortolker f.eks <br />
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