|
| Problem med ajax applikation Fra : Brian Bendtsen |
Dato : 09-11-07 09:29 |
|
Hej
Jeg er igang med min første ajax applikation.
Jeg er ved at lave en domænetester til mit firmas hjemmeside og vil
gerne have at det fungere
som på scannet.dk og unoeuro.dk hvor resultatet af diverse whois opslag
dynamisk popper frem.
I FF på min maskine virker det tilsyneladende, men i IE er der nogle
kald der ikke bliver "completed".
Desuden har jeg også oplevet fejl i FF på andre maskiner, så et eller
andet må være forkert.
Kan ikke forklare det på en bedre måde så her er et link til siden hvor
jeg tester:
typo3.hostcenter.dk (beklager reklamen, men jeg bliver tit opfordret til
at medsende link, så hermed gjort).
Mit javascript ser således ud:
// script - Domænetester:
function getAjax() {
var ajax = null;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
ajax = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {}
}
}
if (!ajax) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
return ajax;
}
function check_domainname(domainname) {
//Ajax function needs to run exactly as many times as there are domain
types
var domArr = domainname.split(".");
domExt = domArr[1];
//If the browser supports ajax
var ajax = getAjax();
if(ajax == null) {
return;
}
//Check if domainname is available
ajax.onreadystatechange = function () { handle_check(ajax); };
ajax.open('get',
'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
encodeURIComponent(domainname), false);
ajax.send(null);
}
function handle_check(ajax) {
if (ajax.readyState == 4) {
if(ajax.status == 200) {
if(ajax.responseText == 'Optaget') {
document.getElementById('notavailable_'+domExt).style.display = 'block';
//alert(domExt+' optaget');
} else {
document.getElementById('available_'+domExt).style.display = 'block';
document.getElementById('link_'+domExt).style.display = 'block';
//alert(domExt+' ledigt');
}
}
else {
document.getElementById('message_'+domExt).innerHTML = "<font
color='red'>"+ajax.status+"</font>";
}
} else {
document.getElementById('message_'+domExt).innerHTML = "<font
color='red'>"+ajax.readyState+"</font>";
}
}
var domExt = '';
var exts = new Array("dk", "com", "org", "nu", "as", "net")
var i = 0;
var name = "test";
function setDomainName() {
name = document.getElementById('domainHidden').value;
tick();
}
function tick() {
if(exts[i]) {
check_domainname(name + "." + exts[i])
i++;
setTimeout(tick,100)
}
}
---------------------------------------------------
Håber der er nogen der kan hjælpe.
mvh. Brian
| |
Birger (09-11-2007)
| Kommentar Fra : Birger |
Dato : 09-11-07 11:49 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:47341a47$0$15891$edfadb0f@dtext01.news.tele.dk...
8X
> function check_domainname(domainname) {
> //Ajax function needs to run exactly as many times as there are domain
> types
> var domArr = domainname.split(".");
> domExt = domArr[1];
> //If the browser supports ajax
> var ajax = getAjax();
> if(ajax == null) {
> return;
> }
> //Check if domainname is available
> ajax.onreadystatechange = function () { handle_check(ajax); };
> ajax.open('get',
> 'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
> encodeURIComponent(domainname), false);
> ajax.send(null);
> }
>
Parametre til get() er metode, URL og asynkron.
Parameter til send() er parametre til URL'en.
Du sender parametrene med i URL'en, og det er principielt forkert, som jeg
opfatter tingene.
http://msdn2.microsoft.com/en-us/library/ms535874.aspx
Og der er i øvrigt masser af materiale, hvis man googler AJAX.
ajax.open('get', 'fileadmin/templates/main/whois/checkdomainname.php,
false);
ajax.send( 'domainname=' + encodeURIComponent(domainname));
Jeg forstår ikke rigtigt den sidste del af dit script:
function setDomainName() {
name = document.getElementById('domainHidden').value;
tick();
}
function tick() {
if(exts[i]) {
check_domainname(name + "." + exts[i])
i++;
setTimeout(tick,100)
}
}
Du bruger synkron i AJAX (3. parameter til get() er false).
Der er så ingen grund til at bruge timeren.
Scriptet venter alligevel, til check_domainname() er færdig, før det
fortsætter, så et helt almindeligt for-loop skulle kunne klare tingene.
Birger
| |
Brian Bendtsen (09-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 09-11-07 12:26 |
|
Birger skrev:
>
> Parametre til get() er metode, URL og asynkron.
> Parameter til send() er parametre til URL'en.
> Du sender parametrene med i URL'en, og det er principielt forkert, som jeg
> opfatter tingene.
> http://msdn2.microsoft.com/en-us/library/ms535874.aspx
> Og der er i øvrigt masser af materiale, hvis man googler AJAX.
>
> ajax.open('get', 'fileadmin/templates/main/whois/checkdomainname.php,
> false);
> ajax.send( 'domainname=' + encodeURIComponent(domainname));
>
>
> Jeg forstår ikke rigtigt den sidste del af dit script:
>
> function setDomainName() {
> name = document.getElementById('domainHidden').value;
> tick();
> }
>
> function tick() {
> if(exts[i]) {
> check_domainname(name + "." + exts[i])
> i++;
> setTimeout(tick,100)
> }
> }
>
> Du bruger synkron i AJAX (3. parameter til get() er false).
> Der er så ingen grund til at bruge timeren.
> Scriptet venter alligevel, til check_domainname() er færdig, før det
> fortsætter, så et helt almindeligt for-loop skulle kunne klare tingene.
>
> Birger
>
>
Hej Birger
Alle de eksempler jeg har set på nettet og i bøger sender de parametre i
url'en og ikke ved brug af ajax.send(). Men bortset fra det.
Jeg har omskrevet en del af koden til:
function setDomainName() {
var ajax = createAjax();
name = document.getElementById('domainHidden').value;
for(var i=0; i<exts.length; i++) {
check_domainname(name + "." + exts[i])
}
}
- men det betyder at min resultatside først dukker op når alle kald er
færdige. Hermed er min primære årsag til at bruge ajax væk.
Jeg vil gerne have at siden der viser resultatet dukker op med det samme
og herefter foretages mine ajax kald.
/Brian
| |
Birger (09-11-2007)
| Kommentar Fra : Birger |
Dato : 09-11-07 13:26 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:473443ae$0$15900$edfadb0f@dtext01.news.tele.dk...
8X
> Hej Birger
>
> Alle de eksempler jeg har set på nettet og i bøger sender de parametre i
> url'en og ikke ved brug af ajax.send(). Men bortset fra det.
>
> Jeg har omskrevet en del af koden til:
>
> function setDomainName() {
> var ajax = createAjax();
> name = document.getElementById('domainHidden').value;
> for(var i=0; i<exts.length; i++) {
> check_domainname(name + "." + exts[i])
> }
> }
>
> - men det betyder at min resultatside først dukker op når alle kald er
> færdige. Hermed er min primære årsag til at bruge ajax væk.
>
> Jeg vil gerne have at siden der viser resultatet dukker op med det samme
> og herefter foretages mine ajax kald.
>
Hej Brian.
Jeg har også set eksempler på at medsende data som del af URL'en.
Jeg har også set eksempler på ikke at gøre det.
Min side ( http://bbsorensen.dk) anvender AJAX i meget udstrakt grad.
Alle parametre sendes via send(). Jeg bruger så også mest POST i stedet for
GET - og de steder jeg bruger GET, er der ingen parametre.
Så måske betyder det ingenting, eller jeg læser dokumentation forkert ;>).
Jeg vil dog mene, at objektet som sådan, selv skal have lov at manipulere de
data du giver det at arbejde med, og derfor skal parametrene leveres, der
hvor objektet forventer de leveres.
At man kan få det til at virke anderledes i nogen situationer, er ikke en
sikkerhed for, at det også gør det i andre.
At dine data først dukker op, når alle kald er færdige, er en konsekvens af
at anvende synkron overførsel. Programmet fortsætter først, når kaldene er
færdige.
onreadystatechange() bør dog kaldes ind imellem, og det er her du viser
resultaterne. Så problemet må være at browseren ikke opdaterer, mens
scriptet kører.
Hos mig (IE7) vises siden først, derefter alle resultaterne fra toppen
nedad, i løbet af 3-4 sekunder, og meget anderledes kan du nok ikke forvente
det..?
Har du prøvet asynkront?
(3. parameter i open() = true)
Umiddelbart skulle der ikke være problemer i det.
Og det er på en eller anden vis netop meningen med asynkron - resultatet
vises når det er klar, og brugeren skal ikke vente på at foretage sig andre
ting, mens der ventes..
Birger
| |
Brian Bendtsen (09-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 09-11-07 14:08 |
|
Birger skrev:
> Hej Brian.
> Jeg har også set eksempler på at medsende data som del af URL'en.
> Jeg har også set eksempler på ikke at gøre det.
> Min side ( http://bbsorensen.dk) anvender AJAX i meget udstrakt grad.
> Alle parametre sendes via send(). Jeg bruger så også mest POST i stedet for
> GET - og de steder jeg bruger GET, er der ingen parametre.
> Så måske betyder det ingenting, eller jeg læser dokumentation forkert ;>).
>
> Jeg vil dog mene, at objektet som sådan, selv skal have lov at manipulere de
> data du giver det at arbejde med, og derfor skal parametrene leveres, der
> hvor objektet forventer de leveres.
> At man kan få det til at virke anderledes i nogen situationer, er ikke en
> sikkerhed for, at det også gør det i andre.
>
>
> At dine data først dukker op, når alle kald er færdige, er en konsekvens af
> at anvende synkron overførsel. Programmet fortsætter først, når kaldene er
> færdige.
> onreadystatechange() bør dog kaldes ind imellem, og det er her du viser
> resultaterne. Så problemet må være at browseren ikke opdaterer, mens
> scriptet kører.
> Hos mig (IE7) vises siden først, derefter alle resultaterne fra toppen
> nedad, i løbet af 3-4 sekunder, og meget anderledes kan du nok ikke forvente
> det..?
>
> Har du prøvet asynkront?
> (3. parameter i open() = true)
> Umiddelbart skulle der ikke være problemer i det.
> Og det er på en eller anden vis netop meningen med asynkron - resultatet
> vises når det er klar, og brugeren skal ikke vente på at foretage sig andre
> ting, mens der ventes..
>
> Birger
>
>
Hej
Jeg kan slet ikke få det til at virke med asynkront slået til. Jeg får
nogle ret grimme fejlmeddelelser hvis jeg gør:
Fejl: [Exception... "Component returned failure code: 0x80040111
(NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult:
"0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame ::
http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
:: handle_check :: line 42" data: no]
Kildefil:
http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
Linje: 42
og
Fejl: uncaught exception: [Exception... "Component returned failure
code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]"
nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame
:: javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
Mit script:
function check_domainname(domainname) {
//Ajax function needs to run exactly as many times as there are domain
types
var domArr = domainname.split(".");
domExt = domArr[1];
//If the browser supports ajax
if(ajax == false) {
return;
}
//Check if domainname is available
ajax.open('get',
'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
encodeURIComponent(domainname), true);
ajax.onreadystatechange = handle_check;
ajax.send(null);
}
function handle_check() {
//alert(ajax.readyState);
if (ajax.readyState == 4) {
if(ajax.status == 200) {
if(ajax.responseText == 'Optaget') {
document.getElementById('notavailable_'+domExt).style.display = 'block';
//alert(domExt+' optaget');
} else {
document.getElementById('available_'+domExt).style.display = 'block';
document.getElementById('link_'+domExt).style.display = 'block';
//alert(domExt+' ledigt');
}
}
else {
document.getElementById('message_'+domExt).innerHTML = "<font
color='red'>"+ajax.status+"</font>";
}
}
}
var domExt = '';
var exts = new Array("dk", "com", "org", "nu", "as", "net")
//var exts = new Array("dk");
var name = "test";
var i = 0;
function setDomainName() {
var ajax = createAjax();
name = document.getElementById('domainHidden').value;
//doit();
for(i=0;i<exts.length;i++) {
check_domainname(name + "." + exts[i])
}
}
Jeg kan ikke lige se hvad der går galt
/Brian
| |
Birger (09-11-2007)
| Kommentar Fra : Birger |
Dato : 09-11-07 15:41 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:47345bc3$0$15900$edfadb0f@dtext01.news.tele.dk...
8X
> Jeg kan slet ikke få det til at virke med asynkront slået til. Jeg får
> nogle ret grimme fejlmeddelelser hvis jeg gør:
>
> Fejl: [Exception... "Component returned failure code: 0x80040111
> (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult:
> "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame ::
> http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
> :: handle_check :: line 42" data: no]
> Kildefil:
> http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
> Linje: 42
>
> og
>
> Fejl: uncaught exception: [Exception... "Component returned failure code:
> 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult:
> "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame ::
> javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
>
8X
> /Brian
Hej Brian.
OK så ;>(
Beklager at have lokket dig på afveje.
Tror nu nok jeg kan se i hvert fald noget af det :
function setDomainName() {
var ajax = createAjax();
name = document.getElementById('domainHidden').value;
//doit();
for(i=0;i<exts.length;i++) {
check_domainname(name + "." + exts[i])
}
}
her opretter du eet ajax-object, og bruger det til alle kaldene.
Det kan du ikke - der skal være et object til hvert kald, f.eks. sådan:
(Synkront virker, fordi den ene request bliver færdig, før den næste
startes..)
function setDomainName() {
name = document.getElementById('domainHidden').value;
//doit();
for(i=0;i<exts.length;i++) {
var ajax = createAjax(); //*
check_domainname(name + "." + exts[i])
}
}
* Det vil dog også gå galt.
Din ajax variable skal så defineres som et array, eller hellere kun anvendes
som lokal variabel, som du vist også havde gjort i dit oprindelige oplæg.
Ellers kan din callback funktion ikke skelne, hvilket af objecterne der
returneres fra.
(
Det kunne måske også ud somom, hvis man skal køre 2 eller flere AJAX
asynkront samtidig, skal de have hver sin callback funktion.
Tror måske det kan opnås ved at oprette dem lokalt i check_domainname(), men
er ikke sikker - du kan jo prøve hvis du har lyst.
Mener nu nok at jeg har prøvet det som du gør her - men jeg har måske været
heldig, at der ikke kom et svar retur, samtidig med at et andet var under
afvikling.
Mener også, at systemet skulle være i stand til at håndtere flere asynkrone
kald ad gangen, også selvom de udføres "samtidig".
)
Birger
| |
Brian Bendtsen (14-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 14-11-07 10:00 |
|
Birger skrev:
> "Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
> news:47345bc3$0$15900$edfadb0f@dtext01.news.tele.dk...
> 8X
>> Jeg kan slet ikke få det til at virke med asynkront slået til. Jeg får
>> nogle ret grimme fejlmeddelelser hvis jeg gør:
>>
>> Fejl: [Exception... "Component returned failure code: 0x80040111
>> (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult:
>> "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame ::
>> http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
>> :: handle_check :: line 42" data: no]
>> Kildefil:
>> http://typo3.hostcenter.dk/fileadmin/templates/main/whois/checkdomainname.js
>> Linje: 42
>>
>> og
>>
>> Fejl: uncaught exception: [Exception... "Component returned failure code:
>> 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult:
>> "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame ::
>> javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
>>
> 8X
>> /Brian
>
> Hej Brian.
> OK så ;>(
> Beklager at have lokket dig på afveje.
>
> Tror nu nok jeg kan se i hvert fald noget af det :
>
> function setDomainName() {
> var ajax = createAjax();
> name = document.getElementById('domainHidden').value;
> //doit();
> for(i=0;i<exts.length;i++) {
> check_domainname(name + "." + exts[i])
> }
> }
>
> her opretter du eet ajax-object, og bruger det til alle kaldene.
> Det kan du ikke - der skal være et object til hvert kald, f.eks. sådan:
> (Synkront virker, fordi den ene request bliver færdig, før den næste
> startes..)
>
> function setDomainName() {
> name = document.getElementById('domainHidden').value;
> //doit();
> for(i=0;i<exts.length;i++) {
> var ajax = createAjax(); //*
> check_domainname(name + "." + exts[i])
> }
> }
>
> * Det vil dog også gå galt.
> Din ajax variable skal så defineres som et array, eller hellere kun anvendes
> som lokal variabel, som du vist også havde gjort i dit oprindelige oplæg.
> Ellers kan din callback funktion ikke skelne, hvilket af objecterne der
> returneres fra.
>
> (
> Det kunne måske også ud somom, hvis man skal køre 2 eller flere AJAX
> asynkront samtidig, skal de have hver sin callback funktion.
> Tror måske det kan opnås ved at oprette dem lokalt i check_domainname(), men
> er ikke sikker - du kan jo prøve hvis du har lyst.
> Mener nu nok at jeg har prøvet det som du gør her - men jeg har måske været
> heldig, at der ikke kom et svar retur, samtidig med at et andet var under
> afvikling.
> Mener også, at systemet skulle være i stand til at håndtere flere asynkrone
> kald ad gangen, også selvom de udføres "samtidig".
> )
>
> Birger
>
>
Hej Birger og jer andre
Jeg har prøvet at ændre i min kode efter dine tips, men det driller
stadig, det er kun sidste test der "slår igennem" og et resultat bliver
vist:
Min kode:
function check_domainname(domainname) {
var ajax = createAjax();
//If the browser supports ajax
if(ajax == false) {
return;
}
//Check if domainname is available
ajax.open('get',
'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
encodeURIComponent(domainname), true);
ajax.onreadystatechange = function () {handle_check(); };
ajax.send(null);
}
function handle_check() {
if (ajax.readyState == 4) {
if(ajax.status == 200) {
//ajax.responseText kan enten være domænenavn|0 hvis domæne er
optaget eller domænenavn|1 hvis domænet er ledigt
var domArr = ajax.responseText.split("|");
var tmpArr = domArr[0].split(".");
var domExt = tmpArr[1];
if(domArr[1] == '0') {
document.getElementById('notavailable_'+domExt).style.display = 'block';
} else {
document.getElementById('available_'+domExt).style.display = 'block';
document.getElementById('link_'+domExt).style.display = 'block';
}
}
}
}
var exts = new Array("dk", "com", "org", "nu", "as", "net")
var name = "test";
var i = 0;
function setDomainName() {
name = document.getElementById('domainHidden').value;
for(i=0;i<exts.length;i++) {
check_domainname(name + "." + exts[i]);
}
}
Nogen ideer?
mvh. Brian
| |
Birger (14-11-2007)
| Kommentar Fra : Birger |
Dato : 14-11-07 16:32 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:473ab8ff$0$15879$edfadb0f@dtext01.news.tele.dk...
8X
> Hej Birger og jer andre
>
> Jeg har prøvet at ændre i min kode efter dine tips, men det driller
> stadig, det er kun sidste test der "slår igennem" og et resultat bliver
> vist:
>
> Min kode:
>
> function check_domainname(domainname) {
> var ajax = createAjax();
> //If the browser supports ajax
> if(ajax == false) {
> return;
> }
> //Check if domainname is available
> ajax.open('get',
> 'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
> encodeURIComponent(domainname), true);
> ajax.onreadystatechange = function () {handle_check(); };
> ajax.send(null);
> }
>
> function handle_check() {
> if (ajax.readyState == 4) {
> if(ajax.status == 200) {
> //ajax.responseText kan enten være domænenavn|0 hvis domæne er optaget
> eller domænenavn|1 hvis domænet er ledigt
> var domArr = ajax.responseText.split("|");
> var tmpArr = domArr[0].split(".");
> var domExt = tmpArr[1];
> if(domArr[1] == '0') {
> document.getElementById('notavailable_'+domExt).style.display = 'block';
> } else {
> document.getElementById('available_'+domExt).style.display = 'block';
> document.getElementById('link_'+domExt).style.display = 'block';
> }
> }
> }
> }
>
> var exts = new Array("dk", "com", "org", "nu", "as", "net")
> var name = "test";
> var i = 0;
> function setDomainName() {
> name = document.getElementById('domainHidden').value;
> for(i=0;i<exts.length;i++) {
> check_domainname(name + "." + exts[i]);
> }
> }
>
> Nogen ideer?
>
> mvh. Brian
Umiddelbart er det fordi du kun har een ajax variabel.
Dit ajax-object skal ikke være globalt, men fungere som en lokal variabel -
der skal være eet til hver request.
function check_domainname(domainname)
opretter godt nok eet til hver, men du bruger det globalt, når du henter
resultat i
ajax.onreadystatechange = function () {handle_check();};
Her skal du have det aktuelle object med, og ikke et globalt.
Du kan prøve at ændre til
ajax.onreadystatechange = function () {handle_check(ajax);};
og så ændre hele
function handle_check( a_ajax)
til at håndtere a_ajax i stedet.
I min lille verden, burde det betyde, at det aktuelle object overføres, og
ikke en global version.
Birger
| |
Brian Bendtsen (15-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 15-11-07 08:47 |
|
Birger skrev:
> "Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
> news:473ab8ff$0$15879$edfadb0f@dtext01.news.tele.dk...
>
> 8X
>
>> Hej Birger og jer andre
>>
>> Jeg har prøvet at ændre i min kode efter dine tips, men det driller
>> stadig, det er kun sidste test der "slår igennem" og et resultat bliver
>> vist:
>>
>> Min kode:
>>
>> function check_domainname(domainname) {
>> var ajax = createAjax();
>> //If the browser supports ajax
>> if(ajax == false) {
>> return;
>> }
>> //Check if domainname is available
>> ajax.open('get',
>> 'fileadmin/templates/main/whois/checkdomainname.php?domainname=' +
>> encodeURIComponent(domainname), true);
>> ajax.onreadystatechange = function () {handle_check(); };
>> ajax.send(null);
>> }
>>
>> function handle_check() {
>> if (ajax.readyState == 4) {
>> if(ajax.status == 200) {
>> //ajax.responseText kan enten være domænenavn|0 hvis domæne er optaget
>> eller domænenavn|1 hvis domænet er ledigt
>> var domArr = ajax.responseText.split("|");
>> var tmpArr = domArr[0].split(".");
>> var domExt = tmpArr[1];
>> if(domArr[1] == '0') {
>> document.getElementById('notavailable_'+domExt).style.display = 'block';
>> } else {
>> document.getElementById('available_'+domExt).style.display = 'block';
>> document.getElementById('link_'+domExt).style.display = 'block';
>> }
>> }
>> }
>> }
>>
>> var exts = new Array("dk", "com", "org", "nu", "as", "net")
>> var name = "test";
>> var i = 0;
>> function setDomainName() {
>> name = document.getElementById('domainHidden').value;
>> for(i=0;i<exts.length;i++) {
>> check_domainname(name + "." + exts[i]);
>> }
>> }
>>
>> Nogen ideer?
>>
>> mvh. Brian
>
> Umiddelbart er det fordi du kun har een ajax variabel.
> Dit ajax-object skal ikke være globalt, men fungere som en lokal variabel -
> der skal være eet til hver request.
>
> function check_domainname(domainname)
> opretter godt nok eet til hver, men du bruger det globalt, når du henter
> resultat i
> ajax.onreadystatechange = function () {handle_check();};
>
> Her skal du have det aktuelle object med, og ikke et globalt.
>
> Du kan prøve at ændre til
> ajax.onreadystatechange = function () {handle_check(ajax);};
>
> og så ændre hele
> function handle_check( a_ajax)
> til at håndtere a_ajax i stedet.
>
> I min lille verden, burde det betyde, at det aktuelle object overføres, og
> ikke en global version.
>
>
> Birger
>
>
Hej Birger
Det ser ud til at virke nu, tak for tippet
mvh. Brian
| |
Brian Bendtsen (15-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 15-11-07 09:20 |
|
Hej igen
Testede det lige i forskellige browsere og jeg kan ikke få det til at
virke i IE6.0
Måske en fejl i min ajax function:
function createAjax() {
try { // Mozilla, Safari, ...
ajax = new XMLHttpRequest();
} catch (trymicrosoft) { // IE newer
try {
ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) { // IE older browsers
try {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {}
}
}
if (!ajax) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
return ajax;
}
Burde det her ikke virke?
Jeg får fejlen "Objektet understøtter ikke denne egenskab eller metode"
mvh. Brian
| |
Brian Bendtsen (15-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 15-11-07 09:53 |
|
Brian Bendtsen skrev:
> Hej igen
>
> Testede det lige i forskellige browsere og jeg kan ikke få det til at
> virke i IE6.0
>
> Måske en fejl i min ajax function:
>
> function createAjax() {
> try { // Mozilla, Safari, ...
> ajax = new XMLHttpRequest();
> } catch (trymicrosoft) { // IE newer
> try {
> ajax = new ActiveXObject("Msxml2.XMLHTTP");
> } catch (othermicrosoft) { // IE older browsers
> try {
> ajax = new ActiveXObject("Microsoft.XMLHTTP");
> } catch (failed) {}
> }
> }
>
> if (!ajax) {
> alert('Giving up :( Cannot create an XMLHTTP instance');
> return false;
> }
> return ajax;
> }
>
> Burde det her ikke virke?
>
> Jeg får fejlen "Objektet understøtter ikke denne egenskab eller metode"
>
> mvh. Brian
Det er nok slet ikke denne her funktion der er noget galt med, for så
ville man vel få beskeden i 5. sidste linie.
mvh. Brian
| |
Brian Bendtsen (15-11-2007)
| Kommentar Fra : Brian Bendtsen |
Dato : 15-11-07 10:09 |
|
Så løste jeg problemet
det var i linien if(ajax == false) { return; } der skulle ændres til
if(!ajax) { return; }
/Brian
| |
Birger (16-11-2007)
| Kommentar Fra : Birger |
Dato : 16-11-07 09:03 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:473c0c95$0$15881$edfadb0f@dtext01.news.tele.dk...
> Så løste jeg problemet
>
> det var i linien if(ajax == false) { return; } der skulle ændres til
> if(!ajax) { return; }
>
> /Brian
Jah, joh...
ajax er null eller et object.
Det rigtige må så vel være at spørge om (ajax == null) eller (ajax != null).
Kan ikke lige huske specifikt for javascript.
Mener den ene af dem er ulovlig - det er vist kun tilladt at bruge !=
Birger
| |
Birger (15-11-2007)
| Kommentar Fra : Birger |
Dato : 15-11-07 10:08 |
|
"Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
news:473c0134$0$15881$edfadb0f@dtext01.news.tele.dk...
> Hej igen
>
> Testede det lige i forskellige browsere og jeg kan ikke få det til at
> virke i IE6.0
>
> Måske en fejl i min ajax function:
>
> function createAjax() {
> try { // Mozilla, Safari, ...
> ajax = new XMLHttpRequest();
> } catch (trymicrosoft) { // IE newer
> try {
> ajax = new ActiveXObject("Msxml2.XMLHTTP");
> } catch (othermicrosoft) { // IE older browsers
> try {
> ajax = new ActiveXObject("Microsoft.XMLHTTP");
> } catch (failed) {}
> }
> }
>
http://msdn2.microsoft.com/en-us/library/ms535874.aspx
"
For clients prior to Internet Explorer 7, use the following syntax to create
the object:
var oReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
"
Birger
| |
Stig Johansen (10-11-2007)
| Kommentar Fra : Stig Johansen |
Dato : 10-11-07 06:24 |
|
Birger wrote:
> Hej Brian.
> Jeg har også set eksempler på at medsende data som del af URL'en.
> Jeg har også set eksempler på ikke at gøre det.
> Min side ( http://bbsorensen.dk) anvender AJAX i meget udstrakt grad.
> Alle parametre sendes via send(). Jeg bruger så også mest POST i stedet
> for GET - og de steder jeg bruger GET, er der ingen parametre.
> Så måske betyder det ingenting, eller jeg læser dokumentation forkert ;>).
Birger,
Man kunne også tænke den tanke at:
Ved GET er parametre en del af URL'en
Ved POST er parametre (del del som ikke er en del af URL'en) en stribe
name-valuepair i content delen af requestet.
--
Med venlig hilsen
Stig Johansen
| |
Birger (10-11-2007)
| Kommentar Fra : Birger |
Dato : 10-11-07 10:13 |
|
"Stig Johansen" <stig_johansen_it_at_=(@)hotmail.com> skrev i en meddelelse
news:47354087$0$90270$14726298@news.sunsite.dk...
> Birger wrote:
>
>> Hej Brian.
>> Jeg har også set eksempler på at medsende data som del af URL'en.
>> Jeg har også set eksempler på ikke at gøre det.
>> Min side ( http://bbsorensen.dk) anvender AJAX i meget udstrakt grad.
>> Alle parametre sendes via send(). Jeg bruger så også mest POST i stedet
>> for GET - og de steder jeg bruger GET, er der ingen parametre.
>> Så måske betyder det ingenting, eller jeg læser dokumentation forkert
>> ;>).
>
> Birger,
> Man kunne også tænke den tanke at:
> Ved GET er parametre en del af URL'en
> Ved POST er parametre (del del som ikke er en del af URL'en) en stribe
> name-valuepair i content delen af requestet.
>
> --
> Med venlig hilsen
> Stig Johansen
Jo det kan man - og det var sådan set det jeg mente.
Men det fremgår ikke af nogen dokumentation jeg har set eller kunnet finde.
Hvis jeg ændrer mine POST til GET, uden at ændre andet, virker AJAX stadig,
og returnerer rigtigt indhold.
(Men min side falder sammen, fordi den ikke må gå videre, før data er klar
til at blive brugt.)
Objectet kan følgelig håndtere parametre der placeres i send(), også ved
GET.
Ved POST åbnes separat forbindelse til parametre.
Her skal man altså placere pararametre i send().
Om det virker alligevel, hvis man placerer parametrene som del af URL, har
jeg ikke testet.
Serverside er der - i hvert fald i PHP - forskel på hvordan parametrene
læses, så det er muligt at det også kan lade sig gøre, at anbringe nogle
parametre som del af URL, og andre i send().
Jeg mener at hvis man er i tvivl om man har gjort det rigtigt - specielt som
her, hvor der optræder fejl - er det en god ide, at anvende objectet, som
det er beregnet.
Og jeg læser altså dokumentationen, som URL skal i open() og parametre i
send().
Birger
| |
Stig Johansen (11-11-2007)
| Kommentar Fra : Stig Johansen |
Dato : 11-11-07 07:57 |
|
Birger wrote:
> "Stig Johansen" <stig_johansen_it_at_=(@)hotmail.com> skrev i en
> meddelelse news:47354087$0$90270$14726298@news.sunsite.dk...
>> Birger,
>> Man kunne også tænke den tanke at:
>> Ved GET er parametre en del af URL'en
>> Ved POST er parametre (del del som ikke er en del af URL'en) en stribe
>> name-valuepair i content delen af requestet.
>
> Jo det kan man - og det var sådan set det jeg mente.
> Men det fremgår ikke af nogen dokumentation jeg har set eller kunnet
> finde.
Pis Birger, rigtige mænd læser squ da ikke manualer og dokumentation, men nu
fik du mig til at gøre det alligevel.
Jeg ved ikke hvilken dokumentation du bruger, men jeg vil refererer til
denne her:
< http://www.w3.org/TR/XMLHttpRequest/>
Jeg synes denne her:
.....
The send() method initiates the request and its optional argument provides
the entity body.
.....
er soleklar.
Det kræver at man 'kan sin HTTP', men for en sikkerheds skyld (og for andre
læseres) vil jeg prøve at simplificere:
En request til serveren består overordnet af 3 dele:
[1] [METODE] URI HTTP version
[2] Headers
[3] Data
METODE er i vores tråd her GET eller POST, og normalt har man ikke noget
Data, hvis man vil medsende data bruger man POST. Det ligger næsten i
ordene GET og POST.
Jeg tror jeg prøver at lave et simplificeret eksempel:
Step [1] - generer 'overskriften'
Det sker via open metoden, resulterer i 1. linie i requestet, eksempelvis
GET /ajax.js HTTP/1.1
(Hostdelen af URI'en benyttes på IP laget).
Step [2] - generer headers.
Det sker via setRequestHeader metoden, og jeg klipper lige over fra sin
'ajax.js':
req.setRequestHeader( 'Content-Type', 'text/plain');
req.setRequestHeader( 'Accept-Charset', 'iso-8859-1, utf-8');
req.setRequestHeader( 'Accept-Language', 'da');
Når disse er udført, ser requesten sådan her ud:
GET /ajax.js HTTP/1.1
Host: bbsorensen.dk
Content-Type: text/plain
Accept-Charset: iso-8859-1, utf-8
Accept-Language: da
Når der ikke er data i er requesten klar til 'affyring', jeg prøver lige, så
jeg kan se om jeg har skrevet rigtigt (Hvis du ser nogle fejl i din log, så
er det bare mig, der fumler med 'kodekæppen')
Jeg starter lige en telnet op: telnet bbsorensen.dk 80
Jo, dæleme om ikke den virkede i første hug, men nu havde jeg jo også
klippet og klisteret, her er resultatet fra 'telnetten':
sj@lwork1 > telnet bbsorensen.dk 80
Trying 195.47.247.103...
Connected to bbsorensen.dk.
Escape character is '^]'.
GET /ajax.js HTTP/1.1
Host: bbsorensen.dk
Content-Type: text/plain
Accept-Charset: iso-8859-1, utf-8
Accept-Language: da
HTTP/1.1 200 OK
Date: Sun, 11 Nov 2007 06:10:33 GMT
Server: Apache
Last-Modified: Tue, 23 Oct 2007 08:56:20 GMT
ETag: "309fdd0f-742-471db734"
Accept-Ranges: bytes
Content-Length: 1858
Connection: close
Content-Type: application/x-javascript
.....selve scriptet..osv
Nå til POST, jeg tror jeg lavede et lille testdokument tidligere, jeg leder
lige efter det.....
Damn, det kunne jeg ikke finde .. prøver lige at starte min Windows PC
op.... gud er det så'n windoes ser ud :) .. fandt det.
Hav lige lidt tålmodighed, det skal klippe og klistres via den bologiske
computer..
Det var, eller er, hvis du ikke har lavet det om, en POST til din
h_menu.php, og dataene var(er):
side=Forside
lvl=1
ptyp= (tomt)
B1=Submet
Jeg har lige prøvet den ovre on the dark side of the source, så du har den
stadig kørende, så lad os udvide requesten fra før til en POST med data:
GET /h_menu.php HTTP/1.1
Host: bbsorensen.dk
Content-Type: text/plain
Accept-Charset: iso-8859-1, utf-8
Accept-Language: da
Content-Length: 34
side=Forside&lvl=1&ptyp=&B1=Submet
(Den blanke linie *skal* være der)
Skulle vi ikke lige prøve at fyre den af ovre i telnetten?
Den respose ser lidt mærkeligt ud:
.....
5f
<div id="menu" class="hmenu colMenu">
</div>
<div id="indhold" class="hpage colText"></div>
0
.....
Der er noget støj, det kan være du skal kigge lidt på din kode, men vent
lige lidt... Der gik noget galt i den biologiske computer - jeg prøver lige
igen med:
POST /h_menu.php HTTP/1.1
Host: bbsorensen.dk
Content-Type: text/plain
Accept-Charset: iso-8859-1, utf-8
Accept-Language: da
Content-Length: 34
side=Forside&lvl=1&ptyp=&B1=Submit
Hmm.. jeg må være træt, jeg sidder og fumler.. jeg prøver lige at læse
korrektur, det er lidt noget hø når man ikke kan klippe og klistre....
POST /h_menu.php HTTP/1.1
Host: bbsorensen.dk
Content-Type: application/x-www-form-urlencoded
Accept-Charset: iso-8859-1, utf-8
Accept-Language: da
Content-Length: 34
side=Forside&lvl=1&ptyp=&B1=Submit
Jeps nu var den der, men der er noget støj:
HTTP/1.1 200 OK
Date: Sun, 11 Nov 2007 06:47:09 GMT
Server: Apache
X-Powered-By: PHP/5.2.4
Set-Cookie: PHPSESSID=9c2d6a272a7aadf85a990d45041898e3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
344
<div id="menu1" class="hmenu colMenu">
[snip]
<div id="indhold1" class="hpage colText"></div>
0
Nu er telnet en tekstbaseret 'terminal', så det kan lige så godt være noget
binært snavs, men hvis det er i orden med dig, gider jeg ikke starte min
etheral (aka wireshark) op.
Selvom det måske er pinligt at afsløre at 'den gamle' sidder og sjusker her
om morgenen, har jeg valgt at lade det stå i håb om, at det kan bidrage til
forståelsen af diverse headers osv..
> Serverside er der - i hvert fald i PHP - forskel på hvordan parametrene
> læses, så det er muligt at det også kan lade sig gøre, at anbringe nogle
> parametre som del af URL, og andre i send().
Rigtige mænd skriver selv sine webservere ;)
Men serveren splitter requestet op og afleverer URI(incl parametre) og Data
i hver sin buffer til det efterfølgende 'program' PHP/Ruby/ASP osv.
> Og jeg læser altså dokumentationen, som URL skal i open() og parametre i
> send().
Hvad er det for en dokumentation du henvider til?
--
Med venlig hilsen
Stig Johansen
| |
Birger (12-11-2007)
| Kommentar Fra : Birger |
Dato : 12-11-07 13:21 |
|
"Stig Johansen" <stig_johansen_it_at_=(@)hotmail.com> skrev i en meddelelse
news:4736a7fe$0$90273$14726298@news.sunsite.dk...
> Birger wrote:
>
>> "Stig Johansen" <stig_johansen_it_at_=(@)hotmail.com> skrev i en
>> meddelelse news:47354087$0$90270$14726298@news.sunsite.dk...
>>> Birger,
>>> Man kunne også tænke den tanke at:
>>> Ved GET er parametre en del af URL'en
>>> Ved POST er parametre (del del som ikke er en del af URL'en) en stribe
>>> name-valuepair i content delen af requestet.
>>
>> Jo det kan man - og det var sådan set det jeg mente.
>> Men det fremgår ikke af nogen dokumentation jeg har set eller kunnet
>> finde.
>
> Pis Birger, rigtige mænd læser squ da ikke manualer og dokumentation, men
> nu
> fik du mig til at gøre det alligevel.
>
> Jeg ved ikke hvilken dokumentation du bruger, men jeg vil refererer til
> denne her:
> < http://www.w3.org/TR/XMLHttpRequest/>
>
> Jeg synes denne her:
> ....
> The send() method initiates the request and its optional argument provides
> the entity body.
> ....
> er soleklar.
>
> Det kræver at man 'kan sin HTTP', men for en sikkerheds skyld (og for
> andre
> læseres) vil jeg prøve at simplificere:
> En request til serveren består overordnet af 3 dele:
> [1] [METODE] URI HTTP version
> [2] Headers
> [3] Data
>
> METODE er i vores tråd her GET eller POST, og normalt har man ikke noget
> Data, hvis man vil medsende data bruger man POST. Det ligger næsten i
> ordene GET og POST.
>
> Jeg tror jeg prøver at lave et simplificeret eksempel:
>
> Step [1] - generer 'overskriften'
> Det sker via open metoden, resulterer i 1. linie i requestet, eksempelvis
> GET /ajax.js HTTP/1.1
> (Hostdelen af URI'en benyttes på IP laget).
>
> Step [2] - generer headers.
> Det sker via setRequestHeader metoden, og jeg klipper lige over fra sin
> 'ajax.js':
> req.setRequestHeader( 'Content-Type', 'text/plain');
> req.setRequestHeader( 'Accept-Charset', 'iso-8859-1, utf-8');
> req.setRequestHeader( 'Accept-Language', 'da');
>
> Når disse er udført, ser requesten sådan her ud:
>
> GET /ajax.js HTTP/1.1
> Host: bbsorensen.dk
> Content-Type: text/plain
> Accept-Charset: iso-8859-1, utf-8
> Accept-Language: da
>
> Når der ikke er data i er requesten klar til 'affyring', jeg prøver lige,
> så
> jeg kan se om jeg har skrevet rigtigt (Hvis du ser nogle fejl i din log,
> så
> er det bare mig, der fumler med 'kodekæppen')
>
> Jeg starter lige en telnet op: telnet bbsorensen.dk 80
> Jo, dæleme om ikke den virkede i første hug, men nu havde jeg jo også
> klippet og klisteret, her er resultatet fra 'telnetten':
>
> sj@lwork1 > telnet bbsorensen.dk 80
> Trying 195.47.247.103...
> Connected to bbsorensen.dk.
> Escape character is '^]'.
> GET /ajax.js HTTP/1.1
> Host: bbsorensen.dk
> Content-Type: text/plain
> Accept-Charset: iso-8859-1, utf-8
> Accept-Language: da
>
> HTTP/1.1 200 OK
> Date: Sun, 11 Nov 2007 06:10:33 GMT
> Server: Apache
> Last-Modified: Tue, 23 Oct 2007 08:56:20 GMT
> ETag: "309fdd0f-742-471db734"
> Accept-Ranges: bytes
> Content-Length: 1858
> Connection: close
> Content-Type: application/x-javascript
>
> ....selve scriptet..osv
>
> Nå til POST, jeg tror jeg lavede et lille testdokument tidligere, jeg
> leder
> lige efter det.....
> Damn, det kunne jeg ikke finde .. prøver lige at starte min Windows PC
> op.... gud er det så'n windoes ser ud :) .. fandt det.
> Hav lige lidt tålmodighed, det skal klippe og klistres via den bologiske
> computer..
>
> Det var, eller er, hvis du ikke har lavet det om, en POST til din
> h_menu.php, og dataene var(er):
> side=Forside
> lvl=1
> ptyp= (tomt)
> B1=Submet
>
> Jeg har lige prøvet den ovre on the dark side of the source, så du har den
> stadig kørende, så lad os udvide requesten fra før til en POST med data:
>
> GET /h_menu.php HTTP/1.1
> Host: bbsorensen.dk
> Content-Type: text/plain
> Accept-Charset: iso-8859-1, utf-8
> Accept-Language: da
> Content-Length: 34
>
> side=Forside&lvl=1&ptyp=&B1=Submet
>
> (Den blanke linie *skal* være der)
>
> Skulle vi ikke lige prøve at fyre den af ovre i telnetten?
> Den respose ser lidt mærkeligt ud:
> ....
> 5f
> <div id="menu" class="hmenu colMenu">
> </div>
> <div id="indhold" class="hpage colText"></div>
>
> 0
> ....
>
> Der er noget støj, det kan være du skal kigge lidt på din kode, men vent
> lige lidt... Der gik noget galt i den biologiske computer - jeg prøver
> lige
> igen med:
>
> POST /h_menu.php HTTP/1.1
> Host: bbsorensen.dk
> Content-Type: text/plain
> Accept-Charset: iso-8859-1, utf-8
> Accept-Language: da
> Content-Length: 34
>
> side=Forside&lvl=1&ptyp=&B1=Submit
>
> Hmm.. jeg må være træt, jeg sidder og fumler.. jeg prøver lige at læse
> korrektur, det er lidt noget hø når man ikke kan klippe og klistre....
>
> POST /h_menu.php HTTP/1.1
> Host: bbsorensen.dk
> Content-Type: application/x-www-form-urlencoded
> Accept-Charset: iso-8859-1, utf-8
> Accept-Language: da
> Content-Length: 34
>
> side=Forside&lvl=1&ptyp=&B1=Submit
>
> Jeps nu var den der, men der er noget støj:
>
> HTTP/1.1 200 OK
> Date: Sun, 11 Nov 2007 06:47:09 GMT
> Server: Apache
> X-Powered-By: PHP/5.2.4
> Set-Cookie: PHPSESSID=9c2d6a272a7aadf85a990d45041898e3; path=/
> Expires: Thu, 19 Nov 1981 08:52:00 GMT
> Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
> pre-check=0
> Pragma: no-cache
> Connection: close
> Transfer-Encoding: chunked
> Content-Type: text/html
>
> 344
> <div id="menu1" class="hmenu colMenu">
> [snip]
> <div id="indhold1" class="hpage colText"></div>
>
> 0
>
> Nu er telnet en tekstbaseret 'terminal', så det kan lige så godt være
> noget
> binært snavs, men hvis det er i orden med dig, gider jeg ikke starte min
> etheral (aka wireshark) op.
>
> Selvom det måske er pinligt at afsløre at 'den gamle' sidder og sjusker
> her
> om morgenen, har jeg valgt at lade det stå i håb om, at det kan bidrage
> til
> forståelsen af diverse headers osv..
>
>> Serverside er der - i hvert fald i PHP - forskel på hvordan parametrene
>> læses, så det er muligt at det også kan lade sig gøre, at anbringe nogle
>> parametre som del af URL, og andre i send().
>
> Rigtige mænd skriver selv sine webservere ;)
> Men serveren splitter requestet op og afleverer URI(incl parametre) og
> Data
> i hver sin buffer til det efterfølgende 'program' PHP/Ruby/ASP osv.
>
>> Og jeg læser altså dokumentationen, som URL skal i open() og parametre i
>> send().
>
> Hvad er det for en dokumentation du henvider til?
>
> --
> Med venlig hilsen
> Stig Johansen
Godt, så ;>)
Jeg har aldrig studeret HTTP protokoller.
Mener måske heller ikke, at det er nødvendigt for at bruge dem.
Det overblik som ind imellem dukker op her, svarer temmelig godt til det jeg
havde i forvejen.
Og egentlig, er det vel heller ikke det, det handler om, men om hvordan
"XMLHttpRequest objecterne" håndterer de data der overlades til dem, i håb
om at de anvendes til at foretage den ønskede request.
(Reelt er der her tale om de 3 forskellige objecter, der - afhængig af
browser og version - kan komme i anvendelse).
At W3C efterhånden har nogle anbefalinger i den henseende, er ikke
ensbetydende med, at tingene faktisk virker sådan ( i FF f.eks. hedder
onreadystatechange onload, hvis post og asynkron bruges sammen i open()), og
den eneste dokumentation på disse objekter, jeg har kunnet finde, er
http://msdn2.microsoft.com/en-us/library/ms536736.aspx
Jeg kan så godt se, at jeg måske læser det forkert, og at det handler om
fortolkning af nogle få ord i en M$ "how to".
Ved POST er der ikke så mange problemer - data skal i send();
Ved GET kommer det vel dybest set an på, hvordan man fortolker "message
body" ( og hvor stor forståelse man har for HTTP).
h_menu.php?lvl=1&side=Forside
Her er "lvl=1&side=Forside" for mig, klart meddelelsens indhold - "message
body" - altså skal den i send() og ikke open().
Men jeg har set det virke med begge dele.
Hvilket ikke er det samme som, at det altid vil virke, uanset hvordan man
gør. Det vil afhænge af hvordan "XMLHttpRequest-objectet" behandler de data
det gives.
Måske er det pis.
Et eller andet sted, handler det om at finde årsagen til de fejl - eller
afvigelser fra forventede resultater - som Brian oplevede.
Og måden at angive parametre til overførslen, var een af dem jeg - i første
omgang - så, som kunne være en årsag.
"Rigtige mænd skriver selv sine webservere ;)"
Jo, måske ;>)
Hvis der ikke allerede er skrevet een til den aktuelle anvendelse.
De skal vel ikke først opfinde den dybe tallerken, før de kan få en portion
suppe?
Birger
| |
Stig Johansen (13-11-2007)
| Kommentar Fra : Stig Johansen |
Dato : 13-11-07 07:52 |
|
Birger wrote:
> Ved POST er der ikke så mange problemer - data skal i send();
> Ved GET kommer det vel dybest set an på, hvordan man fortolker "message
> body" ( og hvor stor forståelse man har for HTTP).
> h_menu.php?lvl=1&side=Forside
> Her er "lvl=1&side=Forside" for mig, klart meddelelsens indhold - "message
> body" - altså skal den i send() og ikke open().
> Men jeg har set det virke med begge dele.
Jeg modsiger dig ikke.
Principielt er enhver request/response bare en tekststreng, der fortolkes af
serveren.
GET metoden er tænkt til kun at hente data. Når en server modtager en GET,
er der ingen grund til at læse andet end headerne (hvorfor skulle den det?
=performance penalty)
Som du selv skriver, er der da nok nogle ikke optimerede servere, der
ukritisk læser videre ned i data delen med tilhørende decoding, men du kan
aldrig være _sikker_.
Du skriver:
>Måske er det pis.
Det var ikke henvendt til dig eller det du skriver, men til mig selv. Det
var faktisk ment som en slags kompliment om at du formåede at få 'the old
man' til at glo i en manual/dokumentation.
--
Med venlig hilsen
Stig Johansen
| |
Stig Johansen (13-11-2007)
| Kommentar Fra : Stig Johansen |
Dato : 13-11-07 08:04 |
|
Birger wrote:
> "Rigtige mænd skriver selv sine webservere ;)"
> Jo, måske ;>)
> Hvis der ikke allerede er skrevet een til den aktuelle anvendelse.
Netop, hvis man 'kun' har brug for højt optimeret soap/xml+xlst server er
der ingen grund til at bruge en allmighty swiss knife,
> De skal vel ikke først opfinde den dybe tallerken, før de kan få en
> portion suppe?
Nej men hvis man kan nøjes med en skefuld, er der på den anden side heller
brug for at bruge den dybe tallerken.
--
Med venlig hilsen
Stig Johansen
| |
Lasse Reichstein Nie~ (17-11-2007)
| Kommentar Fra : Lasse Reichstein Nie~ |
Dato : 17-11-07 12:55 |
|
"Birger" <sdc@bbsorensen.com> writes:
> "Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
> news:473c0c95$0$15881$edfadb0f@dtext01.news.tele.dk...
>> det var i linien if(ajax == false) { return; } der skulle ændres til
>> if(!ajax) { return; }
> ajax er null eller et object.
Der er også muligheden at "ajax" har værdien "undefined".
I dette tilfælde tror jeg netop det er det der sker (hvis man bruger
"ajax"-variablen efter at have kaldt metoden, og ikke dens returværdi).
> Det rigtige må så vel være at spørge om (ajax == null) eller (ajax != null).
Det ville også virke. Jeg foretrækker personligt (!ajax), som også virker.
> Kan ikke lige huske specifikt for javascript.
> Mener den ene af dem er ulovlig - det er vist kun tilladt at bruge !=
Begge virker. (a != b) er det samme som (!(a == b))
/l
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL: http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
| |
Birger (17-11-2007)
| Kommentar Fra : Birger |
Dato : 17-11-07 15:21 |
|
"Lasse Reichstein Nielsen" <lrn@hotpop.com> skrev i en meddelelse
news:r6ipw0h1.fsf@hotpop.com...
> "Birger" <sdc@bbsorensen.com> writes:
>
>> "Brian Bendtsen" <nightowl@galnet.dk> skrev i en meddelelse
>> news:473c0c95$0$15881$edfadb0f@dtext01.news.tele.dk...
>
>>> det var i linien if(ajax == false) { return; } der skulle ændres til
>>> if(!ajax) { return; }
>
>> ajax er null eller et object.
>
> Der er også muligheden at "ajax" har værdien "undefined".
> I dette tilfælde tror jeg netop det er det der sker (hvis man bruger
> "ajax"-variablen efter at have kaldt metoden, og ikke dens returværdi).
>
>> Det rigtige må så vel være at spørge om (ajax == null) eller (ajax !=
>> null).
>
> Det ville også virke. Jeg foretrækker personligt (!ajax), som også virker.
>
>> Kan ikke lige huske specifikt for javascript.
>> Mener den ene af dem er ulovlig - det er vist kun tilladt at bruge !=
>
> Begge virker. (a != b) er det samme som (!(a == b))
>
> /l
> --
> Lasse Reichstein Nielsen - lrn@hotpop.com
> DHTML Death Colors:
> <URL: http://www.infimum.dk/HTML/rasterTriangleDOM.html>
> 'Faith without judgement merely degrades the spirit divine.'
Det var nu ikke lige sådan jeg mente...
Den rutine der kaldes, kreerer og returnerer et object :
mitObj = MakeObject();
I MakeObject() må det så være programmørens ansvar, at der returneres et
object eller null. Mener faktisk ikke at "undefined" er en acceptabel værdi.
[
Jeg har ikke interesseret mig så voldsomt for Brians kodning, mere om de
ting der direkte påvirker anvendelsen af ajax.
Men ved denne nærlæsning, kan jeg se han har et problem med sin
createAjax().
Den kan faktisk returnere undefined - som han bør afhjælpe ved at
initialisere den, (eller sætte den, hvis de andre muligheder svigter) :
ajax = null;
]
Man kan så spørge om det er et object - altså forskellig fra null, eller lig
med null.
Og det er her jeg mener at kunne huske at den ene ikke er tilladt, men er
ikke sikker.
Tror det ikke er tilladt at spørge (ajax == null), fordi ajax vil være en
pointer, mens null ikke er en veldefineret sådan.
if ( !mitObj), virker formentlig.
Men det er IMHO skidt programmering, fordi mitObj ikke er en boolsk
variabel.
If tester om parantesen evaluerer til sand eller falsk. Hvis sand udføres
den efterfølgende {..} (eller statement hvis {} udelades).
Hvis falsk udføres en evt. else {..}
mitObj er et object (en pointer til et object) - som hverken er (eller kan
være) sand eller falsk. Altså er !mitObj lige så udefineret, og egentlig
noget vrøvl.
At kompileren er i stand til at omsætte null eller undefined til false, og
andet til true, er ikke en undskyldning for ikke at skrive sin kode læselig.
(Og vel egentlig ikke noget, man kan antage at fremtidige kompilere vil
gøre..)
Birger
| |
Lasse Reichstein Nie~ (17-11-2007)
| Kommentar Fra : Lasse Reichstein Nie~ |
Dato : 17-11-07 21:04 |
|
"Birger" <sdc@bbsorensen.com> writes:
> Den rutine der kaldes, kreerer og returnerer et object :
> mitObj = MakeObject();
> I MakeObject() må det så være programmørens ansvar, at der returneres et
> object eller null. Mener faktisk ikke at "undefined" er en acceptabel værdi.
Personligt synes jeg "null" er en unødvendig værdi i Javascript, og
jeg har ingen problemer med at returnere "undefined" for at
repræsentere fraværet af en værdi. Det er så et spørgsmål om smag.
> [
> Jeg har ikke interesseret mig så voldsomt for Brians kodning, mere om de
> ting der direkte påvirker anvendelsen af ajax.
> Men ved denne nærlæsning, kan jeg se han har et problem med sin
> createAjax().
> Den kan faktisk returnere undefined - som han bør afhjælpe ved at
> initialisere den, (eller sætte den, hvis de andre muligheder svigter) :
> ajax = null;
> ]
I dette tilfælde returnerede den faktisk "false" hvis det ikke lykkes
at oprette et "ajax"-object.
Den bruger også "ajax" som en global variabel. Hvis den var sat til
at være lokal til funktionen, så ville det være meget mere klart
at man skulle holde sig til den returnerede værdi.
> Man kan så spørge om det er et object - altså forskellig fra null, eller lig
> med null.
> Og det er her jeg mener at kunne huske at den ene ikke er tilladt, men er
> ikke sikker.
Ingen problemer med nogen af dem.
> Tror det ikke er tilladt at spørge (ajax == null), fordi ajax vil være en
> pointer, mens null ikke er en veldefineret sådan.
Det her er Javascript. Variablen "ajax" har en værdi. Det er enten et
objekt, et tal, en streng, en boolean, null eller undefined. Alle
værdier kan sammenlignes. Hvis man bruger "==" eller "!=" vil der foretages
type-konvertering hvor det er nødvendigt, hvorfor "null" og "undefined"
faktisk er ens. Hvis man bruger "===" eller "!==" er to værdier kun
lig hinanden hvis der både har samme type og er lig ifølge "==".
Du tænker muligvis på tal-værdien NaN (Not-a-Number) der har den
sjove egenskab at den ikke er lig med sig selv: NaN == NaN giver false.
> if ( !mitObj), virker formentlig.
Jep. Den koverterer værdien til en boolean og negerer den. Både "null"
og "undefined" bliver konverteret til false.
> Men det er IMHO skidt programmering, fordi mitObj ikke er en boolsk
> variabel.
Det er Javascript. Idiomet "!object" er klassisk i Javascript for at
se om en variabel har en værdi eller ej. På samme måde kan man bruge
"logiske" operationer til andet end bare booleske udtryk, fx:
function onFoo(event) { // en typisk event-handler
event = event || window.event;
var target = event.target || event.srcElement;
...
}
> If tester om parantesen evaluerer til sand eller falsk. Hvis sand udføres
> den efterfølgende {..} (eller statement hvis {} udelades).
> Hvis falsk udføres en evt. else {..}
> mitObj er et object (en pointer til et object) - som hverken er (eller kan
> være) sand eller falsk. Altså er !mitObj lige så udefineret, og egentlig
> noget vrøvl.
I Javascript tæller følgende værdier som "falsk":
false
null
undefined
tallet 0
tallet NaN
den tomme streng
Det er helt traditionelt at bruge den slags forkortelser som "!value".
> At kompileren er i stand til at omsætte null eller undefined til false, og
> andet til true, er ikke en undskyldning for ikke at skrive sin kode læselig.
Personligt synes jeg det gør det *lettere* at læse. Det kræver
selvfølgelig at læseren er vant til Javascript, eller et lignende sprog.
Javascript er *ikke* Java. Det er nok tættere på Perl eller Scheme.
> (Og vel egentlig ikke noget, man kan antage at fremtidige kompilere vil
> gøre..)
Jo, det er specificeret klart og tydeligt i sprogets specifikation (fx
ECMA 262 3.ed).
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL: http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
| |
Birger (18-11-2007)
| Kommentar Fra : Birger |
Dato : 18-11-07 00:11 |
|
"Lasse Reichstein Nielsen" <lrn@hotpop.com> skrev i en meddelelse
news:ejeowseo.fsf@hotpop.com...
> "Birger" <sdc@bbsorensen.com> writes:
>
>> Den rutine der kaldes, kreerer og returnerer et object :
>> mitObj = MakeObject();
>> I MakeObject() må det så være programmørens ansvar, at der returneres et
>> object eller null. Mener faktisk ikke at "undefined" er en acceptabel
>> værdi.
>
> Personligt synes jeg "null" er en unødvendig værdi i Javascript, og
> jeg har ingen problemer med at returnere "undefined" for at
> repræsentere fraværet af en værdi. Det er så et spørgsmål om smag.
>
>> [
>> Jeg har ikke interesseret mig så voldsomt for Brians kodning, mere om de
>> ting der direkte påvirker anvendelsen af ajax.
>> Men ved denne nærlæsning, kan jeg se han har et problem med sin
>> createAjax().
>> Den kan faktisk returnere undefined - som han bør afhjælpe ved at
>> initialisere den, (eller sætte den, hvis de andre muligheder svigter) :
>> ajax = null;
>> ]
>
> I dette tilfælde returnerede den faktisk "false" hvis det ikke lykkes
> at oprette et "ajax"-object.
>
> Den bruger også "ajax" som en global variabel. Hvis den var sat til
> at være lokal til funktionen, så ville det være meget mere klart
> at man skulle holde sig til den returnerede værdi.
>
>> Man kan så spørge om det er et object - altså forskellig fra null, eller
>> lig
>> med null.
>> Og det er her jeg mener at kunne huske at den ene ikke er tilladt, men er
>> ikke sikker.
>
> Ingen problemer med nogen af dem.
>
>> Tror det ikke er tilladt at spørge (ajax == null), fordi ajax vil være en
>> pointer, mens null ikke er en veldefineret sådan.
>
> Det her er Javascript. Variablen "ajax" har en værdi. Det er enten et
> objekt, et tal, en streng, en boolean, null eller undefined. Alle
> værdier kan sammenlignes. Hvis man bruger "==" eller "!=" vil der
> foretages
> type-konvertering hvor det er nødvendigt, hvorfor "null" og "undefined"
> faktisk er ens. Hvis man bruger "===" eller "!==" er to værdier kun
> lig hinanden hvis der både har samme type og er lig ifølge "==".
>
> Du tænker muligvis på tal-værdien NaN (Not-a-Number) der har den
> sjove egenskab at den ikke er lig med sig selv: NaN == NaN giver false.
>
>> if ( !mitObj), virker formentlig.
>
> Jep. Den koverterer værdien til en boolean og negerer den. Både "null"
> og "undefined" bliver konverteret til false.
>
>
>> Men det er IMHO skidt programmering, fordi mitObj ikke er en boolsk
>> variabel.
>
> Det er Javascript. Idiomet "!object" er klassisk i Javascript for at
> se om en variabel har en værdi eller ej. På samme måde kan man bruge
> "logiske" operationer til andet end bare booleske udtryk, fx:
>
> function onFoo(event) { // en typisk event-handler
> event = event || window.event;
> var target = event.target || event.srcElement;
> ...
> }
>
>> If tester om parantesen evaluerer til sand eller falsk. Hvis sand udføres
>> den efterfølgende {..} (eller statement hvis {} udelades).
>> Hvis falsk udføres en evt. else {..}
>
>> mitObj er et object (en pointer til et object) - som hverken er (eller
>> kan
>> være) sand eller falsk. Altså er !mitObj lige så udefineret, og egentlig
>> noget vrøvl.
>
> I Javascript tæller følgende værdier som "falsk":
> false
> null
> undefined
> tallet 0
> tallet NaN
> den tomme streng
>
> Det er helt traditionelt at bruge den slags forkortelser som "!value".
>
>
>> At kompileren er i stand til at omsætte null eller undefined til false,
>> og
>> andet til true, er ikke en undskyldning for ikke at skrive sin kode
>> læselig.
>
> Personligt synes jeg det gør det *lettere* at læse. Det kræver
> selvfølgelig at læseren er vant til Javascript, eller et lignende sprog.
> Javascript er *ikke* Java. Det er nok tættere på Perl eller Scheme.
>
>> (Og vel egentlig ikke noget, man kan antage at fremtidige kompilere vil
>> gøre..)
>
> Jo, det er specificeret klart og tydeligt i sprogets specifikation (fx
> ECMA 262 3.ed).
>
> /L
> --
> Lasse Reichstein Nielsen - lrn@hotpop.com
> DHTML Death Colors:
> <URL: http://www.infimum.dk/HTML/rasterTriangleDOM.html>
> 'Faith without judgement merely degrades the spirit divine.'
Så fik jeg også lært noget i dag. Tak.
Vil dog nok stadig skrive min kode, så den giver mening - i hvert fald for
mig selv ;>)
Birger
| |
Kerim Ellentoft (18-11-2007)
| Kommentar Fra : Kerim Ellentoft |
Dato : 18-11-07 00:42 |
|
"Birger" <sdc@bbsorensen.com> skrev :
>Så fik jeg også lært noget i dag. Tak.
Det er nogle fine indlæg du skriver, men vil du ikke gøre os alle
en tjeneste ved at klippe i det du citerer?
Der er ingen grund til at citere hele det indlæg, som man
besvarer, men blot det man direkte svarer på, herunder også
klippe en evt. signatur fra.
Tak.
--
Kerim
»Søger nogen en anden religion end Islam, skal den ikke modtages
af Ham, og han skal i det kommende liv være blandt taberne.«
(Sura 3, vers 87)
| |
Kerim Ellentoft (09-11-2007)
| Kommentar Fra : Kerim Ellentoft |
Dato : 09-11-07 18:52 |
|
Brian Bendtsen <nightowl@galnet.dk> skrev :
>typo3.hostcenter.dk (beklager reklamen, men jeg bliver tit opfordret til
>at medsende link, så hermed gjort).
Hvor er linket?
--
Kerim
»Søger nogen en anden religion end Islam, skal den ikke modtages
af Ham, og han skal i det kommende liv være blandt taberne.«
(Sura 3, vers 87)
| |
Jørn Andersen (10-11-2007)
| Kommentar Fra : Jørn Andersen |
Dato : 10-11-07 04:51 |
|
On Fri, 09 Nov 2007 18:52:17 +0100, Kerim Ellentoft
<kerim@mail.tele.invalid> wrote:
>Brian Bendtsen <nightowl@galnet.dk> skrev :
>
>>typo3.hostcenter.dk (beklager reklamen, men jeg bliver tit opfordret til
>>at medsende link, så hermed gjort).
>
>Hvor er linket?
De første 19 bogstaver af det, du citerede
Mvh. Jørn
--
Jørn Andersen,
Brønshøj
| |
|
|