2012-08-13 12 views
27

Sto tentando di eliminare correttamente gli avvisi (avvisi) in DataTable. Il comportamento standard di DataTables è quello di lanciare un avviso javascript quando si verifica un errore; tuttavia, questo è attualmente inopportuno per me. Ho cercato di convertire l'avviso di un errore di javascript daEliminazione corretta degli avvisi nei DataTable?

$.fn.dataTableExt.sErrMode = 'throw'; 

che funziona correttamente, ma questo si ferma l'esecuzione di JavaScript in corso, che non è quello che voglio. Così, ho avvolto le operazioni DataTables (init e changes) in un try-catch senza gestione degli errori; tuttavia, ciò interrompe anche l'esecuzione di JavaScript. (Testato su Chrome e Firefox)

La mia domanda è: come faccio a eliminare questi errori/avvisi ai fini del debug? Sto cercando di eseguire il debug di altre parti del mio script, ma questi avvisi continuano a intromettersi.

+0

La soluzione migliore sarà sempre di convalidare le informazioni passate al DataTable in modo che non avrà alcun avvertimento per gettare ... – KRyan

+0

che l'estensione non ha fatto nulla per me ... hai mai trovare una risposta a questa domanda? –

+0

Qualche soluzione su questo? Sto affrontando lo stesso problema anche ... Grazie – Wangchao0721

risposta

14

NB: questa risposta si applica a dataTables 1.9.x!

Per $.fn.dataTableExt.sErrMode l'unico valore che ha importanza è "avviso". È "allerta" o qualsiasi altra cosa. sErrMode viene gestito dalla funzione dispatcher interno _fnLog, in v1.9.2 sulla linea 4575 in media/js/jquery.dataTables.js:

function _fnLog(oSettings, iLevel, sMesg) 
{ 
    var sAlert = (oSettings===null) ? 
     "DataTables warning: "+sMesg : 
     "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg; 

    if (iLevel === 0) 
    { 
     if (DataTable.ext.sErrMode == 'alert') 
     { 
      alert(sAlert); 
     } 
     else 
     { 
      throw new Error(sAlert); 
     } 
     return; 
    } 
    else if (window.console && console.log) 
    { 
     console.log(sAlert); 
    } 
} 

Unfortunelaty, non v'è alcun modo per ignorare DataTable funzioni interne, credetemi - ho provato, non è possibile con la prototipazione o qualsiasi altra cosa. Potete leggere l'autore Allan Jardines proprio commento a questo here:

Mi dispiace dire che a causa di come DataTable è costruito in questo momento , non è possibile eseguire l'override una funzione interna utilizzando Javascript al di fuori di Ambito DataTables. Questo è qualcosa che sarà risolto in ogni volta che vado in giro a fare la serie 2.x (che potrebbe essere un po 'fuori!) - ma al momento è necessario modificare il core.

Si potrebbe pensare che: Ehi, forse l'iLevel-bandiera può essere cambiato da qualche parte nelle impostazioni? Di nuovo, sfortunatamente no. iLevel è hardcoded in ogni chiamata interna a _fnLog.

È in qualche modo deludente che dobbiamo scegliere tra brutti avvisi e interruzione completa dell'esecuzione, perché viene generato un errore. Neanche una semplice sostituzione di window.onerror non funziona. La soluzione è quella di modificare _fnLog, semplicemente commentare la riga in cui viene generata l'errore personalizzato:

else 
{ 
    // throw new Error(sAlert); <-- comment this line 
} 

e l'esecuzione continua se si dispone di $.fn.dataTableExt.sErrMode = 'throw' (altro che "alert"), e se si verifica errori. Ancora meglio, si potrebbe avere bisogno di quegli errori gettati in altre situazioni, impostare un flag di fuori, come

window.isDebugging = true; 

e

else 
{ 
    if (!window.isDebugging) throw new Error(sAlert); 
} 

Questo non è un "hack", a mio parere, ma passare oltre di un generale comportamento non evitabile di jQuery dataTables che a volte non è soddisfacente.Come scrive lo stesso Allan Jardine nel link sopra riportato:

Perché non si può semplicemente modificare la sorgente? Questo è il punto centrale di aperta fonte :-)

+0

Grazie. C'era un suggerimento nel forum Datatable. https://datatables.net/forums/discussion/14680/warning-level-control-with-sugestestion È stato implementato?Sembrava più pulito e pronto all'uso. Spero che possa essere fatto altrimenti la tua soluzione funziona bene .. –

