30

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

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

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

私の質問は、デバッグの目的でこれらのエラー/アラートを取り除くにはどうすればよいですか? スクリプトの他の部分をデバッグしようとしていますが、これらのアラートが邪魔をし続けています。

4

6 に答える 6

20

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

于 2014-12-04T21:49:57.563 に答える
15

注意: この回答は 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 の内部関数をオーバーライドする方法はありません。著者のアラン・ジャーディンス自身のコメントをここで読むことができます:

申し訳ありませんが、現在の DataTables の構築方法により、DataTables のスコープ外で Javascript を使用して内部関数をオーバーライドすることはできません。これは、私が 2.x シリーズを実行するときにいつでも対処されるものです (しばらく時間がかかるかもしれません!) - しかし、現時点では、コアを変更する必要があります。

次のように考えることができます。繰り返しますが、残念ながらいいえ。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 の動作を覆すことです。アラン・ジャーディン自身が上記のリンクに書いているように:

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

于 2014-03-02T23:06:38.667 に答える
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 );
};
于 2014-09-13T05:01:31.600 に答える