Michael: AJAX am I-Phone

Habe folgenden Java Code:

  
function loadXMLDoc() {  
    // branch for native XMLHttpRequest object  
    if (window.XMLHttpRequest) {  
        req = new XMLHttpRequest();  
        req.onreadystatechange = processReqChange;  
        req.open("GET", "my_data3.xml", true);  
        req.send(null);  
    // branch for IE/Windows ActiveX version  
    } else if (window.ActiveXObject) {  
        req = new ActiveXObject("Microsoft.XMLHTTP");  
        if (req) {  
            req.onreadystatechange = processReqChange;  
            req.open("GET", "my_data3.xml", true);  
            req.send();  
        }  
    }  
}  
  
// handle onreadystatechange event of req object  
function processReqChange() {  
    // only if req shows "loaded"  
    if (req.readyState == 4) {  
        // only if "OK"  
        if (req.status == 200) {  
            createTable();  
         } else {  
            alert("There was a problem retrieving the XML data:n" +  
                req.statusText);  
         }  
    }  
}  
  
function createTable()  
{  
==> Fehlermeldung  
	document.getElementById('Lamp').innerHTML = req.responseXML.getElementsByTagName('Lamp')[0].childNodes[0].nodeValue;  
	document.getElementById('PrName').innerHTML= req.responseXML.getElementsByTagName('Name')[0].childNodes[0].nodeValue;//s.substr(0, 10);  
	document.getElementById('Error').innerHTML=req.responseXML.getElementsByTagName('Error')[0].childNodes[0].nodeValue;  
  
	Projektor = new Image();  
	Input = new Image();  
	Mute = new Image();  
  
	if (req.responseXML.getElementsByTagName('Power')[0].childNodes[0].nodeValue==0)  
	{  
		Projektor.src = "projector_off.PNG";  
	}  
	else  
	{  
		Projektor.src = "projector_on.PNG";  
	}  
	if (req.responseXML.getElementsByTagName('Input')[0].childNodes[0].nodeValue==0)  
	{  
		Input.src = "button_vid.JPG";  
	}  
	else  
	{  
		Input.src = "button_vga.JPG";  
	}  
	if (req.responseXML.getElementsByTagName('Mute')[0].childNodes[0].nodeValue==0)  
	{  
		Mute.src = "button_off.JPG";  
	}  
	else  
	{  
		Mute.src = "button_on.JPG";  
	}  
	if (req.responseXML.getElementsByTagName('Dieb')[0].childNodes[0].nodeValue==0)  
	{  
		document.getElementById("projector1").style.backgroundColor="#FFFFFF";  
	}  
	else if (req.responseXML.getElementsByTagName('Dieb')[0].childNodes[0].nodeValue==1)  
	{  
		document.getElementById("projector1").style.backgroundColor="#FF8000";  
	}  
	else  
	{  
		document.getElementById("projector1").style.backgroundColor="#800000";  
	}  
  
	document.getElementById("prostatus").src=Projektor.src;  
	document.getElementById("inputstatus").src= Input.src;  
	document.getElementById("mutestatus").src= Mute.src;  
        setInterval ("loadXMLDoc()", 200);  
  
}  

Und diesen HTML:

  
<body onload="loadXMLDoc();">  
<div style="width: 320px; height: 356px">  
  
<h2><span id="PrName"></span></h2>  
  
<table>  
  <tr>  
    <th style="width:150px" colspan="2">Powerstatus</th>  
  
  </tr>  
  <tr>  
    <td id="projector1" colspan="2">  
	<form action="" method="post">  
		<input type="hidden" name="<?z varname ($output[0]) ?>"  
		<?z if ($output[0] == 0) { ?>value="1"<?z } ?>  
		<?z if ($output[0] != 0) { ?>value="0"<?z } ?>  
		/>  
		<input type="image" SRC="projector_off.PNG" id="prostatus" />  
	</form>	  
    </td>  
  
  </tr>  
  <tr>  
    <th style="width:150px">Picture-Muting</th>  
    <th style="width:150px">Eingangswahl</th>  
  </tr>  
  <tr>  
    <td id="projector2">  
	<form action="" method="post">  
		<input type="hidden" name="<?z varname ($output[2]) ?>"  
		<?z if ($output[2] == 0) { ?>value="1"<?z } ?>  
		<?z if ($output[2] != 0) { ?>value="0"<?z } ?>  
		/>  
		<input type="image" SRC="button_off.JPG" id="mutestatus" width="150"/>  
	</form>  
    </td>  
    <td id="projector3">  
	<form action="" method="post">  
		<input type="hidden" name="<?z varname ($output[1]) ?>"  
		<?z if ($output[1] == 0) { ?>value="1"<?z } ?>  
		<?z if ($output[1] != 0) { ?>value="0"<?z } ?>  
		/>  
		<input type="image" SRC="button_vid.JPG" id="inputstatus" width="150"/>  
	</form>  
    </td>  
  </tr>  
  <tr>  
    <th style="width:150px">Lampenzeit</th>  
    <th style="width:150px">Fehlermeldung</th>  
  </tr>  
  <tr>  
    <td id="projector4"><span id="Lamp"></span><a>h</a></td>  
    <td id="projector5"><span id="Error"></span></td>  
  </tr>  
