正确地抑制DataTables中的警告?

我正在尝试正确地抑制DataTables中的警告(警报)。 DataTables的标准行为是在发生错误时抛出javascript警报; 但是,这对我来说当前不方便。 我一直在尝试将警告转换为javascript错误

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

哪个工作正常,但这会停止当前的javascript执行,这不是我想要的。 因此,我将DataTables操作(init和更改)包装在try-catch中,没有error handling; 但是,这也会停止javascript执行。 (在Chrome和Firefox上测试过)

我的问题是如何为了调试而去除这些错误/警报? 我正在尝试调试脚本的其他部分,但这些警报会继续阻碍。

注意:这个答案适用于dataTables 1.9.x!

对于$.fn.dataTableExt.sErrMode ,唯一具有任何重要性的值是“alert”。 这是“警惕”或其他任何事情。 sErrMode由内部调度程序函数_fnLog在v1.9.2中处理media/js/jquery.dataTables.js第4575行:

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

不幸的是,没有办法覆盖dataTables的内部function,相信我 – 我已经尝试过,不可能用原型设计或其他任何东西。 你可以在这里阅读作者Allan Jardines对此的评论:

我很遗憾地说,由于DataTables目前是如何构建的,因此无法使用DataTables范围之外的Javascript覆盖内部函数。 每当我开始执行2.x系列时(这可能会暂时关闭!),这将会得到解决 – 但是目前你需要改变核心。

有人可能会这么想: 嘿,也许iLevel-flag可以在设置的某个地方改变 ? 再一次,遗憾的是没有。 iLevel在每次内部调用iLevel都是硬编码的。

令人失望的是,我们必须在丑陋的警报和完全停止执行之间做出选择,因为会抛出错误。 简单地覆盖window.onerror也不起作用。 解决方案是修改_fnLog ,只需注释掉引发自定义错误的行:

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

如果您有$.fn.dataTableExt.sErrMode = 'throw' (除了“alert”之外的任何其他内容)并且发生错误,则继续执行。 更好的是,人们可能需要在其他情况下抛出错误,在外面设置一个标志,比如

 window.isDebugging = true; 

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

在我看来,这不是一个“黑客”,而是对一般不可避免的jQuery dataTables行为的推翻有时候并不令人满意。 正如Allan Jardine自己在上面的链接中写道:

为什么你不能只修改源代码? 这是开源的全部内容:-)

我使用此闭包function修改了本机警报,以将DataTables警告重定向到控制台。

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

它在第一次触发时将window.alert恢复为其本机函数。 如果您不希望它恢复到原始警报,只需注释掉window.alert = nativeAlert; 线。

这里提出的解决方案略有修改,适用于v1.10.2,无需更改任何供应商文件:

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

试试这个:

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

从DataTables版本1.10.15开始 ,您可以将$ .fn.dataTableExt.errMode设置ignore ‘,它将默默忽略错误消息:

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

_fnLog DataTables函数具有以下代码:

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

默认值为’ alert ‘,这是有问题的。

你也可以设置为’ throw ‘。 它会创建javascript错误,但不会打扰用户。

忽略 ‘或任何其他值只会轻易跳过错误。

让我加上我的2美分给davidkonrad上面的回答 。 在不更改文件的情况下修改_fnLog函数的一种方法是从数据表设置中的Api实例引用该方法:

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

希望这对某人有所帮助。