AJAX ​- TypeError: null is not an object

  • Hallo


    Ich arbeite mich gerade durch das Buch HTML5 und CSS3 von Jürgen Wolf. Jetzt bin ich im Kapitel AJAX und komme nicht weiter.


    Es wurde ein Umrechner von Einheiten erstellt. In diesem Fall von Meter auf Yard und Meilen.


    Hier der html Code


    Hier der dazu gehörige php code



    Die html Seite wird auch angezeigt aber wenn ich jetzt den Wert für Meter eingebe wird mir ein Fehler entgegen geworfen für Zeile 22


    Code
    TypeError: null is not an object (evaluating 'xml.getElementsByTagName')


    Ich habe natürlich auch nach dem Fehler gegoogelt. Der Fehler bedeutet das Objekt null / leer ist. Was ich aber nicht verstehe. In der Entwickler Ansicht, im Safari Browser (Version 12.0 (13606.2.11)), sehe ich im Bereich Ressourcen das der php Code richtig ausgeführt wurde.


    Vielleicht können ihr mich in die richtige Richtung stupsen. Ich versuche das schon den ganzen Tag zu Verstehen und in den Griff zu bekommen.


    Hier noch mal die Hardware und Software auf der ich das Probiere


    Client:

    MacBook Air (11 Zoll, Mitte 2011)

    Browser Safari (Version 12.0 (13606.2.11) & Firefox Quantum 62.0.3


    Server:

    Raspberry Pi ZeroW


    Ich hoffe ihr könnt mir weiterhelfen.


    Danke


    Oliver

  • Der Ajax/Javascript/Html Freak bin ich jetzt nicht und so eine Konstruktion habe ich auch noch nicht gesehen: Aber hier findet JS wohl in deinem Antwortstring den <Tag Namen> nicht und gibt null zurück...


    In Zukunft wirst Du dich öfters wundern warum etwas nicht geht.


    Mit Firefox (sicher auch mit anderen Browsern) hast Du aber Super möglichkeiten zu debuggen! Du kannst zB schauen wie die AJAX-Antwort deines php-Skripts ausschaut, Step für Step durchgehen, Variableninhalte anschauen etc. Dadurch kannst Du ggf. Probleme erkennen & beheben.

  • Schaue mal in den Netzwerk-Tab der Entwicklertools: stimmt der Content-Type (text/xml)? Kommt auch dein XML (ab Zeile 9 in der PHP-Datei) an? Kannst du eine Fehlkonfiguration deines Webservers ausschließen?


    Allgemein: wenn du wirklich solchen Code im Buch lernst, ist es IMHO ein klarer Fall für die Tonne. Moderne Webstandards sind das genaue Gegenteil...

  • ich lese nur mit... Was meinst Du damit?

    Wo soll ich nur anfangen...

    • Der moderne, Promise-based Ersatz für XMLHttpRequest ist das fetch API.
    • Als ich den Test der Verfügbarkeit von XMLHttpRequest gesehen habe (historische IE-Sonderbehandung, Zeile 9 erster Code-Block), bin ich aus allen Wolken gefallen: XMLHttpRequest wird seit IE 7 unterstützt (https://stackoverflow.com/a/9658048/5952681), in IE 6 und darunter brauchte man ActiveXObject("Micosoft.XMLHTTP"), weil M$ auf Standards geschi**en hat. Und was soll ich sagen, der IE 7 wurde vor ziemlich genau 12 Jahren veröffentlicht (https://en.wikipedia.org/wiki/Internet_Explorer_7). VOR 12 JAHREN. WER ZUR HÖLLE SCHREIBT CODE, UM EINEN SEIT URZEITEN NICHT MEHR AKTUELLEN BROWSER ZU UNTERSTÜTZEN? Sorry für das Geschrei... :no_sad:
    • Das Script gehört nicht in den <head>, sondern idealerweise ans Ende des <body>.
    • Zeile 20. if(xmlhttp.readyState==4 && xmlhttp.status==200){. Wer weiß auswendig, was der readyState 4 ist? Wahrscheinlich die wenigsten. DAFÜR GIBT ES KONSTANTEN! https://developer.mozilla.org/…XMLHttpRequest/readyState Ah, es ist DONE.
    • Fehlerbehandlung kommt in diesem Code definitiv zu kurz, Strings baut man am besten nicht mit dem Additions-Operator zusammen (gilt eigentlich für die meisten Sprachen) und und var hat die moderneren Alternativen const und let bekommen.
    • Edit: gute Praxis ist es, ==/!= zu vermeiden und ===/!== zu verwenden, um die implizite Typkonvertierung von JS zu vermeiden. Ich hör' jetzt besser mal auf...

  • Ich habe im Netwerk-Tab nachgesehen und es schein text/html als Content-Type an zu kommen. Die Frage die sich mir jetzt stellt ist woran das liegt und wie ich das ändern kann.


    Linus um deine Frage zu beantworten. Nein ich kann nicht ausschliessen das der Webserver fehl konfiguriert ist. Es handelt sich um eine Standard installation vom Apache Server. Ich habe nichts weiter eingestellt/geändert.

    Moderne Webstandards sind das genaue Gegenteil...

    Mich würde auch Interessieren was du damit meintest. Ich hatte extra auf gute Bewertungen und eine Aktuelle des Buches geachtet.


    Entschuldigt bitte Fragen, das ist alles komplettes Neuland für mich.


    Edit. zu langsam

  • Ich habe im Netwerk-Tab nachgesehen und es schein text/html als Content-Type an zu kommen. Die Frage die sich mir jetzt stellt ist woran das liegt und wie ich das ändern kann.

    #5


    Mich würde auch Interessieren was du damit meintest. Ich hatte extra auf gute Bewertungen und eine Aktuelle des Buches geachtet.

    #6


    ;)

  • Moderne Webstandards sind das genaue Gegenteil...


    ich lese nur mit... Was meinst Du damit?

    Jetzt glaube ich zu verstehen:

    • der Code sieht prähistorisch aus und
    • entspricht nicht modernen Webstandards

    na ja, an Operatoren wie === oder !== muß man sich gewöhnen.

    Aber das ist absolutes Neuland für mich.

    Danke Linus & einen schönen Gruß, kle