[英]What is the proper way to detect the presence of window.console?
我有這段代碼:
var has_logger = (window.console && window.console.log);
if (has_logger) {
window.console.log(data);
}
has_logger
,而不是一個布爾值,實際上初始化為一個函數對象( function log() { [native code] }
)
我的問題:
在現代瀏覽器中無需測試console.log,對嗎?
將has_logger
初始化為布爾值而不是函數對象的正確方法是什么?
如果未啟用Firebug,則如果不進行檢查,Firefox將拋出錯誤。
var has_logger = !!(window.console && window.console.log);
將始終是布爾值。
是的,這是一種非常好的測試方法,是的,你必須測試。 請注意,你的has_logger
變量實際上最終會引用該函數,所以你可以使用double-bang將它變成一個布爾值,正如Amadan所說。
但要注意IE9在console.log
周圍的奇怪行為 。
但是,如果您希望代碼在除瀏覽器之外的其他JavaScript環境中工作,則可以使用以下代碼:
has_logger = typeof console === "object" && console.log;
即使沒有定義,您也可以安全地測試免費引用的類型 。 這將適用於瀏覽器(您有window
)和其他環境(您沒有)。
通常,當其他瀏覽器中不存在console.log功能時,我仍然希望在某處輸出結果。 我每次想要寫入日志時都沒有if語句,而是創建了以下一些javascript,它將一個console.log方法添加到窗口對象(當它尚不存在時)。 這意味着在我的代碼中我想使用console.log,我可以這樣做而不用擔心它在其他瀏覽器中破壞。
(function () {
if (typeof window.console !== "object")
window.console = {
log: function (message) {
// Write the message somewhere in browsers that don't support console.log
}
};
} ());
由於我使用jQuery,我使用以下內容將每條消息寫入div。
$(function () {
(function () {
if (typeof window.console !== "object")
window.console = {
log: function (message) {
$('<div>' + message + '</div>').appendTo('#consoleArea');
}
};
} ());
});
Firefox 3.6及更早版本沒有window.console
。 我不知道你認為那是現代的。
對於第二個問題,JavaScript中的&&
運算符不返回布爾值; 它返回其左側表達式(如果它是假的)或其右側表達式(如果左側不是假的)。 如果你因某種原因確實想要一個布爾值,請使用!!(whatever-value)
。
所有人都會給你一個布爾:
var has_logger = (window.console && window.console.log) ? true : false;
var has_logger = new Boolean(window.console && window.console.log);
var has_logger = !!(window.console && window.console.log);
這是我最近提出的試圖完全防彈的內容......我希望如果我錯過了什么,大家會告訴我的。 除非log是一個函數,否則它似乎可以防止引用錯誤並且是錯誤的。 如果有人將一些其他函數附加到window.console.log,它會拋出一個錯誤,那么就沒有人能做到這一點。
var hasLog = !!("console" in window &&
window.console &&
"log" in window.console &&
window.console.log &&
typeof window.console.log == 'function')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.