objTicker.offsetHeigh nach Ajax request

chipo

Grünschnabel
Hallo,

erstmal den Code und dann mein Problem.

Ich führe mit diesem Code einen Request zur newpoll.php durch:

PHP:
<html>
<head>
<title>News</title>
<script type="text/javascript">
var xmlhttpreq = null;

function GetHTTPRequest() {
  var xmlhttp = false;
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (trymicrosoft) {
      try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (othermicrosoft) {
        try {
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (failed) {
          xmlhttp = false;
        }
      }
    }
  return xmlhttp;
}

xmlhttpreq = GetHTTPRequest();

function StartRequest() {
  // Persistente Verbindung öffnen
  var timestamp = Math.floor(new Date().getTime()/1000);
  xmlhttpreq.open('GET', 'newspoll.php?timestamp='+timestamp, true);
  xmlhttpreq.onreadystatechange = handle_response;
  xmlhttpreq.send(null);

 

}

function handle_response() {
  if (xmlhttpreq.readyState==4 && xmlhttpreq.status==200) {
    document.getElementById('printarea').innerHTML = xmlhttpreq.responseText;
  }
  // Bei Verbindungsabbruch gleich neu initialisieren
  if (xmlhttpreq.readyState==4) {
    StartRequest();
  }
}
</script>
</head>
<body onload="StartRequest();">
<div id="printarea">

</div>
</body>
</html>

In der newspoll.php befindet sich folgender Inhalt:

PHP:
<?php
set_time_limit(0);
include ("db.php");
$timestamp = $_GET["timestamp"];

$i = 1;
do
{
$time = time();

$abfrage = "SELECT * FROM news WHERE zeit > $time AND erstell > $timestamp";
$ergebnis = mysql_query($abfrage);
$num = mysql_num_rows($ergebnis);
If ($num > 0)
    {
    include ("ticker.php");
    }

sleep(2);
}
while ($i > 0);
?>


In der ticker.php befindet dieser Ticker : http://www.doktormolle.de/temp/ticker6.htm wobei die Einträge durch PHP erzeugt werden. Hier der relevante Auszug:

Code:
<script type="text/javascript">
<!--

/* * * * * * * * * * * * * * * * D I E  V A R I A B L E N * * * * * * * * * * * * * * * * * */

    //°°°°°°°°°°Die News

tNews=new Array();

<?php
include ("db.php");
$time = time();

$abfrage = "SELECT * FROM news WHERE zeit > $time ORDER BY zeit";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
     {
     $text = $row->text;
     $datum = date("d.m.Y",$row->zeit);
     $uhrzeit = date("H:i",$row->zeit);
      echo "tNews.push('"."<table><tr><td><font size=\"7\" face=\"Verdana,Tahoma,Arial,sans-serif\">$datum - $uhrzeit Uhr</font></td></tr><tr><td><font size=\"7\" face=\"Verdana,Tahoma,Arial,sans-serif\">$text</font></td></tr></table>"."');";
     $i = 0;
     }
?>


    //°°°°°°°°°°Laufrichtung(up,down,left,right)
strDir      ='up';


Wenn ich nun die newspoll.php aufrufe funtkioniert alles ohne Probleme. Wenn ich aber die news.php aufrufe und dann via Ajaxrequest die Seite eingefügt bekomme ich den Fehler:

Details zum Fehler auf der Webseite

Benutzer-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2)
Zeitstempel: Fri, 5 Feb 2010 07:09:24 UTC


Meldung: 'objTicker.offsetHeight' ist Null oder kein Objekt
Zeile: 162
Zeichen: 5
Code: 0
 
Hi,

das Problem ist, dass das JS nach dem Request in Dokument ausgeführt werden muss. Um das umsetzen zu können, bedarf es einige Änderungen.

Zunächst in der ticker.php:
Hier kann der Inhalt nicht mehr mit document.write eingefügt werden, da sonst das bisherige Dokument überschrieben werden würde.
Weiterhin muss die Funktion DM_ticken gezielt als Funktionsobjekt des window-Objekts deklariert werden, da sie sonst nicht bekannt ist.

Damit ergeben sich für die ticker.php nachstehende Änderungen:
Code:
aus: function DM_ticken()
wird: window.DM_ticken = function()

aus: document.write(strTicker);
wird: document.getElementById("printarea").innerHTML = strTicker;

Im Basisdokument wird das String-Objekt um eine Methode erweitert, dass das nachträgliche Ausführen von JS ermöglicht. Ausserdem wird die callback-Funktion handle_response modifiziert.
Code:
// Methode zum nachträglichen Ausführen von JS
String.prototype.eval_js = function(){
  var objDok = document.createElement("div");

  // IE-Workaround (Falls Rückgabestring mit einem string-Tag beginnt)
  var objDummy = document.createElement("br");
  objDok.appendChild(objDummy);

  // Zeichenkette des String-Objektes in DIV schreiben
  objDok.innerHTML += this;
  var strScript = "";

  // Alle Script-Elemente im DIV durchlaufen
  for(var i=0; i<objDok.getElementsByTagName("script").length; i++){
  	// HTML-Code des aktuellen Script-Bereiches in String schreiben
    // Enthält nur den JS-Code ohne Tags
  	strScript += objDok.getElementsByTagName("script")[i].innerHTML;
  }

  // Den JS-Quellcode mit eval ausführen
  eval(strScript);
  delete objDok;
}

// Bisheriger Code

function handle_response() {
  if (xmlhttpreq.readyState==4 && xmlhttpreq.status==200) {
    xmlhttpreq.responseText.eval_js();
  }
  // Bei Verbindungsabbruch gleich neu initialisieren
  if (xmlhttpreq.readyState==4) {
    StartRequest();
  }
}

Vielleicht löst das dein Problem.

Ciao
Quaese
 
Danke erstmal für die Antwort.

Du schreibst

Code:
String.prototype.eval_js = function(){

da muss ich dort erst noch das prototypjs Framework einbinden oder?


Edit: Habe prototype nun mal eingebunten und den Code auch entsprechen angepasst. Nun wird aber garnichtmehr geändert und nur der Fehler kommt:

Code:
Details zum Fehler auf der Webseite

Benutzer-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2)
Zeitstempel: Fri, 5 Feb 2010 10:45:22 UTC


Meldung: Syntaxfehler
Zeile: 56
Zeichen: 3
Code: 0
news.php

Zeile 56 wäre "eval("

Code:
    // Enthält nur den JS-Code ohne Tags
  	strScript += objDok.getElementsByTagName("script")[i].innerHTML;
  }

  // Den JS-Quellcode mit eval ausführen
  eval(strScript);
  delete objDok;
}
 
Zuletzt bearbeitet:
Danke erstmal für die Antwort.

Du schreibst

Code:
String.prototype.eval_js = function(){

da muss ich dort erst noch das prototypjs Framework einbinden oder?

Nö, musst du nicht.

prototype ist nicht nur der Name eines Frameworks, sondern auch eine Eigenschaft von Javascript-Objekten, eine Möglichkeit, Objekte(und nicht nur Instanzen von Objekten) zu Erweitern.
Siehe auch: http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/object.html#1193255
Dies wird hier getan....das Objekt ist das JS-eigene String-Objekt, und eval_js() eine Methode, um die das String-Objekt erweitert wird.
Mit prototypejs hat das in diesem Fall also nichts zu Tun.
 
Zurück