Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  probleem objektidega JS-is ja httpRequestiga. märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 13.11.2007 04:42:18 probleem objektidega JS-is ja httpRequestiga. vasta tsitaadiga

on üks probleem millega juba mõnda aega olen maadlend ja pihta ei sa kuidas see lahendada.
Idee on selles, et see suht mu esimene (tglt vist teine) objektipõhine lähenemine javascripti koodile.
Üritan ühes objektis siis teha http päringu saamaks template.htm sisu

koodi katsed asuvad http://kirves.pri.ee/testing/ajax/
seal on kaks koodikatset ja template.htm mida siis üritan sisse lugeda.

test.htm (JS kood asub code.js)
töötab, kuid seal ei kasutata objekti sisest HttpRequest objekti vaid globaalset (see luuakse seal makeHTTPrequest funktsioonis).
see tähendab seda et pole puhas OO ja pealegi võib seda objekti veel olemas olla, st kirjutan juba käimas oleva päringu üle.

test2.htm (ja siis JS kood asub code2.js)
on siis mitte töötav variant, kuid idee mismoodi umbes tööle tahaks saada.
põhimõtteliselt oleks vaja saada objekti reference kuidagi sinna "onreadystatechange" callback funktsioonile sisse, kuid kuidas.
seal this ei tööta (vist kuna tegu pole minu oobjektiga vaid XMLHttpRequest objektiga) millegipärast.

probleem siis asub code2.js -is
kohas

  this.objHttpRequest.onreadystatechange = function() {
    if (this.objHttpRequest.readyState != 4)
       return;
    this.strTemplate = this.objHttpRequest.responseText;
    this.drawStrip();       
  }


mis ma valesti teen?
praegu siis erroriks
tsitaat:
Error: this.objHttpRequest has no properties
Source File: http://kirves.pri.ee/testing/ajax/code2.js
Line: 58

58 rida on siin 2-ne rida
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
Valdars
HV veteran
Valdars

liitunud: 22.02.2003




sõnum 14.11.2007 01:31:32 vasta tsitaadiga

Pakuks välja variandi, et this.objHttpRequest ei ole globaalne muutuja ja seetõttu ei ole ta funktsiooni sees kasutatav(ei ulatu sinna).
Kommentaarid: 47 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 44
tagasi üles
vaata kasutaja infot saada privaatsõnum
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 14.11.2007 01:41:23 vasta tsitaadiga

põhimõtteliselt ma tean et see viga on. Viga on selles, et eventi "onreadystatechange"-il kutsutav funktsioon ei ole esilagse objektga seoses enam.
Üks võimalus pakuti välja, et panna objekt mingisesse global muutjasse ja siis callback functsioonis saaks selle kätte, kuid see tähendab välise abi kasutamist ja suht dirty ka.
Tegelt soov leida lahendus probleemile nii ikkagi ,et objekti ees saaks ära teha icon_sad.gif kuid tundub, et seda ei anna korraldada. Kui saaks "this" kaasa anda kuidagi parameetrina callback funktsiooni oleks enamvähem bueno.

php.ee-s oli ka teema
http://www.php.ee/foorum/index.php?post=59942
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 14.11.2007 02:01:38 Re: probleem objektidega JS-is ja httpRequestiga. vasta tsitaadiga

See on üks JavaScripti kiiks, mis teinekord on paras piin.

Probleem on selles, et this viitab alati sellele objektile, kes on funktsiooni omanik.

Antud juhul lood sa picStrip sees funktsiooni, mille omanikuks saab objHttpRequest.

Sa arvad, et seal IF-lause sees this on sama mis picStrip, kuid tegelikult on see hoopis picStrip.objHttpRequest. Seega, kui sa küsid seal this.objHttpRequest.readystate väärtust, siis otsitakse hoopis objekti picStrip.objHttpRequest.objHttpRequest.readystate.

Kuid sina tahaksid viidata seal funktsiooni sees siiski sellele objektile, mille sees funktsioon defineeritud on (antud juhul picStrip). Üks võimalus selleks on kasutada sulundit (ingl. k. closure), ehk siis defineerida väljaspool seda funktsiooni muutuja, mis funktsiooni sisse kätte paistab ja tollele vastav väärtus omistada.

