Automatisches Statusupdate

H3llGhost

Mitglied
Hallo Leute,

ich habe in PHP einen kleinen Skript geschrieben, der verschiedene Statusstufen hat.
Diese möchte ich abfragen, ist ja möglich mit dem Ajax.Request.
Das ist ja kein Thema nun möchte ich aber dass dieses alle paar Sekunden passiert, bis eine gewisse Statusstufe erreicht wird.

Nur leider habe ich keine Ahnung, wie ich solch eine Wiederholung schreibe.
Im Internet habe ich nach ProgressBar und ähnlichem gesucht, leider nur Sachen gefunden, wo ich den Prozentwert angebe aber dazu brauch ich erstmal den aktuellen Status.

Könnt ihr mir bitte helfen?

Danke im Vorraus!
 
Wo ist das Problem? Du kannst mit setInterval() die Status-Abfrage-Funktion immer wieder aufrufen. Wenn du eine Progressbar realisieren willst, hängst du halt ein Bildsegment an, sobald der gewünschte Teilstatus erreicht ist.
 
Joar danke ... ;)
Das habe ich in der Zwischenheit auch rausgefunden ... :)
Aber danke für den Tipp.

EDIT:
Eine kleine Frage habe ich noch.
Den ersten Skript starte ich auch über einen Request und denselben Ajex.Request benutze ich weiter.
Kann ich das machen oder brauch ich einen neuen?
 
Zuletzt bearbeitet:
Genau das simultane war das Problem.
Was jetzt aber zu bedenken ist der erste soll keine Rückmeldung geben.
Wäre es dann einfacher zwei Request zu benutzen oder die Funktion aus den gegebenen Link um einen weiteren Parameter anzupassen?
 
Naja, die Info über den "Status" erhältst du ja über die Antwort des Servers, da würde dich die verlinkte Lösung auch nicht weiterbringen.

Du müsstest halt die Antwort des Servers auf die nötigen Infos hin untersuchen, und entsprechende darauf reagieren. Wie genau das gingen, hängt davon ab, womit der Server antwortet.
 
Ich möchte ja den Verarbeitungsskript starten und danach den Statusskript immer abfragen, da der Verarbeitungsskript in einer DB alle Infos einträgt und der Statusskript von da liest, deswegen ist der Status vom Verarbeitungsskript für mich nicht wichtig.
 
Also ich komme im Moment einfach nicht mehr weiter.

Ich habe bis jetzt als externe Datei folgendes:

HTML:
	var request = false;
	var request2 = false;
	var intervall = false;
	var statuscode = 0;
	
	// Request senden
	function createRequest() {
		// Request erzeugen
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest(); // Mozilla, Safari, Opera
		} else if (window.ActiveXObject) {
			try {
				request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
			} catch (e) {
				try {
					request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
				} catch (e) {}
			}
		}
		if (window.XMLHttpRequest) {
			request2 = new XMLHttpRequest(); // Mozilla, Safari, Opera
		} else if (window.ActiveXObject) {
			try {
				request2 = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
			} catch (e) {
				try {
					request2 = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
				} catch (e) {}
			}
		}
	}
	
	function startDownload() {
		if (!request) {
			alert("Kann keine XMLHTTP-Instanz erzeugen");
			return false;
		} else {
			var url = "downloader.php";
			// Request öffnen
			request.open('post', url, false);
			// Requestheader senden
			request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			// Request senden
			request.send('h='+hash);
		}	
	}

	function sendRequest(r) {
		// überprüfen, ob Request erzeugt wurde
		if (statuscode <= 100) {
		if (!request2) {
			alert("Kann keine XMLHTTP-Instanz erzeugen");
			return false;
		} else {
			var url = "index.php?mode=ajax";
			// Request öffnen
			request2.open('post', url, true);
			// Requestheader senden
			request2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			// Request senden
			request2.onreadystatechange = interpretRequest2;
			
			request2.send('r='+r+'&h='+hash);
			// Request auswerten
		}
		} else
		{
			window.clearInterval(intervall);
			alert("yes");
		}
	}

	// Request auswerten
	function interpretRequest() {
		switch (request.readyState) {
			// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
			case 4:
				if (request.status != 200) {
					alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
				} else {
					var content = request.responseText;
					// den Inhalt des Requests in das <div> schreiben
					document.getElementById('statustxt').innerHTML = content;
					status = content;
				}
				break;
			default:
				break;
		}
	}
	
	function interpretRequest2() {
		switch (request2.readyState) {
			// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
			case 4:
				if (request2.status != 200) {
					alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
				} else {
					var status	= request2.responseXML.documentElement;
  // Alle gefundenen Elemente nacheinander abarbeiten.
  for (var i = 0; i < status.childNodes.length; i++) {
    if (status.childNodes[i].nodeType == 1) {
		var element = document.getElementById(status.childNodes[i].tagName);
		if (element && status.childNodes[i].tagName != "statusbar")
			element.innerHTML = status.childNodes[i].firstChild.nodeValue;
		else if (element && status.childNodes[i].tagName == "statusbar") {
			myJsProgressBarHandler.setPercentage('statusbar', status.childNodes[i].firstChild.nodeValue);
			statuscode = status.childNodes[i].firstChild.nodeValue;
		}
		element = false;
	}
  }
				}
				break;
			default:
				break;
		}
	}

Und zum Aufrufen benutze ich:

HTML:
createRequest();
startDownload();
sendRequest('status');

Mein Problem ist die Anzeige braucht trotzdem solange wie der Server braucht um die Datei downloader.php auszuführen.
Warum?

@Sven Mintel:
Wie könnte ich deine Codeidee mit hierein einfließen lassen?
 
Das Problem ist, dass der Request aus startDownload() synchron erfolgt.

"synchron" hat den Effekt, dass bis der Request abgearbeitet ist, alles andere pausiert.
Du müsstest diesen 1. Request also auch asynchron vornhehmen, andernfalls wird sendRequest() erst abgearbeitet, sobald der Request aus startDownload() beendet ist.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück