Webentwicklung - WebarchitekturenHochschule für Technik und Wirtschaft Berlin, Dipl.-Inform. Thomas Ziemer |
|
|
Dipl.-Inform. Thomas Ziemer
%messages.pagePresentation.showMaximized%Die JSON-Syntax wurde von der JavaScript Object Notation abgeleitet, also derjenigen Notation, mittels der man auf JavaScript-Objekte zugreift:
var person = {
"name": "John", // Strings erfordern doppelte Anführungszeichen!
"age": 30,
"rich": true,
"cars": { // ein Objekt
"car1": "BMW",
"car2": "Audi"
}
}
var person = {
"name": "John",
"age": 30,
"rich": true,
"cars": ["BMW", "Audi"] // ein Array
}
Um in ein JSON-Objekt umgewandelt werden zu können, müssen die Werte eines JavaScript-Objekts einen der folgenden Typen besitzen:
var person = {
"name": "John",
"age": 30,
"rich": true,
"address": {
"street": "Oxford Street",
"city": "London"
},
"cars": ["BMW", "Audi"]
}
var name = person.name;
oder var name = person["name"];
var street = person.address.street;
var person = {
"name": "John",
"age": 30,
"rich": true,
"address": {
"street": "Oxford Street",
"city": "London"
},
"cars": ["BMW", "Audi"]
}
person.name = "Jane";
oder person["name"] = "Jane";
delete person.name;
// der delete-Operator löscht Objekt-Eigenschaften
var person = {
"name": "John",
"age": 30,
"rich": true,
"address": {
"street": "Oxford Street",
"city": "London"
},
"cars": ["BMW", "Audi"]
}
var car = person.cars[0];
person.cars[1] = "Mercedes";
var person = {
"name": "John",
"rich": true,
"address": {
"street": "Oxford Street",
"city": "London"
},
"cars": ["BMW", "Audi"]
}
// Autos iterieren und in HTML-Element schreiben
var carsListRef = document.getElementById("cars");
for (i in person.cars) {
carsListRef.innerHTML += person.cars[i] + " ";
}
Es wird in JavaScript mittels Methoden der JSON
-Klasse zwischen JavaScript- und JSON-Objekten hin und her konvertiert:
var jsObject = JSON.parse(jsonObject);
var jsonObject = JSON.stringify(jsObject);
Die stringify()
-Methode kann auch mit JavaScript-Arrays umgehen:
var jsArray = ["John", "Peter", "Sally", "Jane"];
var jsonArray = JSON.stringify(jsArray);
Der Datumstyp wird in einem JSON-Objekt nicht unterstützt.
Datumswerte müssen deshalb als String repräsentiert werden:
var jsonObject = '{"name": "Jane", "birth": "1969-01-04"}';
var jsObject = JSON.parse(jsonObject);
jsObject.birth = new Date(jsObject.birth);
Hier erkennt man deutlich, dass JavaScript alles andere ist, aber keine typsichere Sprache!
Die Methode JSON.stringify()
konvertiert Datumswerte in einem JavaScript-Objekt automatisch in JSON-Strings:
var jsObject = {"name": "Jane", "today": new Date()};
var jsonObject = JSON.stringify(jsObject );
JavaScript-Funktionen sind in JSON-Objekten übrigens ebenfalls nicht erlaubt. Die stringify()
-Methode ignoriert diese bei der Konvertierung eines JavaScript-Objekts.
Der reviver
-Parameter der parse()
-Methode ist eine Funktion, die jede JSON-Eigenschaft prüft, und bei Bedarf eine Konvertierung des danach zurückgelieferten Wertes vornehmen kann:
var jsonObject = '{"name": "Jane", "birth": "1969-01-04"}';
var jsObject = JSON.parse(jsonObject, function(key, value) {
if (key == "birth") {
return new Date(value);
} else {
return value;
}
});
var xmlHttpRequest = new XMLHttpRequest();
var url = "https://host/rest/api/v1/aRestMethod/" + aParam;
// XMLHttpRequest.open(method, url[, async][, user][, password])
xmlHttpRequest.open("POST", url);
xmlHttpRequest.setRequestHeader("Content-type", "application/json");
xmlHttpRequest.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
var jsResponseObject = JSON.parse(this.responseText);
…
}
};
// XMLHttpRequest.send([body]);
xmlHttpRequest.send(JSON.stringify(jsRequestObject));
readyState | State | Bedeutung |
---|---|---|
0 | UNSENT |
Client has been created. open() not called yet. |
1 | OPENED |
open() has been called. |
2 | HEADERS_RECEIVED |
send() has been called, headers and status are available. |
3 | LOADING |
Downloading; responseText holds partial data. |
4 | DONE |
The operation is complete. |
HTML-Code:
<html>
<body>
<a onclick="saveProject();">Projekt speichern</a>
</body>
</html>
JavaScript-Code (der korrespondierende Event-Listener):
function saveProject() {
var xmlHttpSaveProject = new XMLHttpRequest();
…
}
Es gibt viele JavaScript-Events (hier finden Sie mehr), mit deren Hilfe man eine Funktionalität auslösen kann:
onmousedown
, onmouseup
, onclick
)onload
, onunload
)onmouseover
, onmouseout
)onchange
)onsubmit
)onkeydown
)
// Event feuert nach 5.000 Millisekunden
var autoSaveEvent = setTimeout(saveProject, 5000);
function saveProject() {
var xmlHttpSaveProject = new XMLHttpRequest();
…
}
Mit der Methode setInterval(function, milliseconds)
kann man einen regelmäßigen Timer erstellen.
Die Methoden clearTimeout(timeoutVariable)
bzw.
clearInterval(timerVariable)
beenden einen Event bzw. Timer.
Ein Browser analysiert ein HTML-Dokument und erstellt daraus im Arbeitsspeicher das Document Object Model, also eine Repräsentation dieses Dokuments, auf die man beispielsweise mit JavaScript zugreifen kann.
https://wiki.selfhtml.org/wiki/DOM
<html>
<head>
<title>Document Object Model</title>
</head>
<body>
<h1>Beispiel</h1>
<p>Das ist ein <a href="demo.html">einfaches</a> Beispiel.</p>
<!-- Dies ist ein Kommentar. -->
</body>
</html>
└─ html
├─ head
│ ├─ #text: ↵
│ ├─ title
│ │ └─ #text: DOM
│ └─ #text: ↵
├─ #text: ↵
└─ body
├─ #text: ↵
├─ h1
│ └─ #text: Document Object Model
├─ #text: ↵
├─ p
│ ├─ #text: Das ist ein
│ ├─ a href="demo.html"
│ │ └─ #text: einfaches
│ └─ #text: Beispiel.
├─ #text: ↵
├─ #comment: Dies ist ein Kommentar.
└─ #text:
Quelle:
wiki.selfhtml.org/wiki/JavaScript/DOM
Das Document Object Model ist nicht statisch, sondern kann durch DOM-Manipulation ausgelesen, verändert und erweitert werden:
JavaScript | Zugriff über... |
---|---|
getElementById() |
... die dokumentweit eindeutige Element-Id |
getElementsByName() |
... alle Elemente mit diesem Namen (Collection) |
getElementsByTagName() |
... alle HTML-Elemente dieses Typs (Collection) |
querySelector() |
... das erste Element mit dem CSS-Selektor |
querySelectorAll() |
... alle Elemente mit dem CSS-Selektor (Collection) |
Das document
-Objekt in JavaScript hält darüber hinaus verschiedene Collections mit den Referenzen von HTML-Elementen bestimmter Typen:
document.forms
mit allen HTML-Formularen (<form>
-Elementen)document.images
mit allen Bildern (<img>
-Elementen)document.links
mit allen Hyperlinks (<a>
-Elementen)createElement(tagName)
ein neues HTML-Element erstellen, und dieses mittels element.insertBefore()
und element.appendChild()
in das DOM einhängen. DOM-Element können ausgelesen und verändert werden:
element.innerText = "Hello world!"
spricht einen Textknoten an,element.innerHTML = "<strong>Huhu</strong>"
einen Elementknoten,element.style.color = "red"
das CSS des Elementknotens.Mittels Local Storage aus dem Web Storage API werden Schlüssel-/Wertpaare persistent (dauerhaft) im Browser abgelegt:
localStorage.setItem("key", "value")
einen Wert schreibenlocalStorage.getItem("key")
einen Wert lesenlocalStorage.removeItem("key")
Wert löschenlocalStorage.clear()
alle Werte der Domäne löschensessionStorage
ähnelt localStorage
und hat auch dieselben Methoden. Die Schlüssel-/Wertpaare stehen jedoch nur während des Browsens zur Verfügung und werden beim Schließen der Webseite (des Tabs) bzw. des Browsers gelöscht.
Conceptually, WebSocket is really just a layer on top of TCP. Basically it is intended to be as close to just exposing raw TCP to script as possible given the constraints of the Web.
WebSockets helfen, das klassische MVC-Konzept in Web-Applikationen zu realisieren. Zuvor musste mit asynchronem Polling (MVC Model 2) "geschummelt" werden. Nunmehr lässt sich realisieren:
var url = "ws://localhost:8080/swxercise/ws/api/v1/anEndpoint";
var webSocket = new WebSocket(url);
// Callback-Methoden für die WebSocket-Kommunikation
webSocket.onopen = function(e) { onWebSocketOpen(e) };
webSocket.onclose = function(e) { onWebSocketClose(e) };
webSocket.onmessage = function(e) { onWebSocketMessage(e) };
webSocket.onerror = function(e) { onWebSocketError(e) };
function onWebSocketMessage(e) {
var data = JSON.parse(e.data);
}
function sendMessage(message) {
if (webSocket.readyState === 1)
webSocket.send(message);
}
readyState | State | Bedeutung |
---|---|---|
0 | CONNECTING |
The connection is not yet open. |
1 | OPEN |
The connection is open and ready to communicate. |
2 | CLOSING |
The connection is in the process of closing. |
3 | CLOSED |
The connection is closed or couldn't be opened. |
Eine WebSocket-Verbindung wird durch die Methode
webSocket.close([code,] [reason])
geschlossen.
Mit code
kann ein optionaler Statuscode angegeben werden. Standardmäßig wird 1000 (Normal Closure) übertragen.
Mittels optionalem reason
kann der Grund angegeben werden, aus dem die WebSocket-Verbindung geschlossen wird (maximal 123 Bytes of UTF-8 Text).
Weitere Statuscodes sind hier dokumentiert.
wss://
erfolgenws://
erfolgen