2012-08-13 71 views
27

我想正确压制DataTables中的警告(警报)。 DataTables的标准行为是在发生错误时抛出javascript警报;然而,这对我来说目前不方便。我一直在试图通过正确抑制DataTables中的警告?

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

哪个正确工程的警告转换为JavaScript错误,但这停止当前的JavaScript执行,这不是我想要的。所以,我将DataTables操作(init和更改)封装在try-catch中,没有错误处理;然而,这也停止了javascript的执行。 (在Chrome和Firefox上测试)

我的问题是如何去除掉这些错误/警报以进行调试?我正在尝试调试脚本的其他部分,但这些警报一直在阻止。

+0

最好的解决方案将永远是验证传递给DataTables的信息,以便它不会有任何警告抛出... – KRyan 2012-08-13 20:36:15

+0

该扩展没有为我做任何事......你有没有找到答案这个问题? – 2013-05-15 20:45:09

+0

这个任何解决方案?我也面临同样的问题...谢谢 – Wangchao0721 2013-06-18 12:06:34

回答

14

注意:此答案适用于dataTables 1.9.x!

对于$.fn.dataTableExt.sErrMode唯一值有任何重要性是“警觉”。这是“警觉”或其他任何事情。 sErrMode由内部调度功能_fnLogmedia/js/jquery.dataTables.js处理,在v1.9.2的约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); 
    } 
} 

Unfortunelaty,没有办法覆盖数据表的内部功能,相信我 - 我都试过了,与原型不可能或其他任何东西。你可以阅读到here作者艾伦·怡和自己的意见:由于数据表是如何在 时刻构建

我很抱歉地说,这不是可以覆盖使用 Javascript之外,内部功能数据表范围。当我开始执行2.x系列(可能 暂时关闭!)时,这将会是 ,但是目前您需要更改内核。

有人可能会认为:嘿,也许是的ilevel标志可以在某处设置改变?再次,不幸的是没有。 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); 
} 

这不是一个“黑客”在我看来,不过一般的推翻不可避免的jQuery dataTables行为有时并不令人满意。正如Allan Jardine自己写的上面的链接:

为什么你不能只修改源代码?这是整点开放 源:-)

+0

谢谢。 Datatable论坛中有一个建议。 https://datatables.net/forums/discussion/14680/warning-level-control-with-suggestion实施了吗?这看起来更干净,并且会开箱即用。希望它可以做别的你的解决方案效果很好.. – 2014-11-21 23:47:48

+0

这成为**官方**,它在这里正确记录:https://datatables.net/reference/event/error – 2015-06-12 16:03:53

1

让我我的2美分加入到上述davidkonrad的answer。修改_fnLog功能不改变文件的 一种方法是在数据表设置,以获得参考从AP实例方法:

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

希望这将是一个人帮助。

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); 
}; 
+0

它没有工作! – orad 2014-12-04 22:04:23

18

我用这个闭合功能重定向数据表警告控制台修改了原生警惕。

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;行注释掉。

+4

这对我工作,谢谢 – 2015-01-09 07:28:18

+0

此解决方案的工作原理,但似乎只有每页加载一次。即在同一页面上的多个错误不被抑制。 – 2016-02-23 00:21:40

+0

@ michael-smith是的,这是在帖子中解释。你需要注释掉'window.alert = nativeAlert;'行。 – orad 2016-02-23 19:33:14

12

这里有一个解决方案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); 
    } 
} 
+3

这绝对是答案。该代码似乎包含在1.10之后的所有版本中,因此在添加数据表之前添加'$ .fh.dataTableExt.sErrMode =“console”'可以解决问题。 – Cfreak 2015-02-12 18:11:57

+0

这对我有用.. – 2016-01-26 01:35:04

+0

谢谢!这只是我需要的。 – 2016-03-30 02:26:16

3

由于数据表版本15年1月10日,你可以设置$ .fn。 dataTableExt.errMode为 '忽略',它会静静地忽略错误消息:

$(document).ready(function() { 
     $.fn.dataTableExt.errMode = 'ignore'; 
    }); 

_fnLog数据表功能具有下面的代码:

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

的缺省值是“警报”,这是有问题的。

您也可以设置为'throw'。它会创建JavaScript错误,但不会干扰用户。

'忽略'或任何其他值只会轻微地跳过该错误。