Newsgroup: it.comp.lang.javascript
Titolo: jQuery/ajax: prelevare codice html da una pagina web per analizzarlo

function setInnerHtml(url, dataType, container) {
     $.ajax({
         type: "GET",
         url: url,
         dataType: dataType,
 
         success: function(response) {
                 container.innerHTML = response;			
         },
 
         error: function(XMLHttpRequest, textStatus, errorThrown) {
                 container.innerHTML = 'Errore nella chiamata AJAX (' + 
url + '): ' + errorThrown;
         }
     });
}
 
//// creo un div, gli assegno il codice html (prelevato dalla pagina 
'/frameworks/test.php'), e lo aggiungo al corpo del documento
var div = document.createElement('div');
setInnerHtml('/frameworks/test.php', 'html', div);
document.body.appendChild(div);
 
 
... ma se invece di assegnare il codice html al div, lo volessi 
semplicemente assegnare ad una variabile per poterlo poi 
analizzare/elaborare?
 
Mi spiego con un esempio da me inventato, e "purtroppo" non funzionante 
(il codice di base è lo stesso, ma con delle modifiche):
 
function getInnerHtml(url, dataType, container) {
     $.ajax({
         type: "GET",
         url: url,
         dataType: dataType,
 
         success: function(response) {
                 return response;			
         },
 
         error: function(XMLHttpRequest, textStatus, errorThrown) {
                 return 'Errore nella chiamata AJAX (' + url + '): ' + 
errorThrown;
         }
     });
}
 
var html = getInnerHtml('/frameworks/test.php', 'html', div);
// analizzo/elaboro il contenuto della variabile "html"...
 
 
 
Come vedete:
 
- Prima di tutto ho dato alla funzione un nome più idoneo: non 
"setInnerHtml", ma "getInnerHtml".
 
- Quindi invece di "container.innerHTML =", ho naturalmente usato "return"
 
- Dunque il tutto "dovrebbe" essere assegnato alla variabile "html" per 
elaborarlo a piacimento.
 
 
In realtà però l'istruzione "return" restituisce il valore solo per la 
funzione "success" (o "error", in caso di errore), che per giunta si 
trova a sua volta all'interno del namespace "$.ajax".
 
La funzione principale "getInnerHtml", infatti restituisce solo un 
"[Object]".
Quindi invece vorrei che proprio essa restituisca il codice html.
Si può?

 elaborarlo a piacimento.
 
No, affatto. Ti sfugge che sono chiamate asincrone. Puoi anche forzarle
in chiamate sincrone, ma bloccheresti il browser finché il server non
restituisce i dati, ed è oggigiorno una pratica non solo non usata, ma
così sconsigliata che stanno valutando se rimuovere tale opzione
dall'oggetto XMLHttpRequest.
 
Si è parlato recentemente delle chiamate sincrone / asincrone nel NG, ti
consiglio di cercare e leggere il thread "leggere file sequenzialmente"
(iniziato da memo).
 
In generale ti consiglio comunque di prenderci la mano con chiamate
asincrone, sistemi ad eventi, callback e promises, perché ci stiamo
spostando sull'avere il più possibile operazioni asincrone (ad esempio,
anche per l'accesso ai file locali), e non parlo solo di JavaScript.

 prima che il risultato della chiamata HTTP sia restituito.
 
a questo punto vedr� di fare le elaborazioni direttamente, all'interno 
di "success:function..."

 di "success:function..."
 
Non č esattamente questo che intendevo con prenderci la mano, con le
chiamate asincrone e tutto il resto. :) Scrivere blocchi di codice
monolitico non č mai una buona idea, bisognerebbe spezzarlo in funzioni
logiche.
 
Con jQuery e `ajax` č abbastanza facile perché implementa direttamente
le promises (se leggi il thread che ti ho suggerito). Sebbene trovi
molte implementazioni di Promises inutilmente complesse (e jQuery non
aiuta certo), puoi avere qualcosa del tipo:
 
    getSomeHTML("foo.html")
        .pipe(stripHTML)
        .pipe(addBangs)
        .then(alert);
 
Che č decisamente leggibile. Per amor di cronaca le funzioni sarebbero tipo:
 
    function getSomeHTML(url) {
        return $.get(url);
    }
 
    function stripHTML(html) {
        return html.substr(0, 10)
    }
 
    function addBangs(html) {
        return html + " !!";
    }
 

 logiche.
 
si ma cerco di fare una cosa alla volta.
Man mano che sorgono le esigenze, contemporaneamente affiner� la tecnica.
Per il momento mi sto rendendo conto che per le cose che devo fare, mi 
basta usare i metodi di base.
Ricordati che sono ancora all'inizio con questi linguaggi, ma credo cmq 
che qualcosa la sto imparando!