2013-08-23 12 views
7

Possiedo una pagina MVC ASP.NET con Datable modificabile JQuery con 14 colonne. Ho un pulsante (Applica Nessuna ricerca) per fare calcoli lato client snd applicare per tutte le Righe in quella tabella.Come impedire "Interrompi l'esecuzione di questo script" nei browser?

Quando si fa clic su questo pulsante, dopo aver applicato i calcoli per ogni 4 righe, viene visualizzato questo messaggio "Interrompi script in esecuzione".

Ho verificato le impostazioni. In Opzioni Internet, scheda Avanzate, l'opzione "Disattiva debug di script (Internet Explorer)" è selezionata. E "Mostra una notifica sull'errore di script" è deselezionato.

Sto usando Internet Explorer 8. I Ora non succede su IE9. Ma essendo questo il server, non possiamo effettuare l'upgrade a IE9.

Ho fatto la ricerca e provato queste due opzioni e niente ha funzionato.

Esempio (1): http://www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-in-Browsers

Esempio (2): http://www.picnet.com.au/blogs/guido/post/2010/03/04/how-to-prevent-stop-running-this-script-message-in-browsers/

Chiunque ha avuto questo isse e suggerimenti sono molto apprezzati.

Si tratta di codice che sta gettando il Messaggio Script:

for(i < iTotalRecords;i++) 
     { 

      var row = oTableAuditLines.fnGetData(i); 
      oTableAuditLines.fnUpdate("NF",i,1); 
      UndoHCPCS(row,i); 
      UndoHCPCSModCodes(row,i); 
      UndoLineUnitCount(row,i); 
      oTableAuditLines.fnUpdate("", i, 6); //Reset Denial Reason Code 
      UndoNonCoveredCharges(row,i); 
      CalculateAmountPaidAtLine(row,i); 
      CalculateEstimatedRecoveryAmountAtLine(row,i); 
     } 
     UpdateSummaryLine(); 
     UpdateSummaryLineReasonCode(); 

Con riferimento codice di esempio in Esempio (2), ho cambiato il codice, come di seguito e sto ancora ricevendo il messaggio Script:

// Questa funzione è quella di evitare di script in esecuzione Messaggio

RepeatingOperation = function(op, yieldEveryIteration) 
    { 
    var count = 0; 
    var instance = this; 
    this.step = function(args) 
    {  
    if (++count >= yieldEveryIteration) 
    {  
    count = 0;  
    setTimeout(function() { op(args); }, 1, [])  
    return;  
    }  
    op(args); 
    }; 
    }; 

    function ApplyNoFindings() 
    { 

    var i = 0; 
    var ro = new RepeatingOperation(function() 
    { 

    var row = oTableAuditLines.fnGetData(i); 
      oTableAuditLines.fnUpdate("NF",i,1); 
      UndoHCPCS(row,i); 
      UndoHCPCSModCodes(row,i); 
      UndoLineUnitCount(row,i); 
      oTableAuditLines.fnUpdate("", i, 6); //Reset Denial Reason Code 
      UndoNonCoveredCharges(row,i); 
      CalculateAmountPaidAtLine(row,i); 
      CalculateEstimatedRecoveryAmountAtLine(row,i); 

    if (++i < iTotalRecords) 
    { 
     ro.step(); 
    } 
    else 
    { 
     UpdateSummaryLine(); 
     UpdateSummaryLineReasonCode(); 
    } 
    }, 100); 
    ro.step(); 

}

Cosa sto facendo di sbagliato qui?

+2

Non dovresti preoccuparti di non visualizzare il messaggio di avviso del codice lento, dovresti cercare di ottimizzare il codice. –

+1

'" Cosa sto facendo di sbagliato qui? "' ... Stai usando ASP.Net, duh !? No, ma sul serio, Rory ha ragione. Il codice della tabella dati sta già facendo molto. Uno dei principali poteri di ASP MVC è la possibilità di lasciare che il server, tramite C# o anche XAML, gestisca "calcoli" e scrivendo HTML per essere presentato nella vista. Hai mai fatto il walkthrough della radio? Ti dà una buona idea su come gestire più di questo lato server e non inviare nulla, ma direttamente HTML alla tua "tabella" creando così meno lato client di confusione e causando meno possibilità di errori sul lato client. – SpYk3HH

+0

Ho aggiunto il tag javascript e ho aggiornato il titolo per essere più pertinente. Spero tu stia bene con questo. –

risposta

11

