Hallo,
Opera 7.6 https://forum.selfhtml.org/?t=87969&m=525965 unterstützt neuerdings neben Microsofts XMLHTTPRequest-Quasistandard http://msdn.microsoft.com/library/en-us/xmlsdk/html/xmobjPMEXMLHttpRequest.asp den W3C-Standard DOM 3 Load and Save http://www.w3.org/TR/DOM-Level-3-LS/load-save.html. Ich habe einige Tests durchgeführt:
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>DOM 3 Load & Save Test</title>
</head>
<body>
<script type="text/javascript">
// <![CDATA[
// Parser erzeugen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSParser
var parser = document.implementation.createLSParser(1, null);
try {
// XHTML-Dokument aus externer Quelle einlesen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSParser-parseURI
var doc = parser.parseURI('beispiel.xhtml');
// doc ist ein »Document«-Objekt gemäß DOM 3 Core
} catch (e) {
alert('parser.parseURI: Fehlercode '+e.code);
}
// Zugriff auf den erzeugten DOM-Baum: Titel ausgeben
alert(doc.getElementsByTagName('title').item(0).firstChild.nodeValue);
// beispiel.xhtml darf keine Dokumenttyp-Deklaration haben, sonst bricht das Parsen mit LSException.PARSE_ERR ab. Woher kommt das?
// Serializer erzeugen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSSerializer
var serializer = document.implementation.createLSSerializer();
// eingelesenen DOM-Baum wieder in Markup umwandeln http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-writeToString
var xmlstring = serializer.writeToString(doc);
alert(xmlstring);
// Komplexeres Ausgaben über write http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-write
// LSOutput-Objekt erstellen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSOutput / http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSOutput
var output = document.implementation.createLSOutput();
try {
var serialize_result = serializer.write(doc, output);
} catch (e) {
alert('serializer.write: Fehlercode '+e.code);
// Hier kommt 19 (DOMException.NOT_SUPPORTED_ERR), diese Methode unterstützt Opera also nicht
}
if (serialize_result) // serialize_result ist demnach undefined
alert(output);
// Dokument mit HTTP PUT senden http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSSerializer-writeToURI
try {
var serialize_result = serializer.writeToURI(doc, 'beispiel.php');
// Hier kommt 19 (DOMException.NOT_SUPPORTED_ERR), diese Methode unterstützt Opera also nicht
} catch (e) {
alert('serializer.writeToURI: Fehlercode '+e.code);
}
if (serialize_result) // serialize_result ist demnach undefined
alert(output);
// Schade, vielleicht können wir XMLHttpRequest.open für einen PUT-Request benutzen?
var request1 = new XMLHttpRequest();
request1.onreadystatechange = function () {
alert('PUT-Request readyState: '+request1.readyState);
alert('PUT-Request status: '+request1.status);
};
request1.open('PUT', 'beispiel.php', true);
request1.send(xmlstring);
// Schade, es tut sich nichts, der Request wird nicht abgesendet. Ob es wenigstens mit POST geht?
var request2 = new XMLHttpRequest();
// request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // Diese Methode kennt Opera nicht. Er sendet immer Content-Type: text/xml; charset=utf-8
fired=0;
request2.onreadystatechange = function () {
if (request2.readyState != 4)
return;
// Huch, onreadystatechange wird drei Mal gefeuert mit readyState==4
alert('POST-Request status: '+request2.status);
alert('POST-Request responseText: '+request2.responseText); // OK
alert('POST-Request responseXML: '+request2.responseXML); // OK
// alert('POST-Request responseBody: '+request2.responseBody); // undefined
// alert('POST-Request responseStream: '+request2.responseStream); // undefined
};
request2.open('POST', 'beispiel.php', true);
// request2.send('data=test'); // application/x-www-form-urlencoded ist wie gesagt nicht möglich
request2.send('<?xml version="1.0" ?><data>test</data>');
// String mit XML-Markup in ein DOM Core »Document«-Objekt parsen
// Zunächst ein passendes LSInput-Objekt erstellen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSInput / http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DOMImplementationLS-createLSInput
var input = document.implementation.createLSInput();
// Die folgenden drei Attribute müssen anscheinend nicht gesetzt werden
input.systemId = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd';
input.publicId = '-//W3C//DTD XHTML 1.0 Strict//EN';
input.encoding = 'ISO-8859-1';
input.stringData = '<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"><head><title>Testtitel</title></head><body><p>Testabsatz</p></body></html>';
try {
// Parsen http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSParser-parse
var doc = parser.parse(input);
// doc ist ein »Document«-Objekt gemäß DOM 3 Core
} catch (e) {
alert('parser.parse: Fehlercode '+e.code);
}
// Zugriff auf den erzeugten DOM-Baum: Titel ausgeben
alert(doc.getElementsByTagName('title').item(0).firstChild.nodeValue);
// ]]>
</script>
</body>
</html>
Vielleicht hat jemand Lust, das zu ergänzen.
Was ich noch nicht verstanden bzw. herausbekommen habe:
Was genau ist der Unterschied zwischen LSInput.characterStream, LSInput.byteStream und LSInput.stringData? Wie kann man die ersten beiden verwenden?
Wie kann man mit LSParserFilter, LSProgressEvent und LSLoadEvent arbeiten?
Allgemeine Tests zu XMLHTTPRequest fände ich ebenfalls interessant.
Mathias