Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Comportamento strano - direzione codice

    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
    codice:
    $('#cover').show();
    createprocessbar('')
    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.
    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
    codice:
    $('#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()        
        
        })
    e qui sotto il vero codice (molto semplificato, in realtà le opzioni di output sono molteplici, ma giusto per intenderci
    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");
    Come scrivevo, con excel piccoli, tutto procede bene, appena le righe si fanno molte, il comportamento è tutto differente e non funziona.
    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.

  2. #2
    Ciao di nuovo,

    non volevo che qualcuno mi ri-scrivesse il codice (anche percé con poche righe funziona), volevo solo capire come combinare una callback aspettando che la funzione precedente finisca.
    Grazie

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,674
    Ciao e benvenuto.
    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?
    Così a naso ti direi di no, ma dovrei vedere la pagina in azione per capire meglio cosa avviene. Potrei pensare a delle funzioni che vengono eseguite in modo asincrono e quindi non si ha certezza nell'ordine in cui queste vengono eseguite, ma non mi sembra questo il problema.

    Sono più propenso a credere che avvenga qualche errore che blocca lo script.
    Se già non lo hai fatto, prova prima di tutto a verificare sulla console web del tuo browser (F12 per aprirla) se salta fuori qualche errore durante l'esecuzione dello script.

    Vedo poi che dentro la funzione proceed() vai a fare un append della textarea #MOMF. Presumo che quella funzione possa essere richiamata più volte, giusto? In tal caso quella textarea dovrebbe essere distrutta prima che venga "appesa" di nuovo al body, altrimenti avresti più duplicati dello stesso elemento con uno stesso id (#MOMF), questo ovviamente non va bene perché gli id devono necessariamente essere univoci.

    Verifica queste cose e fai sapere.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,505
    Quote Originariamente inviata da Cosmos79 Visualizza il messaggio
    Ciao di nuovo,

    non volevo che qualcuno mi ri-scrivesse il codice (anche percé con poche righe funziona), volevo solo capire come combinare una callback aspettando che la funzione precedente finisca.
    Grazie

    Ciao,
    benvenuto sul forum. Ti invito a rileggere il regolamento. Per adesso chiudo un occhio sul titolo poco significativo che comporterebbe la chiusura della discussione.

    Sei nuovo
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


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 © 2024 vBulletin Solutions, Inc. All rights reserved.