Il problema è JavaScript è single-threaded, quindi se c'è una funzione che richiede troppo tempo per completare, questa funzione potrebbe causare l'interfaccia utente non risponde. Pertanto, il browser avviserà l'utente sullo script di lunga durata visualizzando il messaggio: "Interrompi l'esecuzione di questo script". Le soluzioni a questo problema sono:

  • Ottimizza il codice in modo che la funzione non impieghi molto tempo.
  • Utilizzare setTimeout per interrompere l'esecuzione della funzione in molti pezzi che sono abbastanza brevi.

Esempio codice modello:

var array = []; //assume that this is a very big array 
var divideInto = 4; 
var chunkSize = rowCount/divideInto; 
var iteration = 0; 

setTimeout(function doStuff(){ 
    var base = chunkSize * iteration; 
    var To = Math.min(base+chunkSize,array.length); 
    while (base < To){ 
     //process array[base] 
     base++; 
    } 
    iteration++; 
    if (iteration < divideInto) 
     setTimeout(doStuff,0); //schedule for next phase 
},0); 

La soluzione si prende nel tuo esempio (2) è corretto, ma c'è un problema nel codice. Questo è il setTimeout non viene eseguito.Provare a cambiare il vostro codice come questo:

RepeatingOperation = function(op, yieldEveryIteration) 
    { 
    var count = 0; 
    var instance = this; 
    this.step = function(args) 
    {  
     op(args); 
     if (++count <= yieldEveryIteration) 
     {   
     setTimeout(function() { instance.step(args); }, 1, [])   
     }  
    }; 
    }; 

Modifica la function ApplyNoFindings(), provate questo:

if (++i > iTotalRecords) 
{ 
    UpdateSummaryLine(); 
    UpdateSummaryLineReasonCode(); 
} 

invece di:

if (++i < iTotalRecords) 
    { 
     ro.step(); 
    } 
    else 
    { 
     UpdateSummaryLine(); 
     UpdateSummaryLineReasonCode(); 
    } 

Nota: non testato, solo dare un'idea di come si dovrebbe funzionare

+0

Proverò questo ... – Rita

+0

Ho provato questo e lavorando per me. :-) Grande! – Rita

0

Si può anche considerare lavoratori HTML 5

Un web worker è un JavaScript in esecuzione in background, senza influenzare le prestazioni della pagina. Quando si eseguono script in una pagina HTML, la pagina non risponde fino al termine dello script. Un web worker è un JavaScript che viene eseguito in background, indipendentemente da altri script, senza influenzare le prestazioni della pagina.

Creare un nuovo lavoratore è semplice. Tutto ciò che devi fare è chiamare il costruttore Worker(), specificando l'URI di uno script da eseguire nel thread worker, impostare la proprietà Worker.onmessage del worker su una funzione di gestore eventi appropriata.

var myWorker = new Worker("my_task.js"); 

myWorker.onmessage = function (oEvent) { 
    console.log("Called back by the worker!\n"); 
}; 

In alternativa, è possibile utilizzare addEventListener():

var myWorker = new Worker("my_task.js"); 

myWorker.addEventListener("message", function (oEvent) { 
    console.log("Called back by the worker!\n"); 
}, false); 

myWorker.postMessage(""); // start the worker. 

si possono vedere più dettagli su: https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

+3

I web worker sono degni di essere pubblicizzati - ma sfortunatamente, non saranno d'aiuto con questo avvertimento particolare che si verifica principalmente in IE8 come in questa domanda: IE8 non supporta i web worker. – user568458

4

Nonostante un'altra risposta già accettato voglio mettere qui le informazioni generali per gli sviluppatori chi avrà questo problema nella funzionalità:

Da questo link è possibile trovare informazioni su come risolvere questo f rom lato utente http://support.microsoft.com/kb/175500 - l'utente può aggiungere una chiave di registro.

Inoltre vi si possono trovare informazioni su quando questo messaggio "Running slow":

Per impostazione predefinita, la chiave non esiste. Se la chiave non è stata aggiunta, il limite di soglia predefinito per la finestra di dialogo di timeout è 5.000.000 di dichiarazioni per Internet Explorer 4 e versioni successive.

Come si vede la lentezza misurata in istruzioni javascript, non nel tempo.

+1

Vedere anche la risposta più alta a [Disabilitare il messaggio script di esecuzione prolungata in Internet Explorer] (http://stackoverflow.com/a/4460329/568458) che ha un metodo di esempio elegante per evitare di far scattare l'opzione "5.000.000 di istruzioni" . – user568458

Problemi correlati