torsten: text in element übertragen

moin!

ich würde mir die haare raufen wenn ich könnte!

bisher habe ich ein <div id="hintergrund"> mit textlinks auf folgende art und weise gefüllt:

im body->

  
<div id="hintergrund">  
<script type="text/javascript">  
writeLinks();  
</script>  
</div>  

in separater *.js datei->

  
function writeLinks() {  
	document.write("<p>" + links + "</p>");  
}  

was auch prima funktioniert(e), falls die frage nach dem wieso auftaucht kann ich auch schon mit einer antwort dienen

ich versuche jetzt ein js schnipselchen zusammen zu basteln, das die notation im body obsolet macht, quasi das div mittels getElementById("hintergrund") erkennt und dort den text einbastelt, daraus werden neue problemchen entstehen, weil das element berits einen inhalt hat, der dann mglw überschrieben wird, was aber relativ gut lösbar ist in dem ich mein html und css etwas anpasse.

function writeLinks() {  
	document.getElementById("hintergrund").document.write("<p>" + links + "</p>");  
}

geht schon mal nicht, was die fehlerkonsole ausspuckt versteh ich auch nicht recht (FB / document undefined -> ich soll also in einer variablen definieren welches document... ?) das auslösen eines windows.onload bewerkstellige ich mit hilfe einer addEvent funktion was auch bereits prima funktioniert.

mit folgendem schnipsel wird der inhalt der variablen "links" übertragen, aber die gesamte seite wird dabei überschrieben, also hab ich dem ding noch nicht gesagt wohin das ganze soll...

function writeLinks() {  
	var getId = document.getElementById("hintergrund");  
		document.write("<p>" + links + "</p>");  
}

wie geht das? was fehlt? ich wurschtel nur rum und hab den durchblick, den ich noch nicht habe schon mal verloren.

mfg torsten

