Suppression correcte des avertissements dans DataTables?

J'essaie de supprimer correctement les avertissements (alertes) dans DataTables. Le comportement standard de DataTables consiste à jeter une alerte javascript lorsqu'une erreur se produit; Cependant, ce n'est pas gênant pour moi. J'ai essayé de convertir l'avertissement en une erreur javascript

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

Ce qui fonctionne correctement, mais cela empêche l'exécution javascript actuelle, ce qui n'est pas ce que je veux. Donc, j'ai enveloppé les opérations DataTables (init and changes) dans un try-catch sans traitement d'erreur; Cependant, cela arrête également l'exécution javascript. (Testé sur Chrome et Firefox)

Ma question est de savoir comment puis-je me débarrasser de ces erreurs / alertes aux fins de débogage? J'essaie de déboguer d'autres parties de mon script, mais ces alertes continuent à gêner.

NB: Cette réponse s'applique à dataTables 1.9.x!

Pour $.fn.dataTableExt.sErrMode la seule valeur qui a une importance est "alerte". Il est "alerte" ou autre chose. sErrMode est géré par la fonction de répartiteur interne _fnLog , dans v1.9.2 sur la ligne 4575 dans 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 ); } } 

Malheureusement, il n'y a aucun moyen de remplacer les fonctions internes de DataTables, croyez-moi, j'ai essayé, pas possible avec le prototypage ou autre chose. Vous pouvez lire le commentaire de l'auteur Allan Jardines à ce sujet ici :

Je suis désolé de dire qu'en raison de la façon dont DataTables est construit pour le moment, il n'est pas possible de remplacer une fonction interne à l'aide de Javascript en dehors de la portée de DataTables. C'est quelque chose qui sera abordé chaque fois que je me débrouillerais pour faire la série 2.x (ce qui pourrait être un temps hors tension!) – mais à l'heure actuelle, vous devriez modifier le noyau.

On pourrait penser que: Hé, peut-être que le drapeau iLevel peut être changé quelque part dans les paramètres ? Encore une fois, malheureusement non. iLevel est codé en dur dans chaque appel interne à _fnLog .

Il est en quelque sorte décevant de choisir entre des alertes fausses et l'arrêt total de l'exécution, car une erreur est lancée. Un simple remplacement de window.onerror ne fonctionne pas non plus. La solution consiste à modifier _fnLog , simplement commenter la ligne où l'erreur personnalisée est lancée:

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

Et l'exécution continue si vous avez $.fn.dataTableExt.sErrMode = 'throw' (autre chose que "alert") et si des erreurs se produisent. Encore mieux, on pourrait avoir besoin de ces erreurs jetées dans d'autres situations, mettre un drapeau à l'extérieur, comme

 window.isDebugging = true; 

et

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

Ce n'est pas un «piratage» à mon avis, mais la suppression d'un comportement de comportement de données jQuery général non évitable qui n'est parfois pas satisfaisant. Comme Allan Jardine lui-même écrit sur le lien ci-dessus:

Pourquoi ne peux-tu simplement modifier la source? C'est tout le point de l'open source 🙂

J'ai modifié l'alerte native à l'aide de cette fonction de fermeture pour rediriger les avertissements DataTables sur la console.

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

Il restaure la window.alert sa fonction native au premier déclencheur. Si vous ne voulez pas qu'il restaure l'alerte d'origine, il suffit de commenter la window.alert = nativeAlert; ligne.

Voici une solution proposée ici qui est légèrement modifiée et fonctionne dans v1.10.2 sans devoir modifier les fichiers fournisseurs:

 $.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); } } 

essaye ça:

 $.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 ); }; 

Permettez-moi d'ajouter mes 2 cents à la réponse de davidkonrad ci-dessus. Une façon de modifier la fonction _fnLog sans modifier le fichier est de faire référence à cette méthode à partir de l'instance Api dans les paramètres de données:

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

J'espère que cela sera utile pour quelqu'un.

À partir de DataTables version 1.10.15 , vous pouvez définir $ .fn.dataTableExt.errMode pour ' ignorer ' et il ignorera silencieusement les messages d'erreur:

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

La fonction _fnLog DataTables possède le code suivant:

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

La valeur par défaut est « Alerte » qui est problématique.

Vous pouvez également définir " lancer ". Il créera une erreur javascript, mais ne dérangera pas l'utilisateur.

« Ignorer » ou toute autre valeur ne sautera que l'erreur.