Avatar billede henrik_k Nybegynder
26. august 2008 - 14:54 Der er 7 kommentarer og
1 løsning

hjælp til ajax

Hej eksperter jeg har problemer med nedenstående kode:

function getHTTPObject(){
        if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
        else if (window.XMLHttpRequest) return new XMLHttpRequest();
        else {
            alert("Your browser does not support AJAX.");
            return null;
        }
    }

    function setOutput(elementId){
      alert(httpObject.readyState);
      if(httpObject.readyState == 4){
        document.getElementById(elementId).innerHTML = httpObject.responseText;
      }
    }

    function countryHasBeenChanged(){

        document.getElementById('county_status_select').options[0].selected = true;
        document.getElementById('county_status_select').disabled = true;
        document.getElementById('city_status_select').options[0].selected = true;
        document.getElementById('city_status_select').disabled = true;
        document.getElementById('state_status_select').options[0].selected = true;
        document.getElementById('state_status_select').disabled = true;
        document.getElementById('address_field').value = '';
        document.getElementById('address_field').disabled = true;

        if(document.getElementById('country_status_select').value > 0){
            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?country=" + document.getElementById('country_status_select').value, true);
                httpObject.send(null);
                httpObject.onreadystatechange = setOutput('state_div');
            }
        }
    }

    function stateHasBeenChanged(){
        document.getElementById('city_status_select').options[0].selected = true;
        document.getElementById('city_status_select').disabled = true;
        document.getElementById('county_status_select').options[0].selected = true;
        document.getElementById('county_status_select').disabled = true;
        document.getElementById('address_field').value = '';
        document.getElementById('address_field').disabled = true;

        if(document.getElementById('state_status_select').value > 0){

            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?state=" + document.getElementById('state_status_select').value, true);
                httpObject.send(null);
                httpObject.onreadystatechange = setOutput('county_div');
          }
        }
    }


    function countyHasBeenChanged(){
      document.getElementById('city_status_select').options[0].selected = true;
      document.getElementById('city_status_select').disabled = true;
      document.getElementById('address_field').value = '';
      document.getElementById('address_field').disabled = true;

      if(document.getElementById('county_status_select').value > 0){
            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?county=" + document.getElementById('county_status_select').value, true);
                httpObject.send(null);
                httpObject.onreadystatechange = setOutput('city_div');
            }
      }
  }

  function cityHasChanged(){
    if(document.getElementById('city_status_select').value > 0){
      document.getElementById('address_field').disabled = false;
    }else{
      document.getElementById('address_field').value = '';
      document.getElementById('address_field').disabled = true
    }
  }

  var httpObject = null;



Problemet opstår når jeg fjerner "alert(httpObject.readyState);", derefter insættes der ikke værdier i min html.
Avatar billede softspot Forsker
26. august 2008 - 15:01 #1
Prøv dette:

function getHTTPObject(){
  if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
  else if (window.XMLHttpRequest) return new XMLHttpRequest();
  else {
    alert("Your browser does not support AJAX.");
    return null;
  }
}

    function setOutput(elementId){
      //alert(httpObject.readyState);
      if(httpObject.readyState == 4){
        document.getElementById(elementId).innerHTML = httpObject.responseText;
      }
    }

    function countryHasBeenChanged(){

        document.getElementById('county_status_select').options[0].selected = true;
        document.getElementById('county_status_select').disabled = true;
        document.getElementById('city_status_select').options[0].selected = true;
        document.getElementById('city_status_select').disabled = true;
        document.getElementById('state_status_select').options[0].selected = true;
        document.getElementById('state_status_select').disabled = true;
        document.getElementById('address_field').value = '';
        document.getElementById('address_field').disabled = true;

        if(document.getElementById('country_status_select').value > 0){
            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?country=" + document.getElementById('country_status_select').value, true);
                httpObject.onreadystatechange = function() {setOutput('state_div');}
                httpObject.send(null);
            }
        }
    }

    function stateHasBeenChanged(){
        document.getElementById('city_status_select').options[0].selected = true;
        document.getElementById('city_status_select').disabled = true;
        document.getElementById('county_status_select').options[0].selected = true;
        document.getElementById('county_status_select').disabled = true;
        document.getElementById('address_field').value = '';
        document.getElementById('address_field').disabled = true;

        if(document.getElementById('state_status_select').value > 0){

            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?state=" + document.getElementById('state_status_select').value, true);
                httpObject.onreadystatechange = function() {setOutput('county_div');}
                httpObject.send(null);
          }
        }
    }


    function countyHasBeenChanged(){
      document.getElementById('city_status_select').options[0].selected = true;
      document.getElementById('city_status_select').disabled = true;
      document.getElementById('address_field').value = '';
      document.getElementById('address_field').disabled = true;

      if(document.getElementById('county_status_select').value > 0){
            httpObject = getHTTPObject();
            if (httpObject != null) {
                httpObject.open("GET", "AjaxHelper.php?county=" + document.getElementById('county_status_select').value, true);
                httpObject.onreadystatechange = function() {setOutput('city_div');}
                httpObject.send(null);
            }
      }
  }

  function cityHasChanged(){
    if(document.getElementById('city_status_select').value > 0){
      document.getElementById('address_field').disabled = false;
    }else{
      document.getElementById('address_field').value = '';
      document.getElementById('address_field').disabled = true
    }
  }

  var httpObject = null;
Avatar billede henrik_k Nybegynder
26. august 2008 - 16:32 #2
det virker :)
Hvad betyder det når man indsætter en ekstra function() som du gør?
Smid et svar så får du dine point.
Avatar billede softspot Forsker
26. august 2008 - 16:43 #3
Det du gjorde før var at kalde funktionen og tildele det den returnerede til onreadystatechange eventhandleren (hvilket typisk ikke giver meget mening). Det jeg gør er at tildele en anonym funktion til eventhandleren, som kalder den funktion du gerne vil have skal kaldes når readystate ændrer sig...
Avatar billede olebole Juniormester
26. august 2008 - 21:14 #4
<ole>

Du kan evt. kikke på denne wrapper:
    http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php

- da din egen instantiering af XMLHttpRequest objektet vil formodentlig fejle i en del browsere  ;o)

Derudover bør du ikke bruge GET, når du bruger Ajax - brug POST i stedet. Ellers har IE det med at 'miste hukommelse'.

Undgå også innerHTML, da denne både er invalid og yderst uhensigtsmæssig at bruge. Brugen af innerHTML hænger endda ofte sammen med HTML-formatering af data på serveren - hvilket er en absolut no-go i forbindelse med Ajax. Brug DOM i stedet.

Det er derfor mere end en tilsnigelse at kalde din nuværende kode for 'Ajax'  =)

/mvh
</bole>
Avatar billede olebole Juniormester
26. august 2008 - 21:15 #5
Avatar billede henrik_k Nybegynder
26. august 2008 - 22:25 #6
mange tak ole :)
Jeg vil bestemt ændre min kode som beskrevet i dine links. Ovenstående kode bygger på et "ajax tutorial" men det var hvis ikke særligt godt
Avatar billede softspot Forsker
26. august 2008 - 22:31 #7
Tak for point :)
Avatar billede olebole Juniormester
26. august 2008 - 22:50 #8
Du kan også se nogle eksempler her:
    http://www.eksperten.dk/spm/817625
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