注意:这个答案适用于 dataTables 1.9.x!
$.fn.dataTableExt.sErrMode
唯一重要的是“警觉” 。它是“警报”或其他任何东西。sErrMode
由内部调度程序函数处理_fnLog
,在 v1.9.2 中关于第 4575 行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 );
}
}
不幸的是,没有办法覆盖 dataTables 的内部函数,相信我 - 我已经尝试过了,原型或其他任何东西都不可能。您可以在此处阅读作者 Allan Jardines 对此的评论:
很抱歉,由于目前 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 本人在上述链接中所写:
为什么不能只修改源?这就是开源的全部意义 :-)