Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   Problem bei einem request unter Javascript (https://www.tweakpc.de/forum/programmiersprachen/57601-problem-bei-einem-request-unter-javascript.html)

mokus 07.07.2008 18:44

Problem bei einem request unter Javascript
 
Hi,
ich habe ein Problem mit einer request Abfrage, in dieser rufe ich eine Datei mit einem bestimmten String aus den ich verarbeiten möchte. Nur jetzt habe ich das Problem das in der Funktion drin ein Syntax Fehler laut Firefox auftritt.

Beispiel:
[code]Fehler: Syntax-Fehler
Quelldatei: [URL]http://www.lammpee.de/toolbar_inc/archive_list.php?archive=news[/URL]
Zeile: 1, Spalte: 1
Quelltext:
Design Update Start*,*[URL="http://www.lammpee.de/archive,news,entry,4,1.html*;*Die"]http://www.lammpee.de/archive,news,entry,4,1.html*;*...[/URL][/code]Komischer weise funktioniert die ausgabe aber, wenn ich mitten in die Funktion die Variable mit dem enthaltenen String über ein Alert ausgeben lasse. Ab da an gibt es dann keine probleme mehr.

Funktion:
[html]<script language="javascript" type="text/javascript">

var id_name;
var http_request;
var request_status
var request_content_v;

function request (url,id) {

id_name = id;
http_request = false;
request_content_v = "";
request_status = false;

document.getElementById(id_name).value = "load...";

if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
// zu dieser Zeile siehe weiter unten
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

if (!http_request) {
//alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
return false;
}

http_request.onreadystatechange = request_content;

http_request.open('GET', url, true);
http_request.send(null);

document.getElementById(id_name).value = request_content_v;

return request_status;

}


function request_content () {

if (http_request.readyState == 4) {
if (http_request.status == 200) {
request_content_v = http_request.responseText
request_status = true;
} else {
alert('Bei dem Request ist ein Problem aufgetreten.');
request_status = false;
}
}

}

</script>[/html]Wenn ich in dieser Funktion am Ende ein Alert reinbringe funktioniert es.
[html] http_request.onreadystatechange = request_content;

http_request.open('GET', url, true);
http_request.send(null);

alert(request_content_v);

document.getElementById(id_name).value = request_content_v;

return request_status;

}[/html]

[EID]-Mr.GiZMO 07.07.2008 21:37

AW: Problem bei einem request unter Javascript
 
Ich behaupte mal ganz frech, das liegt an der Verzögerung, die durch das Alert ausgelöst wird.

Ich würde versuchen dem Script an der stelle eine "Verschnaufpause" zu gönnen, bis id_name [strike]ausgegeben[/strike] übergeben wird.

Evtl. mit setTimeout oder einer Pseudo-warte-auf-etwas-oder-rechne-etwas-Funktion.

BenniG. 08.07.2008 09:43

AW: Problem bei einem request unter Javascript
 
Überleg mal wofür AJAX steht. (Tipp: Gleich das erste Wort birgt das Problem).

Du kannst nicht synchron arbeiten, wenn du ein Request in den Hintergrund abschickst.

Du musst deine Verarbeitung der Antwort im sog. CallBack (das wird aufgerufen, wenn die Response vom Webserver geschickt wurde) durchführen.

Das CallBack ist in deinem Fall die Funktion "request_content".

Das bedeutet das Asynchronous im AJAX.
Mit einer Wartezeit würde ich in keinem Fall arbeiten. Wenn dann mit einem Flag, das gesetzt wird, sobald die Response da ist (falls du wirklich den Eindruck von synchroner Verarbeitung erwecken musst).

[EID]-Mr.GiZMO 08.07.2008 10:12

AW: Problem bei einem request unter Javascript
 
BenniG., wie würde man das in diesem speziellen Fall scripten?

BenniG. 08.07.2008 21:41

AW: Problem bei einem request unter Javascript
 
Möglichkeit 1 mit Flag:
[code]
<script language="javascript" type="text/javascript">

var id_name;
var http_request;
var request_status
var request_content_v;
var response_present=false;

function request (url,id) {

id_name = id;
http_request = false;
request_content_v = "";
request_status = false;

document.getElementById(id_name).value = "load...";

if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
// zu dieser Zeile siehe weiter unten
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

if (!http_request) {
//alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
return false;
}

http_request.onreadystatechange = request_content;

http_request.open('GET', url, true);
http_request.send(null);
response_present=false;
while(!response_present) {
//do nothing but wait
if (response_present) {
break;
}
}

document.getElementById(id_name).value = request_content_v;

return request_status;

}


function request_content () {

if (http_request.readyState == 4) {
if (http_request.status == 200) {
request_content_v = http_request.responseText
request_status = true;
} else {
alert('Bei dem Request ist ein Problem aufgetreten.');
request_status = false;
}
response_present = true;
}

}

</script>
[/code]Besser: Verarbeitung im CallBack
[code]
<script language="javascript" type="text/javascript">

var id_name;
var http_request;
var request_status
var request_content_v;
var response_present=false;

function request (url,id) {

id_name = id;
http_request = false;
request_content_v = "";
request_status = false;

document.getElementById(id_name).value = "load...";

if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
// zu dieser Zeile siehe weiter unten
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

if (!http_request) {
//alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
return false;
}

http_request.onreadystatechange = request_content;

http_request.open('GET', url, true);
http_request.send(null);
response_present=false;

//das hier wird auch nicht funktionieren, ist die Frage, ob das überhaupt gebraucht wird?!
//Kann wohl auch über request_content abgehandelt werden
return request_status;

}


function request_content () {

if (http_request.readyState == 4) {
if (http_request.status == 200) {
request_content_v = http_request.responseText
request_status = true;
document.getElementById(id_name).value = request_content_v;
} else {
alert('Bei dem Request ist ein Problem aufgetreten.');
request_status = false;
}

}

}

</script>

[/code]

Beides selbstverständlich ungetestet ;)

Und könnte mal jemand diese ellenlange URL kürzen? Sprenung der Seitenbreite müsste mit Peitschenhieben bestraft werden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.