Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    169

    ajax - chiamate sincrone non funzionano

    ciao a tutti!
    ho una pagina con 3 combo.
    se nella prima seleziono il classico valore "Tutti"

    devo ricaricare le altre 2 combo con tutti i dati recuperati da DB.
    dunque....
    nel caso in cui debba aggiornare una sola combo funziona tutto bene, invece nel caso in cui le debba aggiornare tutte e 2 non funziona, è come se la prima richieste non aspettasse la sua conclusione per iniziare la seconso, di conseguenza, il valore di alcuni input hidden viene sovrascritto e non riesco più a interpretare il risultato della request.

    considerato il fatto che non posso ridirre le chiamate ad una sola...avete qualche suggerimento?

    vi posto il mio codice.

    function findListFromCombo(strPage,strDeField,strControlNam e,strVisibleComboField) {
    if (fgCallAjax == 0) {
    var arrDeField = strDeField.split('#');
    document.getElementById('ajaxControlList').value = strControlName;
    document.getElementById('visibleComboField').value = strVisibleComboField;
    document.getElementById(strDeField).disabled = true;
    svuotaCombo(strControlName);
    fgCallAjax = 1;
    document.getElementById('ajaxDeField').value = strDeField;
    document.getElementById('ajaxPageName').value = strPage;

    var strParamUrl = '';
    selIndex = document.getElementById(strDeField).selectedIndex;
    if (document.getElementById(strDeField).options[selIndex].value == '') {
    strParamUrl += strDeField+'=';
    } else {
    strParamUrl += strDeField+'='+escape(document.getElementById(strD eField).options[selIndex].value )+'&';
    }

    strParamUrl += '&ajaxDeField='+escape(document.getElementById('aj axDeField').value);
    strParamUrl += '&visibleComboField='+strVisibleComboField;
    strParamUrl += '&controlName='+strControlName;

    var url = 'AjaxServletModule?PAGE='+strPage+'&'+strParamUrl;
    if (window.XMLHttpRequest) {
    req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
    req = new ActiveXObject('Microsoft.XMLHTTP');
    }

    req.open('GET', url, true);
    req.onreadystatechange = callbackList;
    req.send(null);
    document.getElementById(strDeField).disabled = false;
    fgCallAjax = 0;
    }

    }

    function callbackList() {
    if (req.readyState == 4) {
    if (req.status == 200) {
    parseMessageList();
    document.getElementById('ajaxControlList').value = '';
    document.getElementById('visibleComboField').value = '';
    }
    }
    }

    function parseMessageList() {
    listResult = req.responseXML.getElementsByTagName('result')[0];
    if (listResult.childNodes[0].nodeValue == 'List') {
    objComboName = document.getElementById('ajaxControlList').value;
    objCombo = document.getElementById(objComboName);
    listDataCombo = req.responseXML.getElementsByTagName('control_'+ob jComboName)[0];
    listData = listDataCombo.getElementsByTagName('option');
    arrField = document.getElementById('visibleComboField').value .split('_');
    objCombo.options[0] = new Option('Tutti','');
    if (listData.length>0) {
    for (j=0;j<listData.length;j++) {
    keyValue = listData[j].getElementsByTagName(arrField[0])[0].childNodes[0].nodeValue;
    textValue = listData[j].getElementsByTagName(arrField[1])[0].childNodes[0].nodeValue;
    objCombo.options[j+1] = new Option(textValue,keyValue);
    }
    }
    }
    }

    function changeAssessorato() {
    selAssessoratoIndex = document.getElementById('idAssessorato').selectedI ndex;
    if (document.getElementById('idAssessorato').options[selAssessoratoIndex].value=='') {

    svuotaCombo('idSegreteria');
    findListFromCombo('SegreteriaPage','idDirezione',' idSegreteria','idSegreteria_deSegreteria');
    document.getElementById('idSegreteria').readonly = false;

    svuotaCombo('idDirezione');
    findListFromCombo('DirezionePage','idSegreteria',' idDirezione','idDirezione_deDirezione');
    document.getElementById('idDirezione').readonly = false;
    } else {

    svuotaCombo('idSegreteria');
    objCombo = document.getElementById('idSegreteria');
    objCombo.options[0] = new Option('Tutti','');
    document.getElementById('idSegreteria').readonly = true;

    svuotaCombo('idDirezione');
    objCombo = document.getElementById('idDirezione');
    objCombo.options[0] = new Option('Tutti','');
    document.getElementById('idDirezione').readonly = true;
    }

    }



    La parte di codice interessata che genera l'errore è:

    svuotaCombo('idSegreteria');
    findListFromCombo('SegreteriaPage','idDirezione',' idSegreteria','idSegreteria_deSegreteria');
    document.getElementById('idSegreteria').readonly = false;

    svuotaCombo('idDirezione');
    findListFromCombo('DirezionePage','idSegreteria',' idDirezione','idDirezione_deDirezione');
    document.getElementById('idDirezione').readonly = false;

    grazie!

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: non so, forse serve qualche spiegazione in più:

    ho 3 DropDown A, B, C

    Seleziono elemento tutti in A

    faccio la chiamata ajax

    debbo riempire B e C: come? valori uguali?, diversi? :master:
    Pietro

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    169
    le 3 combo hanno valori diversi.

    quindi: seleziono combo A = Tutti
    faccio una select sulla tabella tblB e coi dati letti carico la combo B,
    poi faccio una select sulla tabella tblC e coi dati letti carico la combo C

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da wiulma
    le 3 combo hanno valori diversi.

    quindi: seleziono combo A = Tutti
    faccio una select sulla tabella tblB e coi dati letti carico la combo B,
    poi faccio una select sulla tabella tblC e coi dati letti carico la combo C
    non penso ci sia problema :master:
    io farei così:
    1) tralascio il caso che la risposta ajax sia un file xml, sia perchè tendo a non usare le risposte xml, sia perchè non sarebbe difficile

    2) io restituirei una stringa html composta tipo

    "<select><option></option></select>|<select><option></option></select>"

    al ricevimento della stringa, nella funzione di callback, basta splittare e mettere

    document.getElementById("div1").innerHTML = primastringa;
    document.getElementById("div2").innerHTML = secondastringa;

    Pietro

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    169
    ok...proverò a fare cosi....

    grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.