</table>  
  
</body>  
</div>  
</html>  

Folgende Problematik tritt nun auf:

Wenn ich die Seite am IPhone lade bekomme ich einen Fehlermeldung:

TypeError: Result of expression is not an object ==> Fehlermeldung

Wenn ich nun die Taste mit der (id="prostatus") drücke, wird alles korrekt angezeigt, und die Fehlermeldung verschwindet.

Kann mir jemand sagen woran dis liegt?

Danke im voraus

  1. Lieber Michael,

    Du hast sehr wahrscheinlich ein Timingproblem. Das "A" in Ajax steht für asynchron. Das bedeutet, dass manche Objekte in Deinem Script nicht sofort zur Verfügung stehen, sondern erst später.

    Weil Du Deinen Code als "Java-Code" bezeichnest, habe ich den starken Verdacht, dass Du nicht weißt was Du tust. Daher kann ich jetzt nicht sicher sagen, mit welchen Hinweisen ich Dir tatsächlich helfe.

    Was an Deinem Code verstehst Du ganz, was verstehst Du teilweise, und was ist Dir völlig unklar?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Lieber Michael,

      Du hast sehr wahrscheinlich ein Timingproblem. Das "A" in Ajax steht für asynchron. Das bedeutet, dass manche Objekte in Deinem Script nicht sofort zur Verfügung stehen, sondern erst später.

      Das mit dem Timingproblem habe ich mir auch schon überlegt. aber wenn ich einen Button einfüge, der mir beim betätigen die Funktion neu lädt, bekomme ich trotzdem die Fehlermeldung.

      Weil Du Deinen Code als "Java-Code" bezeichnest, habe ich den starken Verdacht, dass Du nicht weißt was Du tust. Daher kann ich jetzt nicht sicher sagen, mit welchen Hinweisen ich Dir tatsächlich helfe.

      Achso. Sorry. Ich meine natürlich den JavaScript code. So besser?

      Was an Deinem Code verstehst Du ganz, was verstehst Du teilweise, und was ist Dir völlig unklar?

      Der Code ist mir eigentlich klar. Diese Version ist für den mobilen Zugriff. Der Zugriff auf die Desktopversion funktioniert einwandfrei, und sieht eigentlich im großen und ganzen gleich aus. Ich habe ihn mit IE und FF getestet. Nur die Safariversion macht mir probleme.

      Liebe Grüße,

      Felix Riesterer.

      lg

      Michael

  2. TypeError: Result of expression is not an object ==> Fehlermeldung

    Finde durch Debug-Ausgaben heraus, welcher Teil der Zeile, in der die Exception auftritt, den Fehler auslöst.

    req.responseXML.getElementsByTagName('Lamp')[0].childNodes[0].nodeValue

    Also:
    alert(req);
    alert(req.responseXML);
    alert(req.responseXML.getElementsByTagName('Lamp'));
    alert(req.responseXML.getElementsByTagName('Lamp')[0]);
    usw.

    (Ich vermute, dass bereits req.responseXML kein gültiges XML-Dokument liefert. Stimmt der MIME-Typ und ist das XML-Dokument wohlgeformt?)

    Übrigens, auf dem iPhone kannst du in den Mobile-Safari-Einstellungen eine Fehlerkonsole aktivieren, auf der du auch Ausgaben mit console.log() schreiben kannst, genauso wie bei Desktop-Browsern.

    Mathias

    1. Das ist eine gute Idee. Vielen Dank.

      Das probiere ich mal aus.

      lg

      Michael

  3. Habe folgenden Java Code:

    function createTable()
    {
    ==> Fehlermeldung
    document.getElementById('Lamp').innerHTML = req.responseXML.getElementsByTagName('Lamp')[0].childNodes[0].nodeValue;
    document.getElementById('PrName').innerHTML= req.responseXML.getElementsByTagName('Name')[0].childNodes[0].nodeValue;//s.substr(0, 10);

      
    
    > Folgende Problematik tritt nun auf:  
    > Wenn ich die Seite am IPhone lade bekomme ich einen Fehlermeldung:  
    > TypeError: Result of expression is not an object ==> Fehlermeldung  
      
      
    Nur, um sicherzugehen, dass es nicht doch so ist... Das "==> Fehlermeldung" innerhalb des Codes hast Du hier für uns eingetragen, oder? Das steht nicht so im Code...
    
    1. Fehlermeldung" innerhalb des Codes hast Du hier für uns eingetragen, oder? Das steht nicht so im Code...

      Ja. Habe ich für euch eingetragen. Hier zeigt mir der Debugger im Fehlerfall den Fehler an