Avatar billede theselfimages Nybegynder
04. marts 2011 - 10:56 Der er 21 kommentarer og
1 løsning

Hjælp til et lille script

Jeg har brug for et lille script der render indholdet af et website igennem, og findes dette: "DKK 0,00" så erstattes det fx med ordet "Test"

Er det muligt at nogen kan hjælpe med det?
Avatar billede mikkelg Nybegynder
04. marts 2011 - 11:31 #1
Tit har Word programmer synonym hjælper, som er fuld customizable, så du selv kan indtaste et ord, og selv lave synonymet, hehe. Lidt akavet, men det lige hvad jeg kan komme i tanke op.
Avatar billede theselfimages Nybegynder
04. marts 2011 - 11:36 #2
Det er et JavaScript jeg har brug for.
Avatar billede olebole Juniormester
05. marts 2011 - 17:39 #3
<ole>

Hvordan skal det bruges? Er det brugeren, der skal gøre det på en af dine sider? Skal du gøre det på en side, loaded i din browser? Eller er det i dokumenterne i et helt website i en mappe på din PC, du skal skifte tekst ud?

/mvh
</bole>
Avatar billede theselfimages Nybegynder
05. marts 2011 - 17:47 #4
Ja, på en HTML side i browser. Altså ligesom det her script løber alt indhold igennem for ALT tekster og erstatter dem med ingenting, ønsker jeg at alle "DKK 0,00" værdier på en side findes og erstattes med et eller andet jeg selv kan angive, fx ordet "Test" eller noget andet.

Jeg ved bare ikke hvordan jeg skriver et sådan script.


function removeAltText() {
  var allElement = document.getElementById('background');
  if(allElement) {
    var imgs =  allElement.getElementsByTagName("IMG");
    for(i=0; i<imgs.length; i++) {
    imgs[i].alt = "";
    imgs[i].title = "";
    }
  }
  var singleElement = document.getElementById('removeAltSingle');
  if(singleElement)
    singleElement.getElementsByTagName("IMG")[0].alt = "";
}
window.onload = removeAltText;
Avatar billede olebole Juniormester
05. marts 2011 - 18:17 #5
Er det dig, der loader en anden persons webside - eller er det din side, som en bruger loader?

Jeg kan også spørge på en anden måde: Er det en fremmed side, du vil køre en eller anden test på - så det er ligegyldigt, om evt. scripting stadig fungerer efter udskiftning af tekst?

Grunden til, at jeg spørger, er, at du f.eks. kunne bruge innerHTML. Ukritisk brug af innerHTML betyder dog, at du uden tvivl kommer til at overskrive en masse af det oprindelige HTML dokument - og gøre dets scripting ubrugelig.

Skal du undgå overskrivninger af programmatiske referencer med innerHTML, må du i stedet traversere hele dokumentets DOM træ, hvilket er noget af et arbejde for både dig og browseren  :)
Avatar billede theselfimages Nybegynder
05. marts 2011 - 19:37 #6
Scriptet skal køre på en webløsning og fungere med andre scripts. I princippet løber ovenstående script jo også alle ALT og TITLE tags igennem og erstatter deres evt. indhold med ""

Altså, et lille script der finder en værdi og erstatter den med en anden værdi.
Avatar billede olebole Juniormester
05. marts 2011 - 19:55 #7
Jamen det er ikke bare "et lille script". Du skal som sagt traversere hele DOM træet igennem - begyndende med body elementet. Her skal du bladre alle dets childNodes igennem og spørge på hvert elements nodeType.

Er denne 3, er der tale om en textNode - og du kan replace i dens nodeValue.

Er den derimod 1, er der tale om en elementNode, og så må du på samme måde traversere gennem dens childNodes.
Avatar billede olebole Juniormester
05. marts 2011 - 20:14 #8
Njaahhh ... det er nu ikke så komplekst  =)


function searchAndReplace(sStr2find, sReplace, oSearchIn) {
    var aNodes = oSearchIn.childNodes, oRX;
    for (var i=0,j=aNodes.length; i<j; i++) {
        switch (aNodes[i].nodeType) {
            case 1:
                searchAndReplace(sStr2find, sReplace, aNodes[i])
            break;
            case 3:
                oRX = new RegExp(sStr2find, "gi");
                aNodes[i].nodeValue = aNodes[i].nodeValue.replace(oRX, sReplace);
            break;
        }
    }
}



Burde vel kunne gøre det. Argumentet oSearchIn kan f.eks. være en reference til dit body element - eller hvilket element, du nu ønsker, udskiftningen skal begynde i. Begræns det så meget som muligt, da sådan en rekursiv funktion godt kan blive tung ved meget indhold  ;o)
Avatar billede olebole Juniormester
05. marts 2011 - 20:18 #9
- og for en sikkerheds skyld, bør vi vel også gøre rent efter os  =)


            case 3:
                oRX = new RegExp(sStr2find, "gi");
                aNodes[i].nodeValue = aNodes[i].nodeValue.replace(oRX, sReplace);
                oRX = null;
            break;



Jeg kunne godt have brugt en if/elseif i stedet for en switch, men switch'en performer bedre - og det er vigtigt, når vi kalder rekursivt ned i et muligt ocean af elementer  ;o)
Avatar billede theselfimages Nybegynder
05. marts 2011 - 20:28 #10
Ok, men hvor angiver jeg hvad der skal søges efter og hvad der skal udskiftes med?
Avatar billede olebole Juniormester
05. marts 2011 - 20:34 #11
Hvad mon sStr2find og sReplace betyder?  ;o)
Avatar billede olebole Juniormester
05. marts 2011 - 20:35 #12
Kaldet kunne se sådan ud:

searchAndReplace('DKK 0,00', 'Test', document.getElementsByTagName('body')[0])
Avatar billede olebole Juniormester
05. marts 2011 - 20:37 #13
Hvis du også skal udskifte tekst i attributter på HTML elementer, kan du bruge denne kode (som også er optimeret yderligere for performance):


function searchAndReplace(sStr2find, sReplace, oSearchIn) {
    var aNodes = oSearchIn.childNodes, oTmp, aTmp;
    var oRX = new RegExp(sStr2find, "gi");
    for (var i=aNodes.length-1; i>=0; i--) {
        oTmp = aNodes[i];
        switch (oTmp.nodeType) {
            case 1:
                aTmp = oTmp.attributes;
                for (var m=aTmp.length-1; m>=0; m--) {
                    aTmp[m].nodeValue = aTmp[m].nodeValue.replace(oRX, sReplace);
                }
                searchAndReplace(sStr2find, sReplace, oTmp)
            break;
            case 3:
                oTmp.nodeValue = oTmp.nodeValue.replace(oRX, sReplace);
            break;
        }
    }
}

Avatar billede theselfimages Nybegynder
05. marts 2011 - 20:52 #14
Tror du blir nødt til at vise mig det samlet inkl. kaldet og en udløser til scriptet.... men det er vel bare: window.onload = searchAndReplace;

?
Avatar billede olebole Juniormester
05. marts 2011 - 21:02 #15
Så ville det være:


widow.onload = function(){
    searchAndReplace('DKK 0,00', 'Test', document.getElementsByTagName('body')[0])
}



- men for at undgå at overskrive en masse andet, er dette nok kønnere:


