Avatar billede nightowl24 Nybegynder
07. november 2007 - 09:36 Der er 9 kommentarer og
1 løsning

Problem med ajax og adskillige kald til ajax object

Hej

Jeg er ved at lave min første ajax applikation, men det driller lidt.

Jeg er ved at lave en domænetester som automatisk skal teste om domænet med diverse domænetyper er ledigt.

Scriptet kan afprøves her:
http://typo3.hostcenter.dk/phpwhois/ajax/VisResultat.php?domain=ajax.dk

Her er min javascript kode:

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) {}
    }
}
return ajax;

if (!ajax) {
  alert('Giving up :( Cannot create an XMLHTTP instance');
  return false;
}
}   

var domExt;
var i = 0;

function check_domainname(domainname) {
    //Ajax function needs to run exactly as many times as there are domain types
    for(i=0;i<5;i=i+1) {
    //Split domainname in name and domain type   
    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', 'checkdomainname.php?domainname=' + encodeURIComponent(domainname));
        ajax.send(null);

    switch(i) {
      case 0:
          domainname = domArr[0]+'.com';
        break
      case 1:
          domainname = domArr[0]+'.as';
        break
      case 2:
          domainname = domArr[0]+'.nu';
        break
      case 3:
          domainname = domArr[0]+'.org';
        break   
    }
    }
}

function handle_check(ajax) {
    if (ajax.readyState == 4) {
        if(ajax.status == 200) {
        document.getElementById('message_'+domExt).innerHTML = ajax.responseText;
        }
        else {
        document.getElementById('message_'+domExt).innerHTML = "<font color='red'>"+ajax.status+"</font>";   
        }
    } else {
        document.getElementById('message_'+domExt).innerHTML = "<font color='red'>"+ajax.readyState+"</font>";
    }
}

Når man indtaster URL'en med et domænenavn som parameter, skal min resultatside vises med det samme og herefter skal status for diverse domæner poppe frem løbende, men det er kun den sidste der bliver vist. De fire første opslag kommer ikke forbi loading state.

Refresher man herefter siden, kan man se at alle opslag returnere en værdi.

Er der en ajax ekspert der kan finde fejlen i mit script?

/Nightowl
Avatar billede montago Praktikant
07. november 2007 - 09:50 #1
document.getElementById("message_" + domExt) has no properties

[Break on this error] document.getElementById('message_'+domExt).innerHTML = ajax.responseText;

det lader til at du mangler et ID eller bruger ID forkert
Avatar billede montago Praktikant
07. november 2007 - 09:51 #2
desuden en return-fejl:
ret til

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;
}
Avatar billede montago Praktikant
07. november 2007 - 09:53 #3
synes ellers ik jeg finder nogen fejl, medmindre jeg bruger Javascript...

fx virker
http://typo3.hostcenter.dk/phpwhois/ajax/VisResultat.php?domain=knas

jo helt fint ?
Avatar billede montago Praktikant
07. november 2007 - 09:58 #4
men det jeg tror du vil... er at lave en side som minder om Unoeuro, som popper op med svar, 1 efter en - ik ??


så skal du evt lave et array med domæne extesions:

var name = "testdomain"
var exts = new Array("dk","com"...)
var i = 0;
function tick(){
  check_domainname(name + "." + exts[i])
  if(exts[i++])
    setTimeout(tick, 100)
}

som looper intil arrayet er tomt
Avatar billede nightowl24 Nybegynder
07. november 2007 - 10:11 #5
Jo, det er faktisk noget i stil med unoeuro jeg vil opnå. Du skriver i kommentar 3 at det virker fint, men sådan som jeg ser det, så er det kun sidste tjek der virker, resten kommer ikke videre end loading, som ses ved de røde 1-taller. Ser du ikke dem?
Avatar billede nightowl24 Nybegynder
07. november 2007 - 10:56 #6
Jeg har nu forsøgt at indsætte dit kodeforslag, men jeg synes problemet er blevet værre. Jeg får for det første ikke gennemført mine ajax kald, de ender i loading tilstand.

Desuden får jeg nu en hulens masse javascript fejl.
Avatar billede nightowl24 Nybegynder
07. november 2007 - 13:31 #7
Nå, jeg fik skrevet lidt om på koden og nu har jeg ikke længere javascript fejl, men jeg får stadig et underligt resultat i Internet Explorer som jeg indledingsvis beskrev.
Mit script:

// script 13.3 - checkusername.js

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', 'checkdomainname.php?domainname=' + encodeURIComponent(domainname));
        ajax.send(null);
}

function handle_check(ajax) {
    if (ajax.readyState == 4) {
        if(ajax.status == 200) {
        document.getElementById('message_'+domExt).innerHTML = ajax.responseText;
        }
        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", "as", "nu", "org", "net", "biz")
var i = 0;
var name = "test";

function setDomainName(newName) {
name = newName;
tick();
}

function tick() {
    if(exts[i]) {
    check_domainname(name + "." + exts[i])
    i++;
    setTimeout(tick,100)
    }
}
Avatar billede montago Praktikant
19. november 2007 - 15:00 #8
scriptet virker vidst fint i både IE og FF nu...

dog ville jeg have valgt at lave en tråd hvor hver domæne du vil teste...

dette kan du gøre ved at kalde fx 5 setTimeout's lige efter hinanden, idet de køre asynkront sammen med AJAX
Avatar billede nightowl24 Nybegynder
27. november 2007 - 20:12 #9
Tak for din hjælp montago, jeg har fået det til at virke, smid bare et svar.
Avatar billede montago Praktikant
27. november 2007 - 20:18 #10
okay så :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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