Правильное подавление предупреждений в таблицах данных?
Я пытаюсь правильно подавить предупреждения (предупреждения) в DataTables. Стандартное поведение DataTables - это бросить предупреждение javascript при возникновении ошибки; однако для меня это сейчас неудобно. Я пытался преобразовать предупреждение в ошибку javascript с помощью
$.fn.dataTableExt.sErrMode = 'throw';
Что работает правильно, но это останавливает текущее выполнение javascript, чего я не хочу. Итак, я завернул операции DataTables (init и изменения) в try-catch без обработки ошибок; однако это также останавливает выполнение javascript. (Протестировано в Chrome и Firefox)
Мой вопрос в том, как я могу избавиться от этих ошибок/предупреждений для целей отладки? Я пытаюсь отлаживать другие части моего script, но эти предупреждения продолжают мешать.
Ответы
Ответ 1
Примечание: этот ответ применим к dataTables 1.9.x!
Для $.fn.dataTableExt.sErrMode
единственное значение имеет значение "alert". Это "предупреждение" или что-то еще. sErrMode
обрабатывается внутренней диспетчерской функцией _fnLog
, в версии 1.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 );
}
}
Unfortunelaty, нет возможности переопределить внутренние функции dataTables, поверьте мне - я пробовал, невозможно с прототипированием или чем-то еще. Вы можете прочитать автора Allan Jardines собственный комментарий к этому здесь:
Извините, что из-за того, как DataTables создается на момент невозможно переопределить внутреннюю функцию, используя Javascript вне области DataTables. Это то, что будет каждый раз, когда я обойдусь, выполняя серию 2.x(которая может быть в выключенном состоянии!) - но в настоящее время вам нужно будет изменить ядро.
Можно подумать, что: Эй, возможно, флаг iLevel можно изменить где-нибудь в настройках? Опять же, к сожалению нет. iLevel
жестко закодирован в каждом внутреннем вызове _fnLog
.
Как-то разочаровывает, мы должны выбирать между уродливыми предупреждениями и полностью прекратить выполнение, потому что возникает ошибка. Простое переопределение window.onerror
тоже не работает. Решение состоит в том, чтобы изменить _fnLog
, просто закомментировать строку, в которой создается пользовательская ошибка:
else
{
// throw new Error(sAlert); <-- comment this line
}
И выполнение продолжается, если у вас есть $.fn.dataTableExt.sErrMode = 'throw'
(ничего, кроме "alert" ) и если возникают ошибки. Еще лучше, если в других ситуациях могут потребоваться эти ошибки, установите флаг снаружи, например
window.isDebugging = true;
и
else
{
if (!window.isDebugging) throw new Error(sAlert);
}
Это, по-моему, не "взломать", а отбросить общее недопустимое поведение jQuery dataTables, которое иногда не удовлетворяет. Как пишет сам Аллан Жардин в приведенной выше ссылке:
Почему вы не можете просто изменить источник? То, что весь смысл источник: -)
Ответ 2
Я изменил собственное оповещение, используя эту функцию закрытия, чтобы перенаправить предупреждения 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;
.
Ответ 3
Здесь предлагаемое здесь решение которое слегка изменено и работает в 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);
}
}
Ответ 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 на игнорировать ", и он будет молча игнорировать сообщения об ошибках:
$(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, но не нарушит пользователя.
' игнорировать' или любые другие значения будут просто пропустить ошибку.
Ответ 6
Позвольте мне добавить мои 2 цента к davidkonrad answer выше.
Один из способов изменения функции _fnLog
без изменения файла - получить ссылку на этот метод из экземпляра Api в настройках datatables:
$.fn.dataTableSettings[0].oApi._fnLog = function(settings, level, msg, tn) {
// Modified version of _fnLog
}
Надеюсь, что это будет полезно для кого-то.