function setEvent(oObj, sEvnt, fn) {
    if (oObj.addEventListener) oObj.addEventListener(sEvnt, fn, false);
    else if (oObj.attachEvent) oObj.attachEvent("on"+sEvnt, fn);
    else oObj["on"+sEvnt] = fn;
}
function searchAndReplace(sStr2find, sReplace, oSearchIn) {
    var aNodes = oSearchIn.childNodes, oTmp, aTmp;
    var oRX = new RegExp(sStr2find, "gi");
    for (var i=aNodes.length-1; i>=0; i--) {
        oTmp = aNodes[i];
        switch (oTmp.nodeType) {
            case 1:
                aTmp = oTmp.attributes;
                for (var m=aTmp.length-1; m>=0; m--) {
                    aTmp[m].nodeValue = aTmp[m].nodeValue.replace(oRX, sReplace);
                }
                searchAndReplace(sStr2find, sReplace, oTmp)
            break;
            case 3:
                oTmp.nodeValue = oTmp.nodeValue.replace(oRX, sReplace);
            break;
        }
    }
}
function init() {
    searchAndReplace("DKK 0,00", "Test", document.getElementsByTagName("body")[0]);
}

setEvent(window, "load", init);

Avatar billede theselfimages Nybegynder
05. marts 2011 - 21:19 #16
Mange tak. Det virker perfekt :-)
Avatar billede theselfimages Nybegynder
05. marts 2011 - 21:30 #17
(Husk at post et svar! Imponerende arbejde ;-)
Avatar billede olebole Juniormester
05. marts 2011 - 21:33 #18
Fedt! Læg selv et svar og accepter det. Jeg kommer her næsten aldrig mere og samler ikke points  =)

Husk i øvrigt kun at bruge de fire første linjer under case 1, hvis du skal skifte ud i attributter. Ellers er for løkken spild af (mange) ressourcer.

Skal du ikke søge i attributter, skal case 1 kun indeholde funktions kaldet.
Avatar billede theselfimages Nybegynder
05. marts 2011 - 21:38 #19
Oh! .. det forstod jeg ikke helt, men du må meget gerne visse samlede varianter af scriptet... hvis jeg forstår dig ret, er der så to metoder samlet her? Den hurtige og den dybe? ;-)
Avatar billede olebole Juniormester
05. marts 2011 - 21:48 #20
I det tilfælde, du f.eks. kan have title="DKK 0,00" i din kode, og du gerne vil have dette skiftet, bør du bruge koden i indlægget #15. Men kun hvis du skal bruge denne feature.

Ellers bør du bruge denne, som ikke overflødigt leder i attributter:


function setEvent(oObj, sEvnt, fn) {
    if (oObj.addEventListener) oObj.addEventListener(sEvnt, fn, false);
    else if (oObj.attachEvent) oObj.attachEvent("on"+sEvnt, fn);
    else oObj["on"+sEvnt] = fn;
}
function searchAndReplace(sStr2find, sReplace, oSearchIn) {
    var aNodes = oSearchIn.childNodes, oTmp;
    var oRX = new RegExp(sStr2find, "gi");
    for (var i=aNodes.length-1; i>=0; i--) {
        oTmp = aNodes[i];
        switch (oTmp.nodeType) {
            case 1:
                searchAndReplace(sStr2find, sReplace, oTmp)
            break;
            case 3:
                oTmp.nodeValue = oTmp.nodeValue.replace(oRX, sReplace);
            break;
        }
    }
}
function init() {
    searchAndReplace("DKK 0,00", "Test", document.getElementsByTagName("body")[0]);
}

setEvent(window, "load", init);



PS: Hvis du finder mine for-løkker 'mærkelige', skyldes det igen performance optimering. Hvis man lader en løkke køre baglæns, afvikler den en hel del hurtigere (= bruger mindre kræfter), end en løkke, der løber forlæns, og som ellers udfører det samme arbejde.

Det kan virke som flueknebberi - og det er det vel også - men hvis du har et stort DOM træ (meget indhold med mange nestede elementer), kommer det hurtigt til at betyde noget ved denne slags rekursive handlinger  ;o)
Avatar billede theselfimages Nybegynder
05. marts 2011 - 22:20 #21
Sejt! Det virker hurtigt og optimalt! Mange tak for hjælpen.
Avatar billede olebole Juniormester
05. marts 2011 - 23:03 #22
Selvtak  ;o)
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