2012-08-13 74 views
27

我想正確壓制DataTables中的警告(警報)。 DataTables的標準行爲是在發生錯誤時拋出javascript警報;然而,這對我來說目前不方便。我一直在試圖通過正確抑制DataTables中的警告?

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

哪個正確工程的警告轉換爲JavaScript錯誤,但這停止當前的JavaScript執行,這不是我想要的。所以,我將DataTables操作(init和更改)封裝在try-catch中,沒有錯誤處理;然而,這也停止了javascript的執行。 (在Chrome和Firefox上測試)

我的問題是如何去除掉這些錯誤/警報以進行調試?我正在嘗試調試腳本的其他部分,但這些警報一直在阻止。

+0

最好的解決方案將永遠是驗證傳遞給DataTables的信息,以便它不會有任何警告拋出... – KRyan 2012-08-13 20:36:15

+0

該擴展沒有爲我做任何事......你有沒有找到答案這個問題? – 2013-05-15 20:45:09

+0

這個任何解決方案?我也面臨同樣的問題...謝謝 – Wangchao0721 2013-06-18 12:06:34

回答

14

注意:此答案適用於dataTables 1.9.x!

對於$.fn.dataTableExt.sErrMode唯一值有任何重要性是「警覺」。這是「警覺」或其他任何事情。 sErrMode由內部調度功能_fnLogmedia/js/jquery.dataTables.js處理,在v1.9.2的約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); 
    } 
} 

Unfortunelaty,沒有辦法覆蓋數據表的內部功能,相信我 - 我都試過了,與原型不可能或其他任何東西。你可以閱讀到here作者艾倫·怡和自己的意見:由於數據表是如何在 時刻構建

我很抱歉地說,這不是可以覆蓋使用 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行爲有時並不令人滿意。正如Allan Jardine自己寫的上面的鏈接:

爲什麼你不能只修改源代碼?這是整點開放 源:-)

+0

謝謝。 Datatable論壇中有一個建議。 https://datatables.net/forums/discussion/14680/warning-level-control-with-suggestion實施了嗎?這看起來更乾淨,並且會開箱即用。希望它可以做別的你的解決方案效果很好.. – 2014-11-21 23:47:48

+0

這成爲**官方**,它在這裏正確記錄:https://datatables.net/reference/event/error – 2015-06-12 16:03:53

1

讓我我的2美分加入到上述davidkonrad的answer。修改_fnLog功能不改變文件的 一種方法是在數據表設置,以獲得參考從AP實例方法:

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

希望這將是一個人幫助。

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); 
}; 
+0

它沒有工作! – orad 2014-12-04 22:04:23

18

我用這個閉合功能重定向數據表警告控制檯修改了原生警惕。

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;行註釋掉。

+4

這對我工作,謝謝 – 2015-01-09 07:28:18

+0

此解決方案的工作原理,但似乎只有每頁加載一次。即在同一頁面上的多個錯誤不被抑制。 – 2016-02-23 00:21:40

+0

@ michael-smith是的,這是在帖子中解釋。你需要註釋掉'window.alert = nativeAlert;'行。 – orad 2016-02-23 19:33:14

12

這裏有一個解決方案proposed here多數民衆贊成稍微修改和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); 
    } 
} 
+3

這絕對是答案。該代碼似乎包含在1.10之後的所有版本中,因此在添加數據表之前添加'$ .fh.dataTableExt.sErrMode =「console」'可以解決問題。 – Cfreak 2015-02-12 18:11:57

+0

這對我有用.. – 2016-01-26 01:35:04

+0

謝謝!這只是我需要的。 – 2016-03-30 02:26:16

3

由於數據表版本15年1月10日,你可以設置$ .fn。 dataTableExt.errMode爲 '忽略',它會靜靜地忽略錯誤消息:

$(document).ready(function() { 
     $.fn.dataTableExt.errMode = 'ignore'; 
    }); 

_fnLog數據表功能具有下面的代碼:

 if (type == 'alert') { 
      alert(msg); 
     } 
     else if (type == 'throw') { 
      throw new Error(msg); 
     } 
     else if (typeof type == 'function') { 
      type(settings, tn, msg); 
     } 

的缺省值是「警報」,這是有問題的。

您也可以設置爲'throw'。它會創建JavaScript錯誤,但不會干擾用戶。

'忽略'或任何其他值只會輕微地跳過該錯誤。