Avatar billede xtr0 Nybegynder
29. november 2006 - 17:54 Der er 14 kommentarer og
1 løsning

AJAX standard skal merges sammen

Hej. Jeg sidder og roder med noget javascript som skal gette noget fra en side og returnere der hvor siden er, til det formål vil jeg bruge det der har stået om det på Mozillas side om ajax.
Min kode ser således ud:
function makeGo(url) {
    var http_request = false;

    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
        }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }   
   
    if (!http_request) {
        alert('Giving up :( Cannot create an XMLHTTP instance');
        //return false;
    }
        http_request.onreadystatechange = function() { alertContents(http_request); };
   
    http_request.open('GET', url, true);
        http_request.send(null);

    }
function alertContents(http_request) {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                alert(http_request.responseText);
            } else {
                alert('There was a problem with the request.');
            }
        }
    }

Men dette er til et meget specifikt "problem", jeg vil gerne have en funktion jeg kan kalde i mine andre funktioner og få klassen til at returnere http_request.responseText, er det muligt at merge de to klasser sammen så jeg kan bruge det som makeGo(url) returnerer i mine andre funktioner?
Avatar billede olebole Juniormester
30. november 2006 - 10:33 #1
<ole>

makeGo returnere nu ikke noget brugbart, men du kan lave lidt om i scriptet.

Før funktionen makeGo opretter du en global variabel:
    var sAjaxResponse = null;

Så ændrer du funktionen alertContents til:

function alertContents(http_request) {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                sAjaxResponse = http_request.responseText;
            } else {
                alert('There was a problem with the request.');
            }
        }
}

- og i makeGo retter du til:

function makeGo(url) {
    sAjaxResponse = null;
    var http_request = false;
... osv - osv ...

Så kan du altid i dine andre funktioner hive fat i sAjaxResponse:

function doDaShit() {
    if (sAjaxResponse) alert(sAjaxResponse);
    else alert("Der er ingen tilgængelig response-streng");
}

/mvh
</bole>
Avatar billede xtr0 Nybegynder
01. december 2006 - 13:14 #2
Mener du sådan her?
    function makeGo(url) {
        sAjaxResponse = null;
        var http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            //return false;
        }
        http_request.onreadystatechange = function() { alertContents(http_request); };

        http_request.open('GET', url, true);
        http_request.send(null);
    }
    function alertContents(http_request) {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                sAjaxResponse = http_request.responseText;
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
    function doDaShit() {
        makeGo('test.php');
        if (sAjaxResponse) alert(sAjaxResponse);
        else alert("Der er ingen tilgængelig response-streng");
    }
Eller hvordan mener du jeg skal bruge det i mine funktioner?
Avatar billede olebole Juniormester
01. december 2006 - 13:19 #3
Nej, jeg mente, hvad jeg skrev  =)

sAjaxResponse = null;
    function makeGo(url) {
        var http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            //return false;
        }
        http_request.onreadystatechange = function() { alertContents(http_request); };

        http_request.open('GET', url, true);
        http_request.send(null);
    }
    function alertContents(http_request) {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                sAjaxResponse = http_request.responseText;
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
    function doDaShit() {
        if (sAjaxResponse) alert(sAjaxResponse);
        else alert("Der er ingen tilgængelig response-streng");
    }

makeGo('test.php');
doDaShit();
Avatar billede xtr0 Nybegynder
01. december 2006 - 13:27 #4
Oh.. Lækkert.. Er dette "best practice", eller hvordan ville de sejere gutter gøre?
Avatar billede olebole Juniormester
01. december 2006 - 13:34 #5
'sejere' end mig ...?!??!!! Hvad mener du?  :D
Avatar billede xtr0 Nybegynder
01. december 2006 - 13:41 #6
Hehe, kunne jo godt være dit bare var et hack på mit dårlige kode (som jeg har bøffet fra standard eksemplet).
Men smid et svar ole ;)
Avatar billede olebole Juniormester
01. december 2006 - 13:53 #7
*LoL* ... det var bare en dårlig joke  ;D
Man kan altid kode noget anderledes - og med flere eller færre features - men din kode fejler ikke noget, som den er  ;o)
Avatar billede olebole Juniormester
01. december 2006 - 14:42 #8
Tak for points  ;o)
Avatar billede xtr0 Nybegynder
01. december 2006 - 15:03 #9
Har du en idè om hvorfor den failer første gang ved "Der er ingen tilgængelig response-streng". Og anden gang virker det?
Avatar billede xtr0 Nybegynder
01. december 2006 - 15:09 #10
Avatar billede olebole Juniormester
01. december 2006 - 15:14 #11
Jamen, for det første skriver test.php jo slet ikke et XML-dokument ud  =)
Avatar billede xtr0 Nybegynder
01. december 2006 - 15:29 #12
Nej, det behøver den jo heller ikke. Men det er vel ikke derfor den failer?
Avatar billede xtr0 Nybegynder
02. december 2006 - 20:17 #13
Har du en ide?
Avatar billede olebole Juniormester
04. december 2006 - 12:53 #14
Ja, jeg rettede dig tidligere (01/12-2006 13:19:52). Der er jo netop tale om asynkron komunikation med serveren - hvorfor du ikke har resultatet med det samme. Denne konstruktion virker med andre ord ikke:

    function doDaShit() {
        makeGo('test.php');
        if (sAjaxResponse)
        {
            alert(sAjaxResponse);
        }
        else
        {
            alert("Der er ingen tilg&#65533;ngelig response-streng");
        }
    }

Først skal du afvikle makeGo - og på et senere tidspunkt kan du så bruge sAjaxResponse  ;o)
Avatar billede xtr0 Nybegynder
08. december 2006 - 21:53 #15
Er der ikke en måde at "vente" på svar?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester