正确抑制数据表中的警告?
Posted
技术标签:
【中文标题】正确抑制数据表中的警告?【英文标题】:Correctly Suppressing Warnings in DataTables? 【发布时间】:2012-08-10 03:06:15 【问题描述】:我正在尝试正确抑制 DataTables 中的警告(警报)。 DataTables 的标准行为是在发生错误时抛出 javascript 警报;但是,这对我来说目前不方便。我一直在尝试通过
将警告转换为javascript错误$.fn.dataTableExt.sErrMode = 'throw';
哪个工作正常,但这会停止当前的 javascript 执行,这不是我想要的。因此,我将 DataTables 操作(初始化和更改)包装在一个没有错误处理的 try-catch 中;但是,这也会停止 javascript 的执行。 (在 Chrome 和 Firefox 上测试)
我的问题是如何摆脱这些错误/警报以进行调试?我正在尝试调试我的脚本的其他部分,但这些警报一直在妨碍我。
【问题讨论】:
最好的解决方案总是验证传递给 DataTables 的信息,这样它就不会抛出任何警告...... 那个扩展对我没有任何帮助......你有没有找到这个问题的答案? 需要更多信息才能提供帮助。尝试在 jsfiddle 中发布您的代码,以便我们更好地了解您报告的问题。 对此做出了迟到的回答,因为我自己一直在努力解决这个问题,并且由于最近的活动而看到了这个问题(一个答案似乎再次被删除)这不是“正确”的方式,因为有没有“正确”的方式,甚至没有隐藏在 dataTables 中的可能性。这只是解决问题的方法。 【参考方案1】:我使用这个闭包函数修改了本机警报,将 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;
行注释掉即可。
【讨论】:
此解决方案有效,但似乎每次页面加载仅有效一次。即不会抑制同一页面上的多个错误。 @michael-smith 是的,这在帖子中有解释。您需要注释掉window.alert = nativeAlert;
这一行。
你救了我一整天...谢谢【参考方案2】:
这是一个稍作修改的解决方案proposed here,可在 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);
【讨论】:
这绝对是答案。该代码似乎包含在 1.10 之后的所有版本中,因此只需在添加数据表之前添加$.fh.dataTableExt.sErrMode = "console"
即可解决此问题。
谢谢!这正是我所需要的。
我的代码在错误写入控制台后没有执行。【参考方案3】:
注意:此答案适用于 dataTables 1.9.x!
对于$.fn.dataTableExt.sErrMode
,唯一重要的值是“警报”。它是“警报”或其他任何东西。 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 的内部函数,相信我 - 我已经尝试过了,但无法使用原型设计或其他任何方法。您可以阅读作者 Allan Jardines 对 here 的评论:
很抱歉,由于 DataTables 在 时刻,不可能使用覆盖内部函数 DataTables 范围之外的 Javascript。这将是 每当我开始做 2.x 系列时(这可能 休息一会儿!) - 但目前你需要改变核心。
有人可能会认为:嘿,也许 iLevel-flag 可以在设置中的某处更改?同样,不幸的是没有。 iLevel
在对_fnLog
的每个内部调用中都是硬编码的。
令人失望的是,我们不得不在丑陋的警报和完全停止执行之间做出选择,因为抛出了一个错误。简单地覆盖window.onerror
也不起作用。解决方法是修改_fnLog
,简单注释掉抛出自定义错误的那一行:
else
// throw new Error(sAlert); <-- comment this line
如果您有$.fn.dataTableExt.sErrMode = 'throw'
(除“警报”之外的任何其他内容)并且发生错误,则继续执行。更好的是,在其他情况下可能需要那些抛出的错误,在外面设置一个标志,比如
window.isDebugging = true;
和
else
if (!window.isDebugging) throw new Error(sAlert);
在我看来,这不是一个“hack”,而是推翻了一般的、不可避免的 jQuery dataTables 行为,这种行为有时并不令人满意。正如 Allan Jardine 本人在上述链接中所写:
为什么不能只修改源?这就是开放的全部意义 来源:-)
【讨论】:
谢谢。数据表论坛中有一个建议。 datatables.net/forums/discussion/14680/… 实施了吗?这看起来更干净,并且开箱即用。希望它可以完成,否则您的解决方案效果很好.. 这已成为官方,并在此处正确记录:datatables.net/reference/event/error【参考方案4】:试试这个:
$.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 );
;
【讨论】:
【参考方案5】:从 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”,这是有问题的。
您也可以设置为“投掷”。它会产生 javascript 错误,但不会打扰用户。
'ignore' 或任何其他值只会悄悄地跳过错误。
【讨论】:
【参考方案6】:让我把我的 2 美分加到上面 davidkonrad 的answer 上。
在不更改文件的情况下修改_fnLog
函数的一种方法是从数据表设置中的 Api 实例中获取对该方法的引用:
$.fn.dataTableSettings[0].oApi._fnLog = function(settings, level, msg, tn)
// Modified version of _fnLog
希望这对某人有所帮助。
【讨论】:
以上是关于正确抑制数据表中的警告?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Scapy 生成数据包的 PDF 时如何抑制 PyX 警告消息?