正确抑制数据表中的警告?

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

希望这对某人有所帮助。

【讨论】:

以上是关于正确抑制数据表中的警告?的主要内容,如果未能解决你的问题,请参考以下文章

抑制但捕获 R 中的警告

抑制或避免警告 CA2214

在数据库项目中基于每个文件抑制 SQL 警告

使用 Scapy 生成数据包的 PDF 时如何抑制 PyX 警告消息?

抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起

Matlab:抑制uiputfile的警告对话框