Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
iceincube
HV veteran

liitunud: 18.11.2005
|
13.11.2007 04:42:18
probleem objektidega JS-is ja httpRequestiga. |
|
|
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
58 rida on siin 2-ne rida
|
|
Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
tagasi üles |
|
 |
Valdars
HV veteran

liitunud: 22.02.2003
|
14.11.2007 01:31:32
|
|
|
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 |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
14.11.2007 01:41:23
|
|
|
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 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 |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
14.11.2007 02:01:38
Re: probleem objektidega JS-is ja httpRequestiga. |
|
|
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:
|
var that = this; this.objHttpRequest.onreadystatechange = function() { if (that.objHttpRequest.readyState != 4) return; that.strTemplate = that.objHttpRequest.responseText; that.drawStrip(); }
|
Või kasutades osalt ka this-i seal kus võimalik (IMHO raskemini aru saadav):
javascript:
|
var that = this; this.objHttpRequest.onreadystatechange = function() { if (this.readyState != 4) return; that.strTemplate = this.responseText; that.drawStrip(); }
|
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 |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
14.11.2007 02:22:06
|
|
|
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.
|
|
Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
14.11.2007 03:39:24
|
|
|
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:
|
function teeLoendur() { var nr = 0; return function() { nr++; return nr; }; } // kui me üritame siin muutujale nr ligi saada, // saame vastuseks "undefined" alert(nr); // undefined // kui me aga laseme teeLoendur()-il tagastada meile // uue funktsiooni, mis on defineeritud muutujaga nr // samas skoobis, siis pääseb too uus funktsioon // muutujale nr kenasti ligi. var loendur1 = teeLoendur(); alert( loendur1() ); // 1 alert( loendur1() ); // 2 // Muutuja nr on endiselt globaalselt ligipääsmatu alert(nr); // undefined // Saame luua ka teise loenduri. // nüüd hakkab loendamine taas algusest var loendur2 = teeLoendur(); alert( loendur2() ); // 1 alert( loendur2() ); // 2 alert( loendur2() ); // 3 // kuid loendur1 ja loendur2 ei jaga muutujat nr. // mõlemil on sellest muutujast oma versioon, // mida üksnes ta ise näeb alert( loendur1() ); // 3 alert( loendur1() ); // 4 // Seega võime öelda, et kumbki funktsioon peidab või suleb // enda sisse muutuja nr - sellest ka nimetus "sulund".
|
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 |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
14.11.2007 10:27:53
|
|
|
ahjaa, damit.
kaks sama nimega div-i jah.
Ma võtsin nendes näidetes automaatse nime genereermise maha koodi selguse mõttes.
Koht kus probleem välja kasvas - seal oli nime genereerimine ka küljes.
|
|
Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
14.11.2007 14:11:47
|
|
|
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:
|
picStrip.prototype.drawStrip = function() { ... }; picStrip.prototype.loadTemplate = function() { ... }; picStrip.prototype.makeHTTPrequest = function(url) { ... };
|
Märksa mugavam oleks omistada prototüübile lihtsalt objekt, mis kõiki neid funktsioone sisaldab:
javascript:
|
picStrip.prototype = { drawStrip: function() { ... }, loadTemplate: function() { ... }, makeHTTPrequest: function(url) { ... } };
|
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
20.11.2007 16:03:09
|
|
|
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 |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
20.11.2007 21:00:56
|
|
|
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 |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
26.08.2008 00:55:36
|
|
|
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
nagu näiteks google mapsi saab oma lehele lisada
|
|
Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
tagasi üles |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
iceincube
HV veteran

liitunud: 18.11.2005
|
26.08.2008 09:04:22
|
|
|
Noh, tglt on mul jah nüüd see probleem ammu lahendatud juba
Ma lihtsalt teavitasin lõpuks nene -et, milleks selline crossdomain hea on
|
|
Kommentaarid: 39 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
37 |
|
tagasi üles |
|
 |
|