Avatar billede showsource Seniormester
13. marts 2008 - 08:59 Der er 28 kommentarer og
1 løsning

document.write i en funktion

Hej

Hvis jeg kalder en funktion med onclick, og i funktionen er document.write, får man vist en ny side.
Hvordan kammer man udenom det?
Avatar billede showsource Seniormester
13. marts 2008 - 09:01 #1
Altså UDEN at bruge innerHTML !
Avatar billede erikjacobsen Ekspert
13. marts 2008 - 10:44 #2
Den document.write kan jo ikke vide hvor den skal skrive sin tekst, når siden allerede er dannet og vist for brugeren. Derfor starter den forfra.

Du kan bruge innerHTML, som trods alt vil være en liiiidt pænere løsning, men den rigtigste måde er at oprette eller ændre elementer med DOM-metoder.
Avatar billede showsource Seniormester
13. marts 2008 - 11:27 #3
Ja, det tænkte jeg nok.
Har du links til noget syntaks for de DOM metoder?
Avatar billede w13 Novice
13. marts 2008 - 12:07 #4
F.eks.:

var newElement=document.createElement("p");
newElement.setAttribute("title","Titeltekst");
newElement.appendChild(document.createTextNode("Hello world!");

document.getElementById("beholder").appendChild(newElement);

Her oprettes elementet <p> i variablen newElement. Dernæst appendes (tilføjes) tekstnoden "Hello world" til p-elementet. Dernæst sættes en title-attríbut på p-elementet. Til sidst tilføjes p-elementet til et element med id="beholder".
Avatar billede w13 Novice
13. marts 2008 - 12:07 #5
Udover appendChild findes der bl.a. også replaceChild, removeChild, cloneNode og insertBefore.
Avatar billede showsource Seniormester
13. marts 2008 - 12:24 #6
Jaja, det er så dette som skal laves om:

function table_width(ref) {

    if (id_ref = get_id('jsbredde')) {

    var mulige = new Array(640,760,940,1024,1200);
    var text = 'Table Size:';
    var i = 0;

      while(i < mulige.length) {

        if(ref == mulige[i]) {
        text = text+' &nbsp; '+mulige[i];
        }else{
        text = text+' &nbsp; <a href="#" onclick="createCookie('+mulige[i]+');table_width('+mulige[i]+');return false;">'+mulige[i]+'</a>';
        }

      i++;
      }

    return id_ref.innerHTML = text;

    }

}

Vil gerne selv rode med det, men er nødt til at vide hvilke muligheder/funktioner jeg har at bruge
Avatar billede w13 Novice
13. marts 2008 - 12:32 #7
Du bliver nødt til at gøre det lidt anderledes. Jeg ville nok gøre det nogenlunde sådan her:
---------------------------------------------------------
function table_width(ref) {

    if (id_ref = get_id('jsbredde')) {

    var mulige = new Array(640,760,940,1024,1200);
    var text = 'Table Size:';
    var i = 0;

      while(i < mulige.length) {

        if(ref == mulige[i]) {
          id_ref.appendChild(document.createTextNode(' &nbsp; '+mulige[i]));
        }else{
          id_ref.appendChild(document.createTextNode(' &nbsp; '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0)");
          newElement.onclick=new Function("createCookie("+mulige[i]+")table_width("+mulige[i]+");return false;")";
          newElement.appendChild(document.createTextNode(mulige[i]));
          id_ref.appendChild(newElement);
        }

      i++;
      }
    }

}
Avatar billede w13 Novice
13. marts 2008 - 12:33 #8
*          newElement.onclick=new Function("createCookie("+mulige[i]+")table_width("+mulige[i]+");return false;")";
skal være:
          newElement.onclick=new Function("createCookie("+mulige[i]+")table_width("+mulige[i]+");return false;");
Avatar billede w13 Novice
13. marts 2008 - 12:34 #9
Jeg har så brugt "java script:void(0)" i stedet for "#" for at undgå, at "#" tilføjes i adresselinjen, men det er jo smag og behag.
Avatar billede w13 Novice
13. marts 2008 - 12:37 #10
Avatar billede showsource Seniormester
13. marts 2008 - 12:42 #11
hmm, kopiere jeg koden direkte til min js fil, forsvinder alt js som er på siden. ?
Avatar billede w13 Novice
13. marts 2008 - 12:47 #12
Det lyder ikke helt sundt..
Kan vi se din JS-fil?
Får du en JavaScript-fejlmeddelelse?
Avatar billede w13 Novice
13. marts 2008 - 12:48 #13
Havde du rettet til:
newElement.onclick=new Function("createCookie("+mulige[i]+")table_width("+mulige[i]+");return false;");
?
Avatar billede showsource Seniormester
13. marts 2008 - 13:05 #14
Jeg har bare kopieret din kode ind i min js fil, omdøbt funktionen til table_width_two.
Efter jeg fjernede " vises mit js, men den virker ikke?
( "mulige" blev omdøbt da min gamle funktionen viste forkert ved samme navn? )
Altså funktionen vises ikke:

body blalballb............

<div id="domtest">

<script type="text/javascript">

table_width_two(tablesz);

</script>


I min js fil:

function table_width_two(ref) {

    if (id_ref = get_id('domtest')) {

    var sizes = new Array(640,760,940,1024,1200);
    var i = 0;

      while(i < mulige.length) {

        if(ref == mulige[i]) {
          id_ref.appendChild(document.createTextNode(' &nbsp; '+sizes[i]));
        }else{
          id_ref.appendChild(document.createTextNode(' &nbsp; '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0)");
          newElement.onclick=new Function("createCookie("+sizes[i]+")table_width("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          id_ref.appendChild(newElement);
        }

      i++;
      }
    }

}
Avatar billede showsource Seniormester
13. marts 2008 - 13:08 #15
Hov, så'n her:

function table_width_two(ref) {

    if (my_ref = get_id('domtest')) {

    var sizes = new Array(640,760,940,1024,1200);
    var i = 0;

      while(i < sizes.length) {

        if(ref == sizes[i]) {
          my_ref.appendChild(document.createTextNode(' &nbsp; '+sizes[i]));
        }else{
          my_ref.appendChild(document.createTextNode(' &nbsp; '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0)");
          newElement.onclick=new Function("createCookie("+sizes[i]+")table_width("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          my_ref.appendChild(newElement);
        }

      i++;
      }

    }

}

Nu vises der &nbsp; ?
Avatar billede showsource Seniormester
13. marts 2008 - 13:09 #16
newElement.onclick=new Function("createCookie("+sizes[i]+")table_width("+sizes[i]+");return false;");
til
newElement.onclick=new Function("createCookie("+sizes[i]+");table_width("+sizes[i]+");return false;");

så vises den! :O)

Men &nbsp; vises som html kode
Avatar billede showsource Seniormester
13. marts 2008 - 13:19 #17
Den viser blot ikke hvilken str. som er valgt. Først ved reload, og så kan jeg lige så godt bruge document.write, og undlade functionen i onclick
Avatar billede showsource Seniormester
13. marts 2008 - 13:30 #18
For nu lige at få det helt på det rene hvad jeg bruger:

I min js fil:

// http://www.eksperten.dk/spm/743420

var cookname = 'main_table';
var cookdays = 30;
var tablesz = 940;

    if(findes = readCookie()) {
    tablesz = findes;
    }



function createCookie(value) {

    var date = new Date();
    date.setTime(date.getTime()+(cookdays*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    document.cookie = cookname+"="+value+expires+"; path=/";
    setSize(value);

}

function readCookie() {
    var nameEQ = cookname+ "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function setSize(size) {

    if (($bcontent = get_id(cookname))) {

    $bcontent.style.width = size;

    }else{

    return false;

    }

}

function table_width_two(ref) {

    if (my_ref = get_id('jsbredde')) {

    var sizes = new Array(640,760,940,1024,1200);
    var i = 0;

      while(i < sizes.length) {

        if(ref == sizes[i]) {
          my_ref.appendChild(document.createTextNode(' :: '+sizes[i]));
        }else{
          my_ref.appendChild(document.createTextNode(' :: '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0);");
          newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          my_ref.appendChild(newElement);
        }

      i++;
      }

    }

}

I html er

<table id="main_table" style="border: solid #DBDBDB; border-width: 3px; width: 940px;">

I en td har jeg:

<div class="size_links" id="jsbredde">
<script type="text/javascript">

table_width_two(tablesz);

setSize(tablesz);

</script>

</div>


Og lige nu sætter den blot flere links, og viser stadig ikke den valgte str. Færst ved reload
Avatar billede showsource Seniormester
13. marts 2008 - 13:36 #19
Så lykkedes det!
http://developer.mozilla.org/en/docs/DOM:element.removeChild

function table_width_two(ref) {

    if (my_ref = get_id('jsbredde')) {

    var element = document.getElementById("jsbredde");
        while (element.firstChild) {
        element.removeChild(element.firstChild);
        }

    var sizes = new Array(640,760,940,1024,1200);
    var i = 0;

      while(i < sizes.length) {

        if(ref == sizes[i]) {
          my_ref.appendChild(document.createTextNode(' :: '+sizes[i]));
        }else{
          my_ref.appendChild(document.createTextNode(' :: '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0);");
          newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          my_ref.appendChild(newElement);
        }

      i++;
      }

    }

}

Smid gerne et svar
Avatar billede showsource Seniormester
13. marts 2008 - 13:41 #20
Så'n her, og så gider jeg ikke rode mere med det i dag!

function table_width_two(ref) {

    if (my_ref = get_id('jsbredde')) {

    var element = my_ref;
        while (element.firstChild) {
        element.removeChild(element.firstChild);
        }

    var sizes = new Array(640,760,940,1024,1200);
    var i = 0;

    my_ref.appendChild(document.createTextNode('Table size'));

      while(i < sizes.length) {

        if(ref == sizes[i]) {
          my_ref.appendChild(document.createTextNode(' :: '+sizes[i]));
        }else{
          my_ref.appendChild(document.createTextNode(' :: '));
          var newElement=document.createElement("a");
          newElement.setAttribute("href","java script:void(0);");
          newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          my_ref.appendChild(newElement);
        }

      i++;
      }

    }

}
Avatar billede w13 Novice
13. marts 2008 - 13:58 #21
:P
Avatar billede showsource Seniormester
13. marts 2008 - 14:11 #22
Er du heller ikke til point?
Avatar billede w13 Novice
13. marts 2008 - 14:12 #23
Joeh så lad gå. =)
Avatar billede showsource Seniormester
13. marts 2008 - 14:17 #24
Mange tak for hjælpen!
( må se at få kikket noget mere på det DOM halløj )
Avatar billede olebole Juniormester
13. marts 2008 - 16:54 #25
<ole>

En lille sidebemærkning: document.write holder kun sålænge, vi skriver HTML. Den er ikke mulig at bruge under XHTML.

Derudover kommer du ud i at kreere en del memory-leaks med din kode - i hvertfald i IE. Når du fjerner dine elementer, skal du (dersom elementerne helt skal nedlægges) først fjerne evt. event handlers. Det kræver dog helt andre måder at skrive koden på, som det ikke er muligt at gøre rede for i en E-tråd ... det er yderst omfattende at forklare.
At skrive kode, der skal manipulere et HTML-dokuments DOM, er overodentlig komplekst. For at gøre det ordentligt, skal du skrive væsentligt bedre kode, end de der skriver og udgiver JS/DOM/Ajax-libraries som Prototype, jQuery, spry, osv. De magter det nemlig ikke  ;o)

Én ting, du dog kan gøre, er, _aldrig_ at sætte event handlers på elementer, der endnu ikke er indsat i dokumentets DOM-træ  :)

/mvh
</bole>
Avatar billede showsource Seniormester
14. marts 2008 - 09:25 #26
Hvordan memoryleaks?



"_aldrig_ at sætte event handlers på elementer, der endnu ikke er indsat i dokumentets DOM-træ"

Præcis hvad mener du?
Afvikle en funktion for f.eks. en bestemt div, inden div'en er defineret?
Avatar billede w13 Novice
14. marts 2008 - 17:56 #27
Nej, hvis du sætter f.eks. onclick="alert('hello world')" på et element, som du endnu ikke har indsat i dokumentet.. (Præcis som i mit eksempel faktisk. =(  )

newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");

Men det ved Ole langt mere om end jeg gør.
Avatar billede olebole Juniormester
15. marts 2008 - 00:20 #28
Dette:
          newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));
          my_ref.appendChild(newElement);

- burder være:
          my_ref.appendChild(newElement);
          newElement.onclick=new Function("createCookie("+sizes[i]+");table_width_two("+sizes[i]+");return false;");
          newElement.appendChild(document.createTextNode(sizes[i]));

Hvis du tildeler en event handler, mens elementet stadig hænger i hukommelsen, oprettes et midlertidigt script scope. Når elementet så indsættes i dokumentet, oprettes det 'endelige' script scope - men det 'midlertidige' slettes ikke. Derfor tabes hukommelse for hver DOM handling af den slags  :o|
Avatar billede olebole Juniormester
15. marts 2008 - 00:23 #29
- men det er kun én af de mange faldbruber, der findes i DOM-programmering ... og ikke mindst i kombination med OOP. At skrive dynamiske applikationer med DOM kræver _virkelig_ godt styr på HTML, JavaScript, DOM og CSS - samt meget stor erfaring
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