Autor | Zpráva | ||
---|---|---|---|
xxxObiWan Profil |
#1 · Zasláno: 11. 5. 2010, 23:23:08
Ahoj,
snažím se si v JS vytvořit pro zjednodušení práce s ajaxem objekt Ajax, který by se používal takto: var Ajax1 = new Ajax(); Ajax1.setDivId('divObsah'); //výsledek se vloží do divu s id="divObsah" Ajax1.send("nejaka_stranka.html", "promenna1=ahoj&promenna2=nazdar"); //odeslání požadavku: Ajax.send(nazev_stranky, promenne) Zatím na to jdu takhle function Ajax(){ // KONSTRUKTOR // this.method = 'POST'; this.divId = ''; if( window.ActiveXObject ) this.HttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); else this.HttpRequest = new XMLHttpRequest(); // FUNKCE // this.setDivId = function(newDivId){ this.divId = newDivId; return true; }; this.send = function(url, vars){ this.HttpRequest.open(this.method, url, true); this.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); this.HttpRequest.onreadystatechange = this.prijmiData; this.HttpRequest.send(vars); }; this.prijmiData = function(){ document.getElementById(this.divId).innerHTML = 'loading...'; if( this.HttpRequest.readyState==4 ){ if( this.HttpRequest.status==200 ){ document.getElementById(this.divId).innerHTML = this.HttpRequest.responseText; } else{ document.getElementById(this.divId).innerHTML = 'Chyba '+this.HttpRequest.status+'.'; } } }; }; ale z nějakého neznámého důvodu jsou ve funkci prijmiData všechny proměnné this.cokoliv prázdné. Nevíte pls co s tím? Díky |
||
_es Profil |
#2 · Zasláno: 12. 5. 2010, 15:24:03
xxxObiWan:
V 18. riadku priraďuješ do vlastnosti HttpRequest.onreadystatechange vytvoreného objektu vlastnosť toho istého objektu prijmiData , ktorá má vtedy hodnotu undefined.
Ten kus kódu od 22. riadku treba presunúť pred to priradenie. |
||
Chamurappi Profil |
#3 · Zasláno: 12. 5. 2010, 15:40:04
Reaguji na _es:
Neřekl bych, že tohle bude příčina, protože metoda prijmiData se vytvoří při vytváření objektu a metoda send , která tuto metodu přiřazuje do události, se volá až později. Také popsaný projev problému tomu moc neodpovídá, z popisu xxxObiWana plyne, že se prijmiData volá, akorát tam je špatné this …
Reaguji na xxxObiWana: … a to this bude nejspíš instance XMLHttpRequest u.
„Nevíte pls co s tím?“ Normálně slušně česky poprosit neumíš? |
||
_es Profil |
#4 · Zasláno: 12. 5. 2010, 15:51:13 · Upravil/a: _es
Chamurappi:
„… a to this bude nejspíš instance XMLHttpRequestu.“ this bude novovytvorený objekt s konštruktorom Ajax .
Objekt XMLHttpReaquestu bude Ajax1.HttpRequest .
Možno tam bude nejakých podivností viac. Aha, už som to pochopil: Asi treba v tej funkcii this.HttpRequest zameniť len za this alebo nie, (teda v tej vlastnosti prijmiData )?
|
||
Časová prodleva: 4 dny
|
|||
Witiko Profil |
#5 · Zasláno: 16. 5. 2010, 15:48:10 · Upravil/a: Witiko
Tohle by nezpůsobilo zachování daného this? Lexical closure.
this.send = function(url, vars){ this.HttpRequest.open(this.method, url, true); this.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); this.HttpRequest.onreadystatechange = (function(){function() {this.prijmiData()}}).apply(this); this.HttpRequest.send(vars); }; Drycoded, připojené funkci je předán správný this, nicméně si nejsem jistý, jestli ho HttpRequest při triggernutí eventu nepřepíše. Pokud by nefungovalo, tohle by mělo již na 100%: this.send = function(url, vars){ this.HttpRequest.open(this.method, url, true); this.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); this.HttpRequest.onreadystatechange = (function(that){function() {that.prijmiData()}})(this); this.HttpRequest.send(vars); }; Zdá se, že this.HttpRequest.onreadystatechange = this.prijmiData; způsobí jen vytvoření reference na danou prijmiData funkci, this je předané samotným eventem, v tomto případě objektem HttpRequest. Jedná se o stejný problém, se kterým jsem se potýkal v topicu Propašování nové funkce k prototypu libovolného elementu. Element.prototype.alert = window.alert; Element.prototype.alert(); window.alert zde pouze slouží k předání reference a this je v tomto případě Element.prototype. K samotnému předání window jako this by došlo pouze v případě volání funkce, viz. window.alert(); |
||
Chamurappi Profil |
#6 · Zasláno: 16. 5. 2010, 19:29:16
Reaguji na Witika:
„Tohle by nezpůsobilo zachování daného this?“ Na první pohled bych řekl, že v obou kódech do onreadystatechange přiřazuješ undefined , protože volané funkce nic nevracejí.
S doplněným return em se ten první kód bude chovat stejně jako bez lexikálního uzávěru.
|
||
Witiko Profil |
#7 · Zasláno: 16. 5. 2010, 19:31:48 · Upravil/a: Witiko
Správně, zapomněl jsem na return. V tom případě tohle by mělo být řešení:
this.send = function(url, vars){ this.HttpRequest.open(this.method, url, true); this.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); this.HttpRequest.onreadystatechange = (function(that){return function() {return that.prijmiData()}})(this); this.HttpRequest.send(vars); }; |
||
Časová prodleva: 14 let
|
0