Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    caricamento asincrono immagini da func

    ciao.
    Ho una lista di immagini che devo utilizzare in webgl per creare delle texture.
    Il problema è che ho anche un xml di cui devo fare il parsing ed estrarre la geometria.
    a alcune geometrie è associata una texture , quindi un immagine.
    Volevo Sapere se è possibile fare il parsing dell ' xml mentre si caricano le immagini e avere un evento per es(non conosco bene js) che mi dice quando tutte le immagini sono state caricate.
    Mi consigliate di usare una qualche libreria?

    ps.
    Esistono libri incentrati sulla programmazione OOP in javascript?

    grazie.

  2. #2
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Allora, per il parsing dell'XML esistono molti modi. Cmq il più pratico è il responseXML dell'oggetto XMLHttpRequest, che restituisce il foglio XML già parsato. Per quanto riguarda la lettura del contenuto del file XML le cose si complicano. Il metodo nativo è XPath, ma è molto complicato da usare. Un'alternativa a XPath è questa funzione che avevo scritto tempo fa per il Mozilla Developer Center che trasforma un documento XML già parsato in un albero di oggetti javascript (in gergo questo metodo si chiama JXON, "Javascript XML Object Notation"). Te la incollo qui:

    codice:
    function buildValue(sValue) {
    	if (/^\s*$/.test(sValue)) { return(null); }
    	if (/^(true|false)$/i.test(sValue)) { return(sValue.toLowerCase() === "true"); }
    	if (isFinite(sValue)) { return(parseFloat(sValue)); }
    	if (isFinite(Date.parse(sValue))) { return(new Date(sValue)); }
    	return(sValue);
    }
    
    function getXMLData (oXMLParent) {
    	var /* TRUE is the default value for empty nodes */ vResult = true; nLength = 0, sTxtContent = "";
    	if (oXMLParent.hasAttributes()) {
    		vResult = {};
    		for (nLength; nLength < oXMLParent.attributes.length; nLength++) {
    			iAttrib = oXMLParent.attributes.item(nLength);
    			vResult["@" + iAttrib.nodeName.toLowerCase()] = buildValue(iAttrib.nodeValue.replace(/^\s+|\s+$/g, ""));
    		}
    	}
    	if (oXMLParent.hasChildNodes()) {
    		var iKey, iValue, iXMLChild;
    		for (var iChildId = 0; iChildId < oXMLParent.childNodes.length; iChildId++) {
    			iXMLChild = oXMLParent.childNodes.item(iChildId);
    			if (iXMLChild.nodeType === 1 && !iXMLChild.prefix) {
    				if (nLength === 0) { vResult = {}; }
    				iKey = iXMLChild.nodeName.toLowerCase();
    				iValue = getXMLData(iXMLChild);
    				if (vResult.hasOwnProperty(iKey)) {
    					if (vResult[iKey].constructor !== Array) { vResult[iKey] = [vResult[iKey]]; }
    					vResult[iKey].push(iValue);
    				} else { vResult[iKey] = iValue; nLength++; }
    			} else if (iXMLChild.nodeType === 3) { sTxtContent += iXMLChild.nodeValue.replace(/^\s+|\s+$/g, ""); }
    			else if (iXMLChild.nodeType === 4) { sTxtContent += iXMLChild.nodeValue; }
    		}
    	}
    	if (nLength > 0) { vResult.keyValue = buildValue(sTxtContent); Object.freeze(vResult); }
    	else if (sTxtContent) { vResult = buildValue(sTxtContent); }
    
    	return(vResult);
    }
    
    var oAlbero = getXMLData(oResponseXML);
    // abbiamo ottenuto il nostro albero di oggetti javascript! provare per credere: alert(JSON.stringify(oAlbero));
    La funzione è davvero molto semplice da utilizzare. La conversione avviene secondo la «convenzione di Parker». Se vuoi approfondire e capire di cosa si tratta: http://code.google.com/p/xml2json-xs...nsformingRules. Ci sono alcune piccole differenze con la mia funzione, come ad esempio il fatto che i nodi vuoti e senza attributi avranno come valore true invece di null (mi sembrava più sensato ).

    Per quanto riguarda il preload, se ho capito bene, non si può fare quello che chiedi, visto che l'informazione su quali immagini caricare è contenuta nel file XML. Ma chiarisci meglio questo punto.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    il preload che volevo fare è presto spiegato:
    leggo l'intestazione dell' xml o un altro xml in cui sono contenuti tutti gli url delle immagini che utilizzero' quindi che devo caricare , poi avevo letto tempo fa che si possono caricare con l'oggetto image di js le immagini in modo asincrono , sbaglio?
    quindi dato che ho degli xml di cui fare il parsing e altre operazioni da 10 mb mentre faccio il parsing le immagini si caricano.
    Ma purtroppo parlo senza conoscere a fondo js quindi chiedo se si puo' fare o se è una sciocchezza .

    poi ribadisco , mi interesserebbe molto un libro sulla oop in js.
    e magari un altro per partire (non proprio da 0).
    hai dei consigli?

    grazie.

  4. #4
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    No, mi spiace, non ho mai letto libri su javascript

    Puoi far partire il preload dopo il caricamento dell'xml, non puoi farlo mentre sta caricando il file (in realtà c'è un modo per conoscere il contenuto incompleto di un file ancora in caricamento, ma non puoi sapere quanto è che cosa è stato caricato, quindi diventa un terno a lotto). Ma se non è un singolo file xml a occupare 10 MB il problema non si pone: appena viene letto il file contenente l'informazione sulle immagini fai partire il preload asincrono (il caricamento delle immagini è sempre asincrono in javascript!!). Altrimenti l'unica cosa che ti resta da fare è spezzettarlo, in due file XML se riesci, altrimenti in due file di testo fregandotene dell'interruzione della sintassi XML: i due file verranno accorpati dopo via javascript e a quel punto partirà il parsing della stringa da 10 mb ottenuta :-) L'unico inconveniente con questa seconda via è che l'informazione sulle immagini di cui dovrai fare il preload la dovrai estrarre da un pezzetto di XML di cui non potrai fare il parsing, dovrai lavorare con le espressioni regolari insomma. Quindi il mio consiglio, se il file grosso è proprio il foglio XML, è di spezzettarlo in due file XML validi e indipendenti, se puoi. Il primo conterrà solo l'informazione sulle immagini da caricare, il secondo il resto. A quel punto diventa un gioco da ragazzi

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.