Примечание: этот ответ относится к 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 устроены на данный момент, невозможно переопределить внутреннюю функцию с помощью Javascript за пределами области DataTables. Это то, что будет рассмотрено всякий раз, когда я приступлю к работе над серией 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, которого нельзя избежать, которое иногда не удовлетворяет. Как пишет сам Аллан Джардин в приведенной выше ссылке:
Почему нельзя просто изменить исходник? В этом весь смысл открытого исходного кода :-)
person
davidkonrad
schedule
02.03.2014