Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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
}

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