Sencha ExtJS – ‘createContextualFragment’ non supportato in IE 9

 

sencha extjs
fonte: dal web

Con l’aggiornamento a Internet Explorer 9 (IE 9) non sarà possibile utilizzare le web application che abbiamo equipaggiato con ExtJs versione 3.*: IE9 infatti non supporta il metodo createContextualFragment generando errori che nella pratica non permettono la navigazione del sito. Il metodo javascript createContextualFragment è utile quando vogliamo creare un oggetto DocumentFragment con del contenuto iniziale: createContextualFragment era stato inizialmente pensato come alternativa all’ormai più diffuso e conosciuto metodo innerHTML.

Se per diversi motivi non possiamo aggiornare il framework Sencha ExtJs alla versione 4 (in cui la fix dovrebbe essere già impostata), possiamo utilizzare una piccola fix per risolvere il problema.

Il codice da utilizzare è il seguente:

[php]
if ((typeof Range !== "undefined") && !Range.prototype.createContextualFragment)
{
Range.prototype.createContextualFragment = function(html)
{
var frag = document.createDocumentFragment(),
div = document.createElement("div");
frag.appendChild(div);
div.outerHTML = html;
return frag;
};
}
[/php]

Dove inserire questo codice? Potete inserire questa fix lì dove richiamate il framework: se avete predisposto un file di configurazione per ExtJs allora quello è il punto ideale in cui inserire la fix, in questo modo siete sicuri di sistemare il problema per tutta la web application.

8 commenti su “Sencha ExtJS – ‘createContextualFragment’ non supportato in IE 9”

  1. ok allora, qui trovi un esempio su come gestire il click sui nodi del tree:

    http://www.marcolecce.com/blog/2011/01/19/extjs-gestione-di-un-albero-in-un-layout-complesso-con-php/

    Questo invece è un esempio di chiamata Ajax:

    Ext.Ajax.request({
    loadMask: true,
    url: 'www.tuodominio.com/service/',
    params : {

    param1 : value1

    },
    waitMsg:'Updating Data...',
    success: function(resp) {

    //gestione successo

    } else {

    // gestione failure
    }

    },

    failure: function(resp) {

    //gestione failure chiamata ajax

    }

    });

  2. Quella di usare una richesta ajax con extjs mi sembra ottima! mi faresti un esmpio di come “stamperesti” lo script dal php ?

    grazie di tutto!

  3. Spero di darti qualche aiuto anche se non conosco il resto del codice.

    Da quello che mi dici, la cosa migliore potrebbe essere utilizzare chiamate Ajax per ogni click sui nodi dell’albero: questa chiamata andrebbe ad aggiornare la parte di contenuto che ti interessa.

    Se non vuoi usare Ajax molto probabilamente a quel punto dovrai comunque ricaricare la pagina ad ogni click sui nodi: potresti allora passare nell’ URL assegnato al nodo un parametro che ad esempio corrisponde all’id del nodo, e in base al parametro imposti lo script da chiamare (a questo punto questa impostazione la farei lato server, stampando lo script che corrisponde all’id passato).

    PS. se stai usando ExtJs, è molto semplice fare questo lavoro utilizzando i listener sui nodi dell’albero, vedi:

    click : ( Node node, Ext.EventObject e )

  4. Quindi scusami, dovrei creare l’elemento script senza lanciare la funzione:

    var headID = document.getElementsByTagName(“head”)[0];
    var script = document.createElement(‘script’);
    script.type=’text/javascript’;
    script.src=”js/ordini/ImmOrd.js”;
    headID.appendChild(script);

    e poi nella view andare ad inserire:

    però considera che io nella parte js ho un menu ad albero dove per ogni click su un nodo vorrei carcare dinamicamente uno script differente, ma la view è sempre la stessa! dovrei dunque cambiare dinamicamente anche l’onload??

    com posso fare?

  5. Ok, mi sfugge una cosa però: perchè non utilizzi direttamente l’attributo onload del body? Una cosa del tipo:

    < body onload = "crtGridRicProd();" >

    eventualmente puoi lavorare sull’argomento dell’onload, impostandolo dinamicamente

  6. Grazie della risp, al momento sto lavorando solo nella nostra rete, cerco di darti qualche info in più:

    considera che credo il problema sia proprio alla base, ovvero quando tento di caricare dinamicamente lo script, questo perche:

    var headID = document.getElementsByTagName(“head”)[0];
    var script = document.createElement(‘script’);
    script.type=’text/javascript’;
    script.src=”js/ordini/ImmOrd.js”;
    script.setAttribute(“onload”, “crtGridRicProd();”);
    headID.appendChild(script);

    questo perche anche se inserisco nel file
    js/ordini/ImmOrd.js solamente la funzione:
    function crtGridRicProd(){
    alert (‘test’);
    }

    in internet explore non si apre la finestra mentre in firefox si.

  7. Ciao Marco,

    puoi postare un link ad una pagina in cui si vede il problema? Così vediamo di dare un’occhiata a tutti gli script! 😉

  8. Salve Marco,

    ho letto diversi tuoi post riguardo ad EXTJS.

    Vorrei gentilmente chiederti una cosa nel caso ti sia capitata..
    sto provando a caricare dinamicamente uno scritp in javascript ma il tutto non mi funziona in Internet Explorer (mentre in FireFox tutto va alla grande)

    var headID = document.getElementsByTagName(“head”)[0];
    var script = document.createElement(‘script’);
    script.type=’text/javascript’;
    script.src=”js/ordini/ImmOrd.js”;
    script.setAttribute(“onload”, “crtGridRicProd();”);
    headID.appendChild(script);

    vorrei che appena si apre la pagina venga lanciata la funzione crtGridProd, ma questo che in firefox funziona non mi gira su IE.
    Ho letto che bisognerebbe passare per la proprietà text del dom ma sinceramente non sono risucito!

    Grazie milee!

I commenti sono chiusi.