AJAX

ondrej.zara@firma.seznam.cz

Obsah

  1. High-level: HTTP požadavek
  2. Ukázka API XMLHttpRequest
  3. Problematika asynchronnosti
  4. AJAX
  5. Problematika UTF-8

High-level: HTTP požadavek

CORS: jak obejít cross-domain restriction

Ukázka API XMLHttpRequest

var xhr = new XMLHttpRequest(); xhr.open("post", "/search", true); /* async */ xhr.setRequestHeader("A", "B"); xhr.send("field1=value1&field2=value2");

Změna stavu – callback

var zmenaStavu = function() { /* zde je mozno pracovat s odpovedi, pokud nejaka dorazila */ } xhr.onreadystatechange = zmenaStavu; xhr.send(...);

Zpracování odpovědi

var zmenaStavu = function() { /* tento callback se vola v kontextu instance XMLHttpRequestu */ if (this.readyState != 4) { return; } if (this.status != 200) { alert("HTTP/" + this.status); return; } alert(this.responseText); }

Problematika asynchronnosti

Problémy s kontextem

Řešení #1: procpat kontext pomocí uzávěry

Map.prototype.search = function() { var self = this; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { var response = this.responseText; self.showResults(response); } xhr.send(); }

Problémy s kontextem

Řešení #2: bind

Map.prototype.search = function() { var xhr = new XMLHttpRequest(); var response = function() { var response = xhr.responseText; /* kde se vzalo XHR? */ this.showResults(response); } response = response.bind(this); xhr.onreadystatechange = response; xhr.send(); }

Problémy s kontextem

Řešení #3: (privátní) vlasnost

Map.prototype.response = function() { var response = this._xhr.responseText; this.showResults(response); } Map.prototype.search = function() { this._xhr = new XMLHttpRequest(); this._xhr.onreadystatechange = this.response.bind(this); this._xhr.send(); }

AJAX

Problematika UTF-8

Konec

Prostor pro otázky