+0

Questo è diventato ** ufficiale ** ed è correttamente documentato qui: https://datatables.net/reference/event/error –

1

Permettetemi di aggiungere i miei 2 centesimi sopra davidkonrad di answer. Un modo per modificare _fnLog funzione senza cambiare il file è quello di ottenere riferimento a tale metodo dal esempio Api nelle impostazioni DataTables:

$.fn.dataTableSettings[0].oApi._fnLog = function(settings, level, msg, tn) { 
    // Modified version of _fnLog 
} 

speranza che questo sarà utile per qualcuno.

4

provare questo:

$.fn.DataTable.ext.oApi._fnLog = function (settings, level, msg, tn) { 
    msg = 'DataTables warning: ' + 
      (settings !== null ? 'table id=' + settings.sTableId + ' - ' : '') + msg; 

    if (tn) { 
     msg += '. For more information about this error, please see ' + 
       'http://datatables.net/tn/' + tn; 
    } 
    console.log(msg); 
}; 
+0

Non ha funzionato! – orad

18

ho modificato l'avviso nativa di utilizzare questa funzione di chiusura per reindirizzare DataTables avvisi alla console.

window.alert = (function() { 
    var nativeAlert = window.alert; 
    return function(message) { 
     window.alert = nativeAlert; 
     message.indexOf("DataTables warning") === 0 ? 
      console.warn(message) : 
      nativeAlert(message); 
    } 
})(); 

Si ripristina il window.alert alla sua funzione originaria al primo grilletto. Se non si desidera ripristinare l'avviso originale, è sufficiente commentare la riga window.alert = nativeAlert;.

+4

Questo ha funzionato per me, grazie –

+0

Questa soluzione funziona ma sembra funzionare solo una volta per caricamento della pagina. cioè più errori su quella stessa pagina non sono soppressi. –

+0

@ michael-smith si, questo è spiegato nel post. Devi commentare la riga 'window.alert = nativeAlert;'. – orad

12

Ecco una soluzione proposed here che è leggermente modificato e lavora a v1.10.2 senza dover modificare alcun file del fornitore:

$.fn.dataTableExt.sErrMode = "console"; 

$.fn.dataTableExt.oApi._fnLog = function (oSettings, iLevel, sMesg, tn) { 
    var sAlert = (oSettings === null) 
    ? "DataTables warning: "+sMesg 
    : "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg 
    ; 

    if (tn) { 
    sAlert += ". For more information about this error, please see "+ 
       "http://datatables.net/tn/"+tn 
    ; 
    } 

    if (iLevel === 0) { 
    if ($.fn.dataTableExt.sErrMode == "alert") { 
     alert(sAlert); 
    } else if ($.fn.dataTableExt.sErrMode == "thow") { 
     throw sAlert; 
    } else if ($.fn.dataTableExt.sErrMode == "console") { 
     console.log(sAlert); 
    } else if ($.fn.dataTableExt.sErrMode == "mute") {} 

    return; 
    } else if (console !== undefined && console.log) { 
    console.log(sAlert); 
    } 
} 
+3

questa è sicuramente la risposta. Il codice sembra essere incluso in tutte le versioni dopo la 1.10, quindi aggiungendo semplicemente '$ .fh.dataTableExt.sErrMode =" console "' prima di aggiungere una tabella dati risolverà il problema. – Cfreak

+0

Questo funziona per me .. –

+0

Grazie! Questo è semplicemente ciò di cui avevo bisogno. –

3

partire dalla versione DataTable 1.10.15, è possibile impostare $ .fn. dataTableExt.errMode a 'ignorare' e sarà silenziosamente ignorare i messaggi di errore:

$(document).ready(function() { 
     $.fn.dataTableExt.errMode = 'ignore'; 
    }); 

_fnLog funzione DataTable ha il seguente codice:

valore
 if (type == 'alert') { 
      alert(msg); 
     } 
     else if (type == 'throw') { 
      throw new Error(msg); 
     } 
     else if (typeof type == 'function') { 
      type(settings, tn, msg); 
     } 

Il valore predefinito è 'avviso' che è problematico.

È inoltre possibile impostare su 'throw'. Creerà l'errore javascript, ma non disturberà l'utente.

'ignora' o qualsiasi altro valore salterà semplicemente l'errore.

Problemi correlati