• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

JavaScript wird nur in Teilen ausgeführt

Martin_K

New member
Hallo zusammen,

ich habe schon gesucht aber leider weder hier noch sonstwo einen Lösungsansatz für mein Problem gefunden, da es etwas speziell ist.

Ich bin leider auch kein JS Profi, daher habe ich vielleicht etwas ganz Elementares übersehen.

In den letzten Tagen habe ich an diversen Stellen Probleme beim Erstellen von Seiten festgestellt, wobei JS nur zu Teilen ausgeführt wurde. D.h. konkret, die erste(n) Zeile(n) wird (werden) ausgeführt, die nachfolgenden nicht. Hier mal ein kleines Beispiel:

Wenn ich es wie folgt mache, wird der alert ausgeführt.
Code:
function sizeToWidth(){
    //var modWidth = document.getElementById(modal_photo).style.width;
    alert("test");

    if(modWidth > width()){


        document.write(document.getElementById(modal_photo).style.width);
    }

}

Wenn ich die obige Zeile mit "var modWidth = ..." wieder aktiviere, allerdings nicht. Der alert ist auch nur ein Test, eigentlich möchte ich danach etwas anderes machen, das document.write wird bspw auch nicht ausgeführt.

Ich habe das auch an anderen Stellen gehabt, wo bspw ein document.getElementById ausgeführt wurde, das nachfolgende aber nicht. Bspw funktioniert:

Code:
<script type="text/javascript">
if(width() < 500){
    var links = document.getElementsByClassName('navi_link');
    for (i = 0; i <= links.length; i++)
        links.item(i).style.top = "14px";

}
[COLOR="#FF0000"]</script>

<script type="text/javascript">[/COLOR]
if(width() < 500){
    var links = document.getElementsByClassName('navi');
    for (i = 0; i <= links.length; i++)
        links.item(i).style.fontSize =  "14pt";

}
</script>

Nur, wenn ich die roten Zeilen wieder entferne, wird nur der erste Teil ausgeführt. Warum? Für mich ist das alles sehr mysteriös..

Vielen Dank schon mal für eure Hilfe!
 
Zuletzt bearbeitet:
Ein document.write() in einer Funktion... doppelt keine gute Idee. Für's Debugging solltest du console.log() verwenden.

Beim zweiten Beispiel wird der zweite Teil nicht ausgeführt, da deine Schleifen beide nicht korrekt sind. Eine HTMLCollection hat .length Einträge - der erste hat den Index 0; dann hat der Letzte den Index... .length - 1 und nicht .length

PS: Du solltest deinen Code mal durch einen Linter laufen lassen (z.B. JSHint, a JavaScript Code Quality Tool ) - dein Codestil ist suboptimal. So sollte man z.B. nach einem if immer einen Block machen. Sonst schleichen sich einfach viel zu schnell irgendwelche Bugs ein.

Zu document.write:
http://www.w3.org/html/wg/drafts/html/CR/webappapis.html#dynamic-markup-insertion schrieb:
This method has very idiosyncratic behavior. In some cases, this method can affect the state of the HTML parser while the parser is running, resulting in a DOM that does not correspond to the source of the document (e.g. if the string written is the string "<plaintext>" or "<!--"). In other cases, the call can clear the current page first, as if document.open( ) had been called. In yet more cases, the method is simply ignored, or throws an exception. To make matters worse, the exact behavior of this method can in some cases be dependent on network latency, which can lead to failures that are very hard to debug. For all these reasons, use of this method is strongly discouraged.
 
Super, vielen Dank für die beiden sehr guten Antworten. Mit den Debugging Möglichkeiten für JS war ich bisher noch nicht so vertraut. Das hilft mir sehr weiter. Die beiden Fehler waren ja letztlich dumme Flüchtigkeitsfehler, die einem dann so auch besser auffallen können, aber da ich wirklich wenig Erfahrung mit JS ist das meistens aus Codeschnipseln erlernt, die man irgendwo als Lösung angeboten bekommt ;)

Noch eine abschließende Frage: Was soll ein entsprechender Block nach einem if sein? Ich meine, es ist doch ordentlich eingerückt und umklammert?!
 
Zurück
Oben