web-dev-qa-db-ja.com

DataTablesの警告を正しく抑制しますか?

DataTablesの警告(アラート)を正しく抑制しようとしています。 DataTablesの標準的な動作は、エラーが発生したときにJavaScriptアラートをスローすることです。しかし、これは現在私には不便です。私は警告をJavaScriptエラーに変換しようとしています

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

これは正しく機能しますが、これにより現在のJavaScriptの実行が停止します。そのため、DataTablesの操作(初期化と変更)をエラー処理なしのtry-catchでラップしました。ただし、これによりJavaScriptの実行も停止します。 (ChromeおよびFirefoxでテスト済み)

私の質問は、デバッグの目的でこれらのエラー/アラートを取り除く方法を教えてください。スクリプトの他の部分をデバッグしようとしていますが、これらのアラートは引き続き邪魔になります。

30
jab

NB:この回答はdataTables 1.9.xに適用されます!

$.fn.dataTableExt.sErrModeの場合、重要なのは「アラート」だけです。 「アラート」などです。 sErrModeは内部ディスパッチャー関数_fnLogによって処理されます。v1.9.2では、media/js/jquery.dataTables.jsの4575行目についてです。

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自身のコメントを読むことができます here

申し訳ありませんが、現時点ではDataTablesがどのように構築されているかにより、DataTablesスコープ外でJavaScriptを使用して内部関数をオーバーライドすることはできません。これは、私が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の動作を覆します。アラン・ジャーディン自身が上のリンクに書いているように:

なぜソースを変更できないのですか?それがオープンソースの要点です:-)

15
davidkonrad

このクロージャー関数を使用してネイティブアラートを変更し、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;行をコメント化してください。

19
orad

これがソリューションです ここで提案 わずかに変更され、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);
  }
}
14
Taylor

これを試して:

$.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 );
};

DataTablesバージョン1.10.15以降、$。fn.dataTableExt.errModeを 'ignore'に設定すると、エラーが表示されずに無視されますメッセージ:

    $(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'またはその他の値は、エラーをスキップします。

4
Recev Yildiz

上記のdavidkonradの answer に2セント追加します。ファイルを変更せずに_fnLog関数を変更する1つの方法は、データテーブル設定のApiインスタンスからそのメソッドへの参照を取得することです。

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

これが誰かのために役立つことを願っています。

1
Azat