Правильное подавление предупреждений в таблицах данных?

Я пытаюсь правильно подавить предупреждения (оповещения) в DataTables. Стандартное поведение DataTables заключается в выдаче предупреждения javascript при возникновении ошибки; однако в настоящее время это неудобно для меня. Я пытался преобразовать предупреждение в ошибку javascript с помощью

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

Что работает правильно, но это останавливает текущее выполнение javascript, чего я не хочу. Итак, я обернул операции DataTables (инициализация и изменения) в try-catch без обработки ошибок; однако это также останавливает выполнение javascript. (Проверено на Chrome и Firefox)

Мой вопрос: как мне избавиться от этих ошибок/предупреждений в целях отладки? Я пытаюсь отладить другие части моего скрипта, но эти предупреждения продолжают мешать.


person jab    schedule 13.08.2012    source источник
comment
Лучшим решением всегда будет проверка информации, переданной в DataTables, чтобы не было никаких предупреждений о выдаче...   -  person KRyan    schedule 14.08.2012
comment
это расширение ничего мне не дало... вы когда-нибудь находили ответ на этот вопрос?   -  person Eric H.    schedule 16.05.2013
comment
Нужно больше информации, чтобы иметь возможность предложить помощь. Попробуйте опубликовать свой код в jsfiddle, чтобы мы могли лучше понять проблему, о которой вы сообщаете.   -  person Bob Tate    schedule 09.12.2013
comment
Дал поздний ответ на этот вопрос, потому что я сам боролся с этой проблемой и увидел вопрос из-за недавней активности (ответ, по-видимому, снова удален). Это неправильный путь, поскольку нет правильного пути или даже возможности, скрытой в таблицы данных. Это просто способ обойти проблему.   -  person davidkonrad    schedule 03.03.2014


Ответы (6)


Примечание: этот ответ относится к 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
comment
Спасибо. На форуме Datatable было предложение. datatables.net/forums/discussion/14680/ Это было реализовано? Это оказалось чище и будет из коробки. надеюсь, что это можно сделать, иначе ваше решение работает хорошо. - person satya on rails; 22.11.2014
comment
Это стало официальным и надлежащим образом задокументировано здесь: datatables.net/reference/event. /ошибка - person J. Bruni; 12.06.2015

Я изменил собственное оповещение, используя эту функцию закрытия, чтобы перенаправить предупреждения 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;.

person orad    schedule 04.12.2014
comment
Это решение работает, но, похоже, работает только один раз при загрузке страницы. т. е. множественные ошибки на одной и той же странице не подавляются. - person Michael Smith; 23.02.2016
comment
@michael-smith да, это объясняется в посте. Вам нужно закомментировать строку window.alert = nativeAlert;. - person orad; 23.02.2016
comment
Вы спасли мой день... Спасибо - person Null Pointer; 03.04.2018

Вот решение, предложенное здесь, которое немного изменено и работает в версии 1.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);
  }
}
person Taylor    schedule 17.01.2015
comment
это определенно ответ. Похоже, что этот код включен во все версии после 1.10, поэтому простое добавление $.fh.dataTableExt.sErrMode = "console" перед добавлением таблицы данных решит проблему. - person Cfreak; 12.02.2015
comment
Спасибо! Это просто то, что мне было нужно. - person Jeff Puckett; 30.03.2016
comment
Мой код не выполняется ПОСЛЕ ошибки, записанной в консоль. - person Jalle; 05.10.2017

попробуй это:

$.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 );
};
person Felipe Elias Balarin    schedule 13.09.2014

Начиная с версии 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», что вызывает проблемы.

Вы также можете установить значение «throw». Это создаст ошибку javascript, но не будет беспокоить пользователя.

'ignore' или любые другие значения просто незаметно пропустят ошибку.

person Recev Yildiz    schedule 05.05.2017

Позвольте мне добавить свои 2 цента к ответу Дэвида Конрада выше. Один из способов изменить функцию _fnLog без изменения файла — получить ссылку на этот метод из экземпляра API в настройках datatables:

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

Надеюсь, что это будет полезно для кого-то.

person Azat    schedule 04.08.2014