30

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

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

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

我的问题是如何摆脱这些错误/警报以进行调试?我正在尝试调试我的脚本的其他部分,但这些警报一直在妨碍我。

4

6 回答 6

20

我使用此闭包函数修改了本机警报,以将 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;行。

于 2014-12-04T21:49:57.563 回答
16

这是此处提出的解决方案,该解决方案稍作修改,可在 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);
  }
}
于 2015-01-17T05:53:55.173 回答
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 );
    }
}

不幸的是,没有办法覆盖 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 本人在上述链接中所写:

为什么不能只修改源?这就是开源的全部意义 :-)

于 2014-03-02T23:06:38.667 回答
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 );
};
于 2014-09-13T05:01:31.600 回答
4

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

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

您也可以设置为“抛出”。它会产生 javascript 错误,但不会打扰用户。

' ignore ' 或任何其他值只会悄悄地跳过错误。

于 2017-05-05T11:36:41.477 回答
1

让我将我的 2 美分加到上面大卫康拉德的答案中。在不更改文件的情况下修改_fnLog函数的一种方法是从数据表设置中的 Api 实例获取对该方法的引用:

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

希望这对某人有所帮助。

于 2014-08-04T08:33:35.487 回答