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)
从 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 ' 或任何其他值都会默默地跳过错误。
| 归档时间: |
|
| 查看次数: |
18145 次 |
| 最近记录: |