Näiteks defineerime this asemel muutuja that.

javascript:
  1.   var that = this;
  2.   this.objHttpRequest.onreadystatechange = function() {
  3.     if (that.objHttpRequest.readyState != 4)
  4.         return;
  5.     that.strTemplate = that.objHttpRequest.responseText;
  6.     that.drawStrip();       
  7.   }


Või kasutades osalt ka this-i seal kus võimalik (IMHO raskemini aru saadav):

javascript:
  1.   var that = this;
  2.   this.objHttpRequest.onreadystatechange = function() {
  3.     if (this.readyState != 4)
  4.         return;
  5.     that.strTemplate = this.responseText;
  6.     that.drawStrip();       
  7.   }


Küsi julgelt veel, kui jäi segaseks - JavaScripti this ja sulundid pole just kõige kergemini hoomatavad asjad.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 14.11.2007 02:22:06 vasta tsitaadiga

nene, hmm, njh, see toimib küll. kuid kasutab seda globaalset muutujat that..
Muud moodi siis vist ei annagi?
ja sellel ajal kuni readystate 4 saavutatakse ei tohi ,JS-is mujal seda muutujat kasutada..(näiteks kui loon kaks korda järjest objekti picstrip)

kusjuures kaks korda järjest picStrip-i põhjal uus objekti luues ei toimigi alati..
oleneb kohe kui kiirelt readystate 4 saavutatakse

panin praegu sinna kaks objekti järjest, kui div-is sisse jääb x täht siis drawStrip-ini ei jõutud
http://kirves.pri.ee/testing/ajax/test2.htm


tundub et asi on ikkagi suht saavutamatu ilma objekti välise abita. icon_sad.gif
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 14.11.2007 03:39:24 vasta tsitaadiga

iceincube kirjutas:
nene, hmm, njh, see toimib küll. kuid kasutab seda globaalset muutujat that..


Ei. See that pole sugugi globaalne vaid on nähtav üksnes tolle makeHTTPrequest funktsiooni sees. See ongi sulundite iva.

Kanooniline näide sulundi kasutamisest oleks selline:

javascript:
  1. function teeLoendur() {
  2.     var nr = 0;
  3.     return function() {
  4.         nr++;
  5.         return nr;
  6.     };
  7. }
  8.  
  9. // kui me üritame siin muutujale nr ligi saada,
  10. // saame vastuseks "undefined"
  11. alert(nr); // undefined
  12.  
  13. // kui me aga laseme teeLoendur()-il tagastada meile
  14. // uue funktsiooni, mis on defineeritud muutujaga nr
  15. // samas skoobis, siis pääseb too uus funktsioon
  16. // muutujale nr kenasti ligi.
  17. var loendur1 = teeLoendur();
  18. alert( loendur1() ); // 1
  19. alert( loendur1() ); // 2
  20.  
  21. // Muutuja nr on endiselt globaalselt ligipääsmatu
  22. alert(nr); // undefined
  23.  
  24. // Saame luua ka teise loenduri.
  25. // nüüd hakkab loendamine taas algusest
  26. var loendur2 = teeLoendur();
  27. alert( loendur2() ); // 1
  28. alert( loendur2() ); // 2
  29. alert( loendur2() ); // 3
  30.  
  31. // kuid loendur1 ja loendur2 ei jaga muutujat nr.
  32. // mõlemil on sellest muutujast oma versioon,
  33. // mida üksnes ta ise näeb
  34. alert( loendur1() ); // 3
  35. alert( loendur1() ); // 4
  36.  
  37. // Seega võime öelda, et kumbki funktsioon peidab või suleb
  38. // enda sisse muutuja nr - sellest ka nimetus "sulund".
  39.  


See, et sinu kood ei tööta, on aga tingitud muust. Nimelt lood sa kaks div-i millel on sama ID. Ja siis katsud ID järgi vastava div-i taas üles leida - brauser annab sulle mõlemal korral lihtsalt esimese vastava ID-ga div-i.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 14.11.2007 10:27:53 vasta tsitaadiga

ahjaa, damit.
kaks sama nimega div-i jah.

Ma võtsin nendes näidetes automaatse nime genereermise maha koodi selguse mõttes. doh.gif
Koht kus probleem välja kasvas - seal oli nime genereerimine ka küljes.
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 14.11.2007 14:11:47 vasta tsitaadiga

