, das die Befehlsausführungsergebnisse scrollabel zeigt, indem die Überlaufeigenschaft auf automatisch eingestellt wird. Wir ändern auch die
Tag -Anzeigeeigenschaft in Inline (Block ist standardmäßig). Es gibt auch die wiederverwendbare .console -Klasse, damit alles „Konsoley“ aussehen lässt: graue monospatierte Schrift auf schwarzem Hintergrund.
Der serverseitige Code
Unsere Anwendung stellt Anforderungen an ein serverseitiges Skript (exec.php) an, das einen Befehl über den Befehl "GET-Parameter" empfängt. Dieses Skript prüft einfach, ob der Befehl in der zulässigen Liste angezeigt wird (Sie können diese Liste bearbeiten, um mehr Befehle zuzulassen), führt den Befehl aus und druckt das Ergebnis. Der Befehl wird mit Hilfe des nativen PHP -Funktion Shell_exec () ausgeführt. PHP wird hier verwendet, sollte diese Funktionalität jedoch relativ einfach mithilfe Ihrer bevorzugten serverseitigen Sprache implementieren. <button >Make a request</button> <br>
<br>
<script type="text/javascript"> <br>
<br>
var http_request = false; <br>
<br>
function makeRequest(url) { <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7... <br>
http_request = new XMLHttpRequest(); <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
http_request = new ActiveXObject("Microsoft.XMLHTTP"); <br>
} <br>
http_request.onreadystatechange = alertContents; <br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
<br>
} <br>
<br>
function alertContents() { <br>
if (http_request.readyState == 4) { <br>
if (http_request.status == 200) { <br>
alert(http_request.responseText); <br>
} else { <br>
alert('There was a problem with the request.'); <br>
} <br>
} <br>
} <br>
<br>
document.getElementById('mybutton').onclick = function() { <br>
makeRequest('test.html'); <br>
} <br>
<br>
</script>
Warnung!
Das Array $ ALLGESTELLT_COMMANDS beschränkt die Befehle, die Benutzer über die Konsole ausführen können. Sie können dem Array so viele Befehle hinzufügen, wie Sie möchten
Das JavaScript
Der erste Schritt im JavaScript -Code besteht darin, einen Namespace zu definieren: eine verherrlichte Etikett für das, was im Wesentlichen nichts weiter als nur ein leeres Objekt ist:
Alle anderen Variablen und Funktionen, die wir benötigen, werden als Eigenschaften dieses Objekts definiert. Dies ermöglicht es uns, den globalen Namespace sauber und den Code in sich geschlossen zu halten. function makeHttpRequest(url, callback_function, return_xml) <br>
{ <br>
var http_request, response, i; <br>
<br>
var activex_ids = [ <br>
'MSXML2.XMLHTTP.3.0', <br>
'MSXML2.XMLHTTP', <br>
'Microsoft.XMLHTTP' <br>
]; <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+... <br>
http_request = new XMLHttpRequest(); <br>
if (http_request.overrideMimeType) { <br>
http_request.overrideMimeType('text/xml'); <br>
} <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
for (i = 0; i < activex_ids.length; i++) { <br>
try { <br>
http_request = new ActiveXObject(activex_ids[i]); <br>
} catch (e) {} <br>
} <br>
} <br>
<br>
if (!http_request) { <br>
alert('Unfortunately your browser doesn't support this feature.'); <br>
return false; <br>
} <br>
<br>
http_request.onreadystatechange = function() { <br>
if (http_request.readyState !== 4) { <br>
// not ready yet <br>
return; <br>
} <br>
if (http_request.status !== 200) { <br>
// ready, but not OK <br>
alert('There was a problem with the request.(Code: ' + http_request.status + ')'); <br>
return; <br>
} <br>
if (return_xml) { <br>
response = http_request.responseXML; <br>
} else { <br>
response = http_request.responseText; <br>
} <br>
// invoke the callback <br>
callback_function(response); <br>
}; <br>
<br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
}
Der Fluss des JavaScript -Code in der Anwendung ist wie folgt:
Die Funktion webconsole.Keyevent () ist mit dem OnKeyUp -Ereignis des Eingabefeldes beigefügt und wird jedes Mal aufgerufen, wenn eine Taste gedrückt und freigegeben wird. -
webconsole.keevent () prüft, ob die Taste mit Code 13 gedrückt wird (dies ist die Eingabetaste/Rückgabe -Taste).
-
Wenn die Eingabetaste gedrückt wird, ist die URL für die Anforderung so konstruiert wie SO: exec.php? Command = the-Command-Eingang durch den Benutzer
-
Die URL wird an unsere wiederverwendbare MakeHttprequest () -Funktion übergeben. Außerdem wird der Name der Rückruffunktion - webconsole.prinTreSult - als Parameter für MakeHttpRequest () bereitgestellt.
-
Nach einer erfolgreichen Serverantwort wird WebConsole.prinTreSult () genannt.
-
webconsole.printesult () aktualisiert das Ergebnis , scroll
- So könnte der Körper der KeyEvent () -Funktion aussehen:
Da wir nicht als drittes Parameter an MakeHttprequest () übergeben haben, wird die Textantwort (nicht XML) an PrinTreSult () übergeben.
var callmeback = alert;<br>
callmeback('test'); // alerts 'test'
Schauen wir uns als nächstes die Funktion an, die das Ergebnis
aktualisiert. Es gibt einen schnellen Weg, um dieses
zu aktualisieren, und das soll die innere Eigenschaft des Elements wie SO:
verwenden
, aber die Verwendung von Innerhtml zum dynamischen Aktualisieren von Webseiten ist entmutigt, da er den HTML -Code als Zeichenfolge behandelt, während das moderne Webdesign -Denken die Seite bevorzugt, die ein Dokument mit einem XML -Baum mit Knoten enthält, das über die DOM -Methoden und -eigenschaften zugänglich ist. Der DOM ist der Pfad, den wir jetzt einschlagen werden, um unsere
zu aktualisieren.
function alertContents(text) { <br>
alert(text); <br>
} <br>
<br>
function makeRequest(url) { <br>
makeHttpRequest(url, alertContents); <br>
}
Hier ist die Funktion; Darunter finden Sie einige Hinweise, wie es funktioniert:
Diese Funktion:
<button >Make a request</button> <br>
<script type="text/javascript"> <br>
document.getElementById('mybutton').onclick = function() { <br>
makeHttpRequest('test.html', alert); <br>
} <br>
</script>
-
Fügt den Befehl hinzu, der in die zum Ergebnis
eingegeben wurde, indem ein neuer Textknoten erstellt und dem Dokumentbaum hinzugefügt wurde
- Zeigt das Ergebnis der Befehlsausführung an. Dies geschieht durch Aufspalten des Ergebnisses in Linien und addiert jede Zeile in den Dokumentbaum, während jede dieser Zeilen in
-Tags einwickelt, um den Abstand zu erhalten. Wir müssen das Ergebnis aufteilen, da es mehrere Zeilen enthalten kann (stellen Sie sich das Ergebnis vor, wenn ein 'ls -La' (oder 'Dir' unter Windows) ausgeführt wurde)
- fügt einen neuen Cursor-ähnlichen Textknoten hinzu (:->)
- scrollen Sie die
mithilfe der Scrolltop- und ScrollHeight-Eigenschaften (nicht-W3C-Standard, aber von modernen Browsern unterstützt)
- löscht den Befehl , damit der nächste Befehl eingegeben werden kann
Die letzte Aufgabe im JavaScript besteht darin, die Ereignisse zu verarbeiten:
- Formulare sind einfach "gedämpft", damit keine Seite aktualisiert wird
- Die Methode webconsole.keevent () ist dem Schlüssel -Ereignis der Eingabe angehängt, in der Befehle getippt werden.
<button >Make a request</button> <br>
<br>
<script type="text/javascript"> <br>
<br>
var http_request = false; <br>
<br>
function makeRequest(url) { <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7... <br>
http_request = new XMLHttpRequest(); <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
http_request = new ActiveXObject("Microsoft.XMLHTTP"); <br>
} <br>
http_request.onreadystatechange = alertContents; <br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
<br>
} <br>
<br>
function alertContents() { <br>
if (http_request.readyState == 4) { <br>
if (http_request.status == 200) { <br>
alert(http_request.responseText); <br>
} else { <br>
alert('There was a problem with the request.'); <br>
} <br>
} <br>
} <br>
<br>
document.getElementById('mybutton').onclick = function() { <br>
makeRequest('test.html'); <br>
} <br>
<br>
</script>
Und da gehen Sie! Dies war das letzte Stück des Puzzles. Was wir jetzt haben, ist eine funktionierende Ajax -Anwendung, die von Grund auf neu erstellt wurde.
Ein kleines zusätzliches
Wenn Sie neugierig genug waren, um den Quellcode des vorherigen Beispiels zu betrachten, haben Sie möglicherweise festgestellt, dass diese App ein bisschen mehr hat als das, was wir bisher besprochen haben. Das kleine Extra ist nicht wirklich AJAX-bezogen, aber die Anwendung fühlt sich eher wie eine Eingabeaufforderung an. Die fragliche Funktionen beinhalten die Verwendung der Auf und Ab -Pfeil -Tasten, um auf den Verlauf der in einer Sitzung verwendeten Befehle zuzugreifen.
Nehmen wir an, Sie haben 'ls -la' und dann 'ls' ausgeführt. Wenn Sie auf die Taste für den UP-Arrow-Taste klicken, wird der Befehl mit dem Befehl vorgefüllt, der zuletzt verwendet wurde. Das heißt, 'ls'. Klicken Sie erneut auf die Taste auf dem up -arrow und die Befehlseingabe werden 'ls -la' angezeigt. Schlagen Sie den Down-Arm-Schlüssel. Sie erreichen erneut 'LS', wenn Sie sich durch die Geschichte der Befehle bewegen. Probieren Sie es selbst aus.
Die Implementierung dieser Funktion ist nicht schwierig. Wir brauchen nur ein Array, das alle bisher ausgeführten Befehle speichert:
Webconsole.commands_history = [];
… und ein Array -Zeiger (eine Ganzzahl), die sich daran erinnert, wo wir waren:
function makeHttpRequest(url, callback_function, return_xml) <br>
{ <br>
var http_request, response, i; <br>
<br>
var activex_ids = [ <br>
'MSXML2.XMLHTTP.3.0', <br>
'MSXML2.XMLHTTP', <br>
'Microsoft.XMLHTTP' <br>
]; <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+... <br>
http_request = new XMLHttpRequest(); <br>
if (http_request.overrideMimeType) { <br>
http_request.overrideMimeType('text/xml'); <br>
} <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
for (i = 0; i < activex_ids.length; i++) { <br>
try { <br>
http_request = new ActiveXObject(activex_ids[i]); <br>
} catch (e) {} <br>
} <br>
} <br>
<br>
if (!http_request) { <br>
alert('Unfortunately your browser doesn't support this feature.'); <br>
return false; <br>
} <br>
<br>
http_request.onreadystatechange = function() { <br>
if (http_request.readyState !== 4) { <br>
// not ready yet <br>
return; <br>
} <br>
if (http_request.status !== 200) { <br>
// ready, but not OK <br>
alert('There was a problem with the request.(Code: ' + http_request.status + ')'); <br>
return; <br>
} <br>
if (return_xml) { <br>
response = http_request.responseXML; <br>
} else { <br>
response = http_request.responseText; <br>
} <br>
// invoke the callback <br>
callback_function(response); <br>
}; <br>
<br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
}
Hier ist die Auflistung der Funktion webconsole.KeyEvent (). Die Zeilen, die sich mit der Geschichte der Geschichte befassen, werden fett gedruckt.
var callmeback = alert;<br>
callmeback('test'); // alerts 'test'
Hier finden Sie einige Hinweise darauf, wie die Funktion funktioniert, um den Befehlsgeschichte bereitzustellen:
- Wenn wir Eingabetaste drücken (Schlüsselcode 13) und eine Anforderung stellen, wird der ausgeführte Befehl zum addiertes Array von commands_history hinzugefügt, und der Array -Zeiger wird auf die neue Länge des Arrays zurückgesetzt.
- Wenn Sie den UP -Pfeil treffen (Schlüsselcode 38), was bedeutet, dass „zurückgehen“, werden wir history_pointer abnehmen und den Befehl mit dem vorherigen Befehl in der Verlaufsliste vorab auszuführen.
- Das Schlagen des Down -Pfeils erhöht den Zeiger um eins, und wir sehen den nächsten Befehl.
mit XML
arbeiten
Bisher haben wir nicht besprochen, wie XML -Dokumente anfordern und verwendet werden - das X in Ajax! Wir verwendeten die Responsext -Eigenschaft des XMLHTTP -Objekts. Das Anfordern des Dokuments unterscheidet sich nicht von dem, was wir bereits gesehen haben: Wir müssen nur unsere wiederverwendbare Anforderungsfunktion anweisen, Responsexml zurückzugeben, im Gegensatz zu Responsext. Wir tun dies, indem wir den dritten Parameter auf true festlegen:
<button >Make a request</button> <br>
<br>
<script type="text/javascript"> <br>
<br>
var http_request = false; <br>
<br>
function makeRequest(url) { <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7... <br>
http_request = new XMLHttpRequest(); <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
http_request = new ActiveXObject("Microsoft.XMLHTTP"); <br>
} <br>
http_request.onreadystatechange = alertContents; <br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
<br>
} <br>
<br>
function alertContents() { <br>
if (http_request.readyState == 4) { <br>
if (http_request.status == 200) { <br>
alert(http_request.responseText); <br>
} else { <br>
alert('There was a problem with the request.'); <br>
} <br>
} <br>
} <br>
<br>
document.getElementById('mybutton').onclick = function() { <br>
makeRequest('test.html'); <br>
} <br>
<br>
</script>
Dann müssen wir unser exec.php -Skript ändern, um gültige XML anstelle von einfachem Text zurückzugeben. Hier ist der Quellcode des neuen Skripts (exec_xml.php):
function makeHttpRequest(url, callback_function, return_xml) <br>
{ <br>
var http_request, response, i; <br>
<br>
var activex_ids = [ <br>
'MSXML2.XMLHTTP.3.0', <br>
'MSXML2.XMLHTTP', <br>
'Microsoft.XMLHTTP' <br>
]; <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+... <br>
http_request = new XMLHttpRequest(); <br>
if (http_request.overrideMimeType) { <br>
http_request.overrideMimeType('text/xml'); <br>
} <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
for (i = 0; i < activex_ids.length; i++) { <br>
try { <br>
http_request = new ActiveXObject(activex_ids[i]); <br>
} catch (e) {} <br>
} <br>
} <br>
<br>
if (!http_request) { <br>
alert('Unfortunately your browser doesn't support this feature.'); <br>
return false; <br>
} <br>
<br>
http_request.onreadystatechange = function() { <br>
if (http_request.readyState !== 4) { <br>
// not ready yet <br>
return; <br>
} <br>
if (http_request.status !== 200) { <br>
// ready, but not OK <br>
alert('There was a problem with the request.(Code: ' + http_request.status + ')'); <br>
return; <br>
} <br>
if (return_xml) { <br>
response = http_request.responseXML; <br>
} else { <br>
response = http_request.responseText; <br>
} <br>
// invoke the callback <br>
callback_function(response); <br>
}; <br>
<br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
}
Auf diese Weise wird das neue serverseitige Skript Folgendes zurückgeben, wenn wir den Befehl 'ls test.html' ausführen:
var callmeback = alert;<br>
callmeback('test'); // alerts 'test'
Wenn wir einen Befehl ausführen, der mehr Zeilen zurückgibt (z.
navigieren wir mit den JavaScript -DOM -Funktionen im obigen XML
Hier ist der Körper der neuen Webconsole.prinTreSult () -Methode:
Um das Ergebnis
mit den Daten aus dem XML -Dokument zu aktualisieren, folgen wir der Prozedur:
function alertContents(text) { <br>
alert(text); <br>
} <br>
<br>
function makeRequest(url) { <br>
makeHttpRequest(url, alertContents); <br>
}
Zugriff auf einen Knoten aus der Quelle XML.
-
Erhalten Sie seinen Wert.
-
Erstellen Sie einen neuen Knoten.
-
enden Sie es an den -Zielbaum an.
-
Wie Sie im Code xmldoc.getElementsByTagName ('Befehl') sehen, wird verwendet und gibt eine Sammlung (ein Array-ähnliches Listenobjekt) aller
wir nehmen den Knotenwert und erstellen einen neuen Textknoten, um die wie folgt anzuhängen:
<button >Make a request</button> <br>
<script type="text/javascript"> <br>
document.getElementById('mybutton').onclick = function() { <br>
makeHttpRequest('test.html', alert); <br>
} <br>
</script>
wir machen dasselbe mit dem
-Tag des XML -Dokuments. Erstens bekommen wir alle s: <form action="exec.php" method="get" > <br>
<div <br>
<br>
> <br>
Welcome to the WebConsole! <br>
<br /> <br>
:-> <br>
</div> <br>
<input <br>
<br>
name="command" <br>
<br>
type="text" /> <br>
</form>
Dann schauen wir jedes Element in der result_collection durch. Auch hier wickeln wir jede Ergebniszeile in Tags ein. <pre class="brush:php;toolbar:false">.console { <br>
margin: 0px; <br>
font-family: courier; <br>
color: gray; <br>
background-color: black; <br>
} <br>
#result { <br>
overflow: auto; <br>
padding: 5px; <br>
height: 400px; <br>
} <br>
#result pre { <br>
display: inline; <br>
} <br>
#command { <br>
width: 100%; <br>
border: 1px solid white; <br>
}
Wie Sie sehen, ist es nicht viel schwieriger, mit dem Xmldocument zu arbeiten, als mit der einfachen Textantwort zu arbeiten. Sie können die XML -Version des Webconsole selbst testen.
Verwenden Sie JQuery
jQuery ist eine beliebte JavaScript -Bibliothek. Versuchen wir es für unsere AJAX -Funktionalität anstelle der wiederverwendbaren Funktion für makeHttprequest ().
Zuerst müssen Sie die neueste Version der Bibliothek von hier herunterladen (ich schlage die minimierte Version vor) und in die Seite ein:
<button >Make a request</button> <br>
<br>
<script type="text/javascript"> <br>
<br>
var http_request = false; <br>
<br>
function makeRequest(url) { <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7... <br>
http_request = new XMLHttpRequest(); <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
http_request = new ActiveXObject("Microsoft.XMLHTTP"); <br>
} <br>
http_request.onreadystatechange = alertContents; <br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
<br>
} <br>
<br>
function alertContents() { <br>
if (http_request.readyState == 4) { <br>
if (http_request.status == 200) { <br>
alert(http_request.responseText); <br>
} else { <br>
alert('There was a problem with the request.'); <br>
} <br>
} <br>
} <br>
<br>
document.getElementById('mybutton').onclick = function() { <br>
makeRequest('test.html'); <br>
} <br>
<br>
</script>
Es gab einen Teil, in dem wir Makehttprequest () wie folgt bezeichnet haben:
function makeHttpRequest(url, callback_function, return_xml) <br>
{ <br>
var http_request, response, i; <br>
<br>
var activex_ids = [ <br>
'MSXML2.XMLHTTP.3.0', <br>
'MSXML2.XMLHTTP', <br>
'Microsoft.XMLHTTP' <br>
]; <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+... <br>
http_request = new XMLHttpRequest(); <br>
if (http_request.overrideMimeType) { <br>
http_request.overrideMimeType('text/xml'); <br>
} <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
for (i = 0; i < activex_ids.length; i++) { <br>
try { <br>
http_request = new ActiveXObject(activex_ids[i]); <br>
} catch (e) {} <br>
} <br>
} <br>
<br>
if (!http_request) { <br>
alert('Unfortunately your browser doesn't support this feature.'); <br>
return false; <br>
} <br>
<br>
http_request.onreadystatechange = function() { <br>
if (http_request.readyState !== 4) { <br>
// not ready yet <br>
return; <br>
} <br>
if (http_request.status !== 200) { <br>
// ready, but not OK <br>
alert('There was a problem with the request.(Code: ' + http_request.status + ')'); <br>
return; <br>
} <br>
if (return_xml) { <br>
response = http_request.responseXML; <br>
} else { <br>
response = http_request.responseText; <br>
} <br>
// invoke the callback <br>
callback_function(response); <br>
}; <br>
<br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
}
Verwenden Sie die Ajax () -Methode von JQuery, die Sie jetzt tun können:
var xhr = $ .ajax ({
URL: 'exec.php',
Daten: {'Befehl': the_shell_command},
Erfolg: webconsole.printresult
});
Mal sehen, was wir hier haben:
- $ ist ein kurzer Name für JQuery; Sie können dies stattdessen auch tun: jQuery.ajax
- Wir rufen die AJAX () -Methode auf und übergeben ein Objekt, das eine URL enthält, um ein Datenobjekt (das von JQuery in eine Abfragezeichenfolge in eine Abfragezeichenfolge konvertiert wird) und eine Rückruffunktion zum Aufrufen, sobald die Antwort eintrifft.
Ein funktionierendes Beispiel für die Webkonsole mit JQuery finden Sie hier.
Es gibt mehr Möglichkeiten zu Ajax mit JQuery, da ein Blick auf die Dokumentation bestätigt wird. Zum Beispiel könnte eine häufig wiederholte Aufgabe zur Aktualisierung eines
(mit ID myDiv) mit dem Inhalt der Datei (test.html) so einfach sein wie:
var callmeback = alert;<br>
callmeback('test'); // alerts 'test'
siehe ein Beispiel hier.
yui
Eine weitere beliebte JavaScript -Bibliothek ist Yui (Yahoo Interface Library). Mal sehen, wie wir unsere Webkonsole mit der AJAX -Funktionalität von Yui zum Laufen bringen können.
Wir müssen YUI -Dateien nicht herunterladen, da sie bereits kostenlos von Yahoo gehostet werden und von ihrem aktuellen Standort aus verwendet werden können. Die AJAX -Funktionalität wird vom Dienstprogramm Connection Manager bereitgestellt, das Sie in Ihre Seiten wie SO aufnehmen:
function alertContents(text) { <br>
alert(text); <br>
} <br>
<br>
function makeRequest(url) { <br>
makeHttpRequest(url, alertContents); <br>
}
Um Yui zu nutzen, ersetzen wir den Aufruf an MakeHttprequest () durch:
// yui's ajax
Yahoo.util.connect.asyncrequest (
'Get',
'exec.php? command =' Escape (the_shell_command),
{
Erfolg: Funktion (xhr) {
Webconsole.printesult (xhr.responsetext)
}
}
);
Sie können sehen, dass die asyncrequest () -Methode:
dauert:
-
Anforderungsmethode (Get, Post, Head, Löschen usw.) -
url -
Ein Objekt, das Funktionen enthält, um Erfolgs- und Fehlerszenarien zu bewältigen
yui übergibt xmlhttprequest -Objekte an die Handlerfunktionen, so
Sie können sehen, wie die URL durch Verkettung und Flucht von Saiten erzeugt wurde. In diesem Fall gibt es nur einen Wert, den wir durch die Abfragebarstellung verlaufen möchten. Aber wenn es mehr gibt, wird es ziemlich unpraktisch. Yui hilft Ihnen dabei, solche Situationen leicht umzugehen, indem Sie eine Setform () -Methode bereitstellen. Sobald Sie das Formular eingestellt haben, nimmt Yui die Werte aus dem Formular und kümmert sich darum, die Abfragezeichenfolge zu entkommen und zu nähen:
Yahoo.util.connect.setform (document.forms [0]);
Yahoo.util.connect.asyncrequest (
'Get',
'exec.php',
{
Erfolg: Funktion (xhr) {
Webconsole.printesult (xhr.responsetext)
}
}
);
Hier ist ein funktionierendes Beispiel für die Webkonsole mit Yui.
Verwenden Sie JSON
JSON (JavaScript -Objektnotation) ist ein beliebtes Datenaustauschformat. Es gibt Ihnen eine weitere Alternative zum Klartext oder XML, wenn es darum geht, Daten vom Server mit dem Browser zu kommunizieren. JSON ist extrem einfach; Im Wesentlichen ist es nur JavaScript.
In JavaScript können Sie ein Array und ein Objekt wie folgt definieren:
<button >Make a request</button> <br>
<br>
<script type="text/javascript"> <br>
<br>
var http_request = false; <br>
<br>
function makeRequest(url) { <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7... <br>
http_request = new XMLHttpRequest(); <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
http_request = new ActiveXObject("Microsoft.XMLHTTP"); <br>
} <br>
http_request.onreadystatechange = alertContents; <br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
<br>
} <br>
<br>
function alertContents() { <br>
if (http_request.readyState == 4) { <br>
if (http_request.status == 200) { <br>
alert(http_request.responseText); <br>
} else { <br>
alert('There was a problem with the request.'); <br>
} <br>
} <br>
} <br>
<br>
document.getElementById('mybutton').onclick = function() { <br>
makeRequest('test.html'); <br>
} <br>
<br>
</script>
Sie können dasselbe tun, aber mit Array- und Objektliteralen wie SO:
function makeHttpRequest(url, callback_function, return_xml) <br>
{ <br>
var http_request, response, i; <br>
<br>
var activex_ids = [ <br>
'MSXML2.XMLHTTP.3.0', <br>
'MSXML2.XMLHTTP', <br>
'Microsoft.XMLHTTP' <br>
]; <br>
<br>
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+... <br>
http_request = new XMLHttpRequest(); <br>
if (http_request.overrideMimeType) { <br>
http_request.overrideMimeType('text/xml'); <br>
} <br>
} else if (window.ActiveXObject) { // IE6 and older <br>
for (i = 0; i < activex_ids.length; i++) { <br>
try { <br>
http_request = new ActiveXObject(activex_ids[i]); <br>
} catch (e) {} <br>
} <br>
} <br>
<br>
if (!http_request) { <br>
alert('Unfortunately your browser doesn't support this feature.'); <br>
return false; <br>
} <br>
<br>
http_request.onreadystatechange = function() { <br>
if (http_request.readyState !== 4) { <br>
// not ready yet <br>
return; <br>
} <br>
if (http_request.status !== 200) { <br>
// ready, but not OK <br>
alert('There was a problem with the request.(Code: ' + http_request.status + ')'); <br>
return; <br>
} <br>
if (return_xml) { <br>
response = http_request.responseXML; <br>
} else { <br>
response = http_request.responseText; <br>
} <br>
// invoke the callback <br>
callback_function(response); <br>
}; <br>
<br>
http_request.open('GET', url, true); <br>
http_request.send(null); <br>
}
Diese wörtliche Notation verwendet JSON, um Daten zu übergeben. Die Zitate rund um Eigenschaften in JavaScript sind die meiste Zeit nicht erforderlich, aber sie sind durch Konvention in JSON erforderlich.
Ändern wir unsere Konsole so, dass das JSON -Format zum Übertragen von Daten verwendet wird. Der Fluss wäre:
- PHP auf der Serverseite erstellt ein assoziatives Array mit dem Ergebnis und konvertiert es dann mit der integrierten Funktion json_encode () in JSON, die nur PHP5 ist. Es wäre jedoch trivial, die Antwort sogar manuell zu codieren. Die JSON -Zeichenfolge wird zurückgegeben.
- JavaScript im Browser empfängt die JSON -Zeichenfolge und verwandelt sie in ein nationales JavaScript -Objekt. Eine unsichere Möglichkeit, dies zu tun, besteht darin, die Funktion eval () zu verwenden. Der bessere Weg ist, die kostenlose JSON -Bibliothek zu verwenden.
Wenn der von uns ausgeführte Befehl LS beispielsweise LS ist, ist die JSON -Antwort vom Server so etwas wie das folgende (formatiert und zur Lesbarkeit gekürzt):
var callmeback = alert;<br>
callmeback('test'); // alerts 'test'
Wie Sie sehen, ist JSON leichter als XML, da es keine Schließetags, XML -Dokument -Tags oder Root -Knoten gibt.
Ändern unseres serverseitigen Skripts, um JSON zurückzugeben, führt dazu:
function alertContents(text) { <br>
alert(text); <br>
} <br>
<br>
function makeRequest(url) { <br>
makeHttpRequest(url, alertContents); <br>
}
In JavaScript wird der Teil von webconsole.printresult, der die Daten akzeptiert, werden:
<button >Make a request</button> <br>
<script type="text/javascript"> <br>
document.getElementById('mybutton').onclick = function() { <br>
makeHttpRequest('test.html', alert); <br>
} <br>
</script>
Sie können sehen, wie nach dem Eval () Daten zu einem normalen JavaScript -Objekt werden, und Sie können auf die Eigenschaften zugreifen, wie z. B. Daten.Result und Data.Command. Wie bereits erwähnt, ist Eval () ein weniger als sicherer Weg, um eine JSON-codierte Zeichenfolge in ein Objekt zu verwandeln. Ein besserer Weg ist die Verwendung der JSON -Bibliothek, die uns hilft, den Aufruf eval () damit zu ersetzen:
<form action="exec.php" method="get" > <br>
<div <br>
<br>
> <br>
Welcome to the WebConsole! <br>
<br /> <br>
:-> <br>
</div> <br>
<input <br>
<br>
name="command" <br>
<br>
type="text" /> <br>
</form>
Ein funktionierendes JSON -Beispiel ist hier.
Sicherheitserinnerung
Für die Zwecke der Demonstration dieser Anwendung ermöglicht ich nur, dass nur ein vordefinierter Satz harmless -Befehle auf meinem Webserver ausgeführt wird. Wenn Sie die Liste der Befehle erweitern oder einen Befehl zulassen, vergessen Sie nicht, das Verzeichnis auf Ihrem Server zu schützen, in dem Sie die Anwendung installieren. Wenn Sie diese Anwendung für Fremde zugänglich lassen, können Sie verheerende Ergebnisse erzielen. Es ist ziemlich leistungsfähig: Dadurch kann der Benutzer einen Befehl ausführen, einschließlich, aber nicht beschränkt darauf, alles auf Ihrem Webserver zu löschen!
Schlussfolgerung
Wir sind am Ende unseres Beispiels AJAX -Anwendung gekommen. Sie kennen die Grundlagen, Sie haben die Aktion gesehen und Sie sind mit genügend Wissen bewaffnet, um selbst zu experimentieren. Sie können sich aufwärmen, indem Sie den Code dieses Artikels ändern und herumspielen - alles ist im Herunterladungscode -Archiv enthalten - und wechseln dann zu Ihren eigenen Projekten.
Dies sind aufregende Zeiten: Das Gesicht des Webs hat dank Remote -Skripten große Veränderungen. Wir haben die Phase der Early Adopters (Google, Amazon, Flickr, Yahoo) bestanden und jetzt wird das Remote-Scripting mit Ajax immer häufiger, wenn reaktionsschnelle und benutzerfreundliche Webseiten erstellt werden. Ihre Besucher sind heutzutage bereits verwöhnt, indem Sie Google Mail und Flickr verwenden, und Sie können es sich nicht leisten, sie mit statischen Webseiten im statischen Web 1.0 zu beleidigen!
häufig gestellte Fragen zu Ajax
Was ist der Unterschied zwischen synchronem und asynchronem AJAX? Dies bedeutet, dass die Benutzeroberfläche nicht mehr reagieren oder einfrieren ", bis die Anfrage abgeschlossen ist. Andererseits blockieren asynchrone AJAX -Anforderungen die Ausführung des Restes des Codes nicht. Sie ermöglichen es der Benutzeroberfläche, während der Anforderung bearbeitet zu bleiben. Aus diesem Grund werden asynchrone Anforderungen im Allgemeinen gegenüber synchronen In der Webentwicklung bevorzugt. XML war anfangs das häufigste Format für AJAX. JSON ist jedoch aufgrund seiner leichten Natur und ihrer Benutzerfreundlichkeit mit JavaScript beliebter geworden. Ajax kann diese Datenformate analysieren und die Webseite aktualisieren, ohne die gesamte Seite neu zu laden. Beispielsweise können Sie AJAX mit JQuery, einer beliebten JavaScript -Bibliothek, verwenden, um den Prozess der Erstellung von AJAX -Anforderungen zu vereinfachen. AJAX kann auch mit serverseitigen Sprachen wie PHP verwendet werden, um Daten aus einer Datenbank abzurufen.
Welche Sicherheitsauswirkungen haben die Verwendung von AJAX? Da AJAX das Senden und Empfangen von Daten zwischen Client und Server beinhaltet, kann es anfällig für Angriffe wie Cross-Site-Skripten (XSS) und CSRF (Cross-Site-Anfrage) sein. Daher ist es wichtig, ordnungsgemäße Sicherheitsmaßnahmen bei der Verwendung von AJAX zu implementieren, z. B. die Validierung und Bereinigung von Eingabedaten. Google hat jedoch Fortschritte beim Crawling JavaScript gemacht und kann AJAX -Inhalte in gewissem Maße indexieren. Um sicherzustellen, dass Ihr AJAX-Inhalt seo-freundlich ist, können Sie Techniken wie progressive Verbesserung und anmutiger Abbau verwenden. Beispielsweise kann die HTML5 -Historie -API mit AJAX verwendet werden, um navigable Seiten ohne vollständige Seite nachzuladen. CSS3 kann verwendet werden, um den aktualisierten Inhalt zu stylen. Dies umfasst Anwendungen wie Live -Suchergebnisse, Formulareinreichungen, Chat -Anwendungen und interaktive Karten. Sie können eine Funktion definieren, die ausgeführt werden soll, wenn ein Fehler auftritt, wenn die Anforderung verarbeitet wird. Diese Funktion kann Informationen über den Fehler liefern und entsprechende Maßnahmen ergreifen, z. B. die Benachrichtigung des Benutzers oder die Protokollierung des Fehlers.
Können AJAX -Anforderungen zwischengespeichert werden? Durch das Zwischenspeichern einer AJAX -Anfrage wird die Antwort gespeichert, sodass die gespeicherte Antwort verwendet werden kann, anstatt eine neue Anfrage zu stellen, wenn dieselbe Anfrage erneut gestellt wird. Dies sollte jedoch sorgfältig verwendet werden, da es zu veralteten Daten führen kann.
Wie kann ich Ajax debuggen? Mit diesen Tools können Sie AJAX -Anfragen und Antworten überprüfen, den Status von Anfragen überprüfen und alle auftreten. Sie können auch Konsolen.log -Anweisungen in Ihrem JavaScript -Code verwenden, um Informationen zum Debugging -Zweck in die Konsole auszugeben.