--
Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
  1. Hallo,

    document.getElementById("hintergrund").document.write("<p>" + links + "</p>");

    Das ist Phantasiesyntax. getElementById gibt dir ein Elementknoten zurück. Dieser hat keine document-Eigenschaft. Was du brauchst ist eher http://de.selfhtml.org/javascript/objekte/all.htm#inner_html@title=innerHTML. Oder, wenn du dem bestehenden Inhalt etwas anhängen willst: element.insertAdjacentHTML('beforeEnd', '…');

    geht schon mal nicht, was die fehlerkonsole ausspuckt versteh ich auch nicht recht (FB / document undefined -> ich soll also in einer variablen definieren welches document... ?)

    Also wenn ich den Code im Firefox ausführe in einem Dokument, in dem es ein Element mit der ID hintergrund gibt, so bekomme ich den Fehler:

    TypeError: document.getElementById("hintergrund").document is undefined
    document.getElementById("home").document.write("<p>" + links + "</p>")

    Das bedeutet, dass das Objekt, das document.getElementById("hintergrund") zurückgibt, keine document-Eigenschaft hat.

    Mathias

    1. moin mathias!

      Das ist Phantasiesyntax.

      ja, leider...

      getElementById gibt dir ein Elementknoten zurück. Dieser hat keine document-Eigenschaft.

      aufgabe: erklärung für elementknoten suchen...

      -> erledigt ;-)

      Was du brauchst ist eher http://de.selfhtml.org/javascript/objekte/all.htm#inner_html@title=innerHTML. Oder, wenn du dem bestehenden Inhalt etwas anhängen willst: element.insertAdjacentHTML('beforeEnd', '…');

      der versuch mit der ersten variante sieht folgender maßen aus und funktioniert oooch ned:

        
      var linkList = "bla bla bla";  
        
      function writeLinks() {  
        document.all.hintergrund.innerHTML = linkList;  
      }  
        
      addEvent(window,"onload",writeLinks);  
      
      

      ob die zweite variante, das ist was ich benötige kann ich nicht entscheiden... in dem <div> existieren zwei mittels css fixierte img-links außerdem soll das innerHTML nicht oder mit zeitverzögerung onload ausgeführt werden hab ich gelesen... das wär dann ein weiteres problem, aber vielleicht reicht ja schon das addEvent um die gewünschte verzögerung zu erzeugen, da writeLinks als "letztes" onload ereignis ausgeführt wird.

      ?

      mfg torsten

      --
      Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
      1. Hallo,

        getElementById gibt dir ein Elementknoten zurück. Dieser hat keine document-Eigenschaft.

        aufgabe: erklärung für elementknoten suchen...

        Siehe auch HTML-Elementobjekte:
        http://de.selfhtml.org/javascript/objekte/htmlelemente.htm

        document.all.hintergrund.innerHTML = linkList;

        Auch wenn es so in SELFHTML steht, innerHTML ist einfach eine Eigenschaft von Elementobjekten, die von sämtlichen Browsern unterstützt wird. Sie ist nicht daran gekoppelt, dass man sich das Elementobjekt über document.all holt. document.all ist veraltet, du kannst ruhig bei document.getElementById bleiben.

        document.getElementById('hintergrund').innerHTML = linkList;

        addEvent(window,"onload",writeLinks);

        Wie sieht deine addEvent-Funktion aus?

        ob die zweite variante, das ist was ich benötige kann ich nicht entscheiden...

        Entweder das Element hat schon Inhalt und du willst welchen am Ende hinzufügen,
        oder das Element ist leer und du willst den Inhalt komplett überschreiben.

        Wenn du einfach innerHTML = '…' notierst, so wird der Inhalt komplett überschrieben.

        in dem <div> existieren zwei mittels css fixierte img-links

        Dann suchst du wohl eher

        document.getElementById('hintergrund').insertAdjacentHTML('beforeEnd', linkList);

        oder alternativ (was aber nicht so sauber ist):

        document.getElementById('hintergrund').innerHTML += linkList;

        außerdem soll das innerHTML nicht oder mit zeitverzögerung onload ausgeführt werden hab ich gelesen...

        Bei der JS-Programierung muss man generell dafür sorgen, dass zum Zeitpunkt, wo ein Script ausgeführt wird und auf gewisse Elemente im DOM zugegriffen wird, das Dokument schon bis dahin geparst wurde. Das kann man z.B. dadurch garantieren, dass man das Script beim load-Ereignis startet.

        das wär dann ein weiteres problem, aber vielleicht reicht ja schon das addEvent um die gewünschte verzögerung zu erzeugen, da writeLinks als "letztes" onload ereignis ausgeführt wird.

        Ob der Handler als erster oder letzter ausgeführt wird, dürfte für das Einfügen der Inhalt keinen Unterschied machen, es sei denn, der Handler baut auf den DOM-Änderungen vorheriger Handler auf.

        Mathias

        1. moin!

          danke erst mal :)

          document.getElementById('hintergrund').innerHTML = linkList;

          das funktioniert bei mir prima, überschreibt aber, wie du schon sagtest den vorhandenen inhalt. (ich kann das problemchen aber mittels css und eines <p id=""> lösen)

          document.getElementById('hintergrund').innerHTML += linkList;

          hier kann ich keinen unterschied zur vorangegangenen funktion feststellen... was soll das "+" bewirken?

          Dann suchst du wohl eher

          document.getElementById('hintergrund').insertAdjacentHTML('beforeEnd', linkList);

          das funktioniert nicht, die fehlerkonsole meint: "is not a function" (?)

          Bei der JS-Programierung muss man generell dafür sorgen, dass zum Zeitpunkt, wo ein Script ausgeführt wird und auf gewisse Elemente im DOM zugegriffen wird, das Dokument schon bis dahin geparst wurde. Das kann man z.B. dadurch garantieren, dass man das Script beim load-Ereignis startet.

          hab mal folgendes notiert: window.setTimeout("writeLinks()", 3000);

          sieht lustig aus...

          Ob der Handler als erster oder letzter ausgeführt wird, dürfte für das Einfügen der Inhalt keinen Unterschied machen, es sei denn, der Handler baut auf den DOM-Änderungen vorheriger Handler auf.

          du willst sagen es ist egal ob das .innerHTML onload ausgeführt wird oder nicht, gell?

          addEvent(window,"onload",writeLinks);

          Wie sieht deine addEvent-Funktion aus?

          im moment so:

          function addEvent(obj, type, fn) {  
            if(type.search("on")==0) type = type.substr(2);  
            if (obj.addEventListener) {  
              obj.addEventListener(type, fn, false);  
            }  
            else if (obj.attachEvent) {  
              obj.attachEvent('on' + type, function () {  
                return fn.call(obj, window.event);  
              });  
            }  
          } 
          

          mfg torsten

          --
          Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
          1. document.getElementById('hintergrund').innerHTML += linkList;

            hier kann ich keinen unterschied zur vorangegangenen funktion feststellen...

            Was bedeutet das? Überschreibt es den Inhalt?

            was soll das "+" bewirken?

            el.innerHTML += 'foo';
            ist eine Kurzschreibweise für
            el.innerHTML = el.innerHTML + 'foo';
            (Auslesen, String anhängen, wieder Zuweisen)

            document.getElementById('hintergrund').insertAdjacentHTML('beforeEnd', linkList);

            das funktioniert nicht, die fehlerkonsole meint: "is not a function" (?)

            Oops, Firefox kennt die Methode tatsächlich noch nicht.

            Ob der Handler als erster oder letzter ausgeführt wird, dürfte für das Einfügen der Inhalt keinen Unterschied machen, es sei denn, der Handler baut auf den DOM-Änderungen vorheriger Handler auf.

            du willst sagen es ist egal ob das .innerHTML onload ausgeführt wird oder nicht, gell?

            Nein, das wollte ich nicht sagen.

            Es ist egal, ob du

            addEvent(window, "onload", irgendeineAndereFunktion);
            addEvent(window, "onload", writeLinks);

            oder

            addEvent(window, "onload", writeLinks);
            addEvent(window, "onload", irgendeineAndereFunktion);

            notierst – unter der Voraussetzung, dass »irgendeineAndereFunktion« nichts tut, was »writeLinks« an seiner Arbeit hindert.

            Mathias

            1. document.getElementById('hintergrund').insertAdjacentHTML('beforeEnd', linkList);

              das funktioniert nicht, die fehlerkonsole meint: "is not a function" (?)

              Oops, Firefox kennt die Methode tatsächlich noch nicht.

              Ja, erst ab Version 8.

            2. moin!

              document.getElementById('hintergrund').innerHTML += linkList;

              hier kann ich keinen unterschied zur vorangegangenen funktion feststellen...

              Was bedeutet das? Überschreibt es den Inhalt?

              was soll das "+" bewirken?

              el.innerHTML += 'foo';
              ist eine Kurzschreibweise für
              el.innerHTML = el.innerHTML + 'foo';
              (Auslesen, String anhängen, wieder Zuweisen)

              hm, glaube zu verstehen... ist in meinem fall aber nicht nötig vermute ich mal, da es ja eigentlich nix zu übergeben gibt (?)

              Ob der Handler als erster oder letzter ausgeführt wird, dürfte für das Einfügen der Inhalt keinen Unterschied machen, es sei denn, der Handler baut auf den DOM-Änderungen vorheriger Handler auf.

              du willst sagen es ist egal ob das .innerHTML onload ausgeführt wird oder nicht, gell?

              Nein, das wollte ich nicht sagen.

              Es ist egal, ob du

              addEvent(window, "onload", irgendeineAndereFunktion);
              addEvent(window, "onload", writeLinks);

              oder

              addEvent(window, "onload", writeLinks);
              addEvent(window, "onload", irgendeineAndereFunktion);

              bisher bin ich davon ausgegangen, dass das addEvent nichts anderes als windows.onload ersetzt und damit verhindert, dass sich die ereignisse nicht gegenseitig überschreiben. in diesem zusammenhang hab auch immer noch nicht begriffen ob das wirklich relevanz hat was in http://de.selfhtml.org/javascript/objekte/all.htm#inner_html@title=selfhtml beschrieben steht, nämlch: "Die Eigenschaft innerHTML sollten Sie nicht direkt beim Einlesen der HTML-Datei anwenden, sondern immer erst abhängig von Aktionen wie Verweisklicks oder Button-Klicks oder mit einem Seite setTimeout() von einigen Sekunden davor. Bei Anwendung direkt beim Einlesen der Datei meldet der Internet Explorer 4.0 einen Laufzeitfehler."

              ist der IE4 der einzige grund? hat noch irgendjemand so ein ding?

              notierst – unter der Voraussetzung, dass »irgendeineAndereFunktion« nichts tut, was »writeLinks« an seiner Arbeit hindert.

              Mathias

              mfg torsten

              --
              Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do
              1. moin!

                Es ist egal, ob du

                addEvent(window, "onload", irgendeineAndereFunktion);
                addEvent(window, "onload", writeLinks);

                oder

                addEvent(window, "onload", writeLinks);
                addEvent(window, "onload", irgendeineAndereFunktion);

                ui, außerdem hab ich gerade entweder einen fetten fehler oder das obige ist nicht egal, verschiebe ich die funktion an den anfang des js ist alles gut, verschiebe ich sie ans ende ist es das nicht! ich kann nicht behaupten es läge nicht an einem fremden script ist aber trotz allem interessant.

                steht das script hinter dem shadowbox.setup werden alle links übertragen und dargestellt wie gewünscht aber die sh-box läd nicht, steht das script zuvor ist alles bestens...

                [?]

                mfg torsten

                --
                Shakespeare sagt: To be or not to be / Sartre sagt: To be is to do / Camus sagt: To do is to be / Sinatra singt: Do be do be do