Muide, kui sul seda div-i pole tarvis väljaspool seda JavaScripti ID järgi kätte saada, siis pole mõtet mingit unikaalset ID-d genereerima hakata. Märksa lihtsam on viit tollele genereeritud div-le lihtsalt meelde jätta. Samamoodi nagu sa hetkel hoiad meeles toda ID-d. Nojah... sel juhul peaksid sa kasutama tolle div-i lisamiseks document.createElement() meetodit, mitte document.write()-i.

Märkasin veel sellist asja su koodis, et sa käid for-tsükliga läbi tolle msxmlhttp massiivi, aga reaalseks lõpptulemuseks saab olla vaid ActiveXObject('Microsoft.XMLHTTP') või null. Kõik vahepealsed väärtused kirjutatakse üle.

Lõpuks veel see asi, et sa omistad objekti prototüübile kõik funktsioonid eraldi, kirjutades iga kord kõik pikalt välja:
javascript:
  1. picStrip.prototype.drawStrip = function() { ... };
  2. picStrip.prototype.loadTemplate = function() { ... };
  3. picStrip.prototype.makeHTTPrequest = function(url) { ... };


Märksa mugavam oleks omistada prototüübile lihtsalt objekt, mis kõiki neid funktsioone sisaldab:
javascript:
  1. picStrip.prototype = {
  2.     drawStrip: function() { ... },
  3.     loadTemplate: function() { ... },
  4.     makeHTTPrequest: function(url) { ... }
  5. };
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 20.11.2007 16:03:09 vasta tsitaadiga

Tahan üle küsida, et kas XMLHttpRequest-i päringud saavad toimuda ainult samasse domeeni kus asub nn lehekülg. Turvalisuse tõttu on muudesse domeenidesse päringute tegemine browserite poolt defaultina keelatud.
Olen päris hullult ringi kondand mõõda googlet ja materjale asja kohta lugenud ja tundub, et bypassi pole sellele ilusat. On mingi Iframe-is lähenemise asjale(ei ole lugend selle kohta, kuna nii teha ei tahaks).

Siis leidsin ühe lahenduse.
Crossdomain turva saab ületada dünaamiliselt uue scripti lisamisega dokumenti. See täitsa toimib, kuid sellega kaasnes kohe probleem.
See ei toimi safaris vist(foorumist lugesin, ise proovida ei saa kahjuks).

Kas on veel mingeid võimalusi crossdomain töötamiseks?
Kas safaris üldse toimib mingi crossdomain päringu tegemise võimalus?

Ma suht nõutu.. kõik on hea, kuid safaris keerab näkku.
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 20.11.2007 21:00:56 vasta tsitaadiga

Aga võibolla saaksid sa teha selle crossdomain päringu asemel hoopis kuidagi teisiti. Näiteks nii, et päring teise domeeni tehakse serveri poole peal ja vahendatakse edasi skriptile.

Miks sul üldse taolist asja tarvis on?
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 26.08.2008 00:55:36 vasta tsitaadiga

leidsin vana teema üles :p

vajaonseda sellekset teha javascipt widgetit mida suvaliine inimene saab oma lehele panna.
lisades ainult mingi javascriptikoodi HTML-i kuvab minu serverist mingi sisu sinna kohta tal lehel icon_smile.gif
nagu näiteks google mapsi saab oma lehele lisada
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 26.08.2008 02:39:54 vasta tsitaadiga

http://miso.blog.matfyz.sk/p731-cross-domain-ajax

Ei ole otseselt ajax, aga töötab ja väidetavalt ka Safariga.
http://stankaa.com/ on selle abil tehtud ja on ka nö widget, mida kahe reaga suvalisele lehele saab panna.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
iceincube
HV veteran
iceincube

liitunud: 18.11.2005




sõnum 26.08.2008 09:04:22 vasta tsitaadiga

Noh, tglt on mul jah nüüd see probleem ammu lahendatud juba icon_smile.gif
Ma lihtsalt teavitasin lõpuks nene -et, milleks selline crossdomain hea on icon_razz.gif
Kommentaarid: 39 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 37
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  probleem objektidega JS-is ja httpRequestiga.
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.