Ciao a tutti,
sono nuovo sul forum. Ho un problema che mi assilla da giorni e che non riesco a venirne a capo in nessun modo.
Ho uno script dove carico un file excel e me lo apre tranquillamente. Tutto questo avviene lato client ovviamente. L'excel viene letto e messo in una tabella html con tutte le sue belle colonnine.
Fino a qui tutto bene, tutto funziona.
L'azione successiva, è quella di esportare i dati dalla tabella con diverse opzioni di scelta, dal prelevare la singola colonna, oppure di omettere delle colonne, fino all'opzione di concatenare i valori di più colonne in una stringa unica. Oltre al fatto di esportare il contenuto in base ad uno o più valori di una colonna, come se fosse un filtro applicato ad una colonna in excel.
Tutto questo output di scelta lo voglio memorizzare nella clipboard di sistema.
Con un excel di circa 200 righe non risulta mai esserci problemi. Il contenuto viene memorizzato nella clipboard e io riesco tranquillamente a incollare il contenuto altrove.
Il problema nasce quando le righe sono molte di più.
Il comportamento dello script cambia fin da subito. Ad esempio, quando lancio l'azione, ho queste due linee
che sono due semplici comandi, uno che riabilita la visibilità di un div a tutto schermo semi-invisibile e l'altro che crea al centro dello schermo uno spinner.codice:$('#cover').show(); createprocessbar('')
Quando ho pochi dati, queste azioni partono immediatamente alla pressione del pulsante di avvio, mentre quando sono molti, questi due processi non vengono eseguiti subito ma molto dopo. E con il risultato che la clipboard non viene memorizzata ma mantiene il contenuto precedente.
Qui uno spaccato del codice
e qui sotto il vero codice (molto semplificato, in realtà le opzioni di output sono molteplici, ma giusto per intendercicodice:$('#CheckIntegrity').find('button').off('click').on('click',function(){ $('#cover').show(); createprocessbar('') //qui ho delle iterazioni che controllano se alcune checkbox sono spuntate // se l'integrità delle scelte va bene, allora continua con la funzione sotto proceed() })
Come scrivevo, con excel piccoli, tutto procede bene, appena le righe si fanno molte, il comportamento è tutto differente e non funziona.codice:function proceed(){ $('body').append('<textarea style="position:absolute;top:200px;left:600;z-index:2000" id="MOMF"></textarea>'); var field = $('#MOMF') var objtable = $('#exceltable'); var rows = $('table tr').length; for(sendto=0;sendto<rows;sendto++){ colonna1 = colonna2 = colonna3 = "" var actualrow = objtable.find('tr.addtocreate').eq(sendto) if(excol1 == 1){ colonna1 = actualrow.children().eq(KvarExcel.col1).text() if(colonna1 == ""){//se vuota colonna1 = "[NO VALUE]" }} if(excol2 == 1){ colonna2 = actualrow.children().eq(KvarExcel.col2).text() if(colonna2 == ""){//se vuota colonna2 = "[NO VALUE]" }} if(excol3 == 1){ colonna3 = actualrow.children().eq(KvarExcel.filename).text() if(colonna3 == ""){//se vuota colonna3 = "[NO VALUE]" }} //qui lo inserisce nella text area field.append(colonna1 + "_" + colonna2+ "|!|" + colonna3+ "\n"); } //a questo punto, copio la clipboard field.select() document.execCommand("Copy");
Da quanto mi sembra di capire, Javascript non aspetta di finire la prima azione (quella della creazione dello spinner), ma continua immediatamente chiamando l'altra azione, la interagisce tutta e poi sembra (quasi) tornare indietro nelle operazioni che ha saltato. Come a dire che Javascript interessi prima farsi tutto il calcolo e poi procede con le altre azioni.
Con il risultato che la textarea non è ancora stata processato e il "copia" avviene sul nulla.
Possibile?
C'è un qualche modo di dire a Javascript "Ehi, aspetta, finisci prima questo e poi procedi"?
Scusate lo spiegone, spero di essere stato chiaro.![]()

Rispondi quotando

