正确地抑制DataTables中的警告?

jab*_*jab 30 javascript jquery jquery-datatables

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

$.fn.dataTableExt.sErrMode = 'throw';
Run Code Online (Sandbox Code Playgroud)

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

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

ora*_*rad 19

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

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

window.alert在第一次触发时恢复其原生功能.如果您不希望它恢复到原始警报,只需注释掉该window.alert = nativeAlert;行.


dav*_*rad 15

注意:这个答案适用于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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

else
{
  // throw new Error(sAlert); <-- comment this line
}
Run Code Online (Sandbox Code Playgroud)

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

window.isDebugging = true;
Run Code Online (Sandbox Code Playgroud)

else
{
  if (!window.isDebugging) throw new Error(sAlert); 
}
Run Code Online (Sandbox Code Playgroud)

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

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


Tay*_*lor 14

这里提出的解决方案略有修改,适用于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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是答案.代码似乎包含在1.10之后的所有版本中,因此在添加数据表之前添加`$ .fh.dataTableExt.sErrMode ="console"将解决问题. (4认同)

Rec*_*diz 5

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

    $(document).ready(function () {
        $.fn.dataTableExt.errMode = 'ignore';
    });
Run Code Online (Sandbox Code Playgroud)

_fnLog DataTables函数有以下代码:

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

默认值是“ alert ”,这是有问题的。

您还可以设置为“投掷”。它会产生 javascript 错误,但不会打扰用户。

' ignore ' 或任何其他值都会默默地跳过错误。