Chrome和Firefox中的Javascript中報告了隱藏的“腳本錯誤”


Answers

對於那些未來會陷入這個問題的更新:broofa是正確的答案,沒有解決方法。

顯然,其他人偶然發現了這個限制,並且一些請求修復的錯誤是針對Firefox提出的: 錯誤69301和WebKit: 錯誤70574

好消息是,隨著Firefox 13的發布,Firefox已經解決了該錯誤。這就是您使用它的方式:

<script src="http://somremotesite.example/script.js" crossorigin>

crossorigin相當於crossorigin=anonymous並告訴瀏覽器不發送憑證的情況下執行CORS腳本獲取

您必須確保腳本使用匹配請求域的Access-Control-Allow-Origin HTTP標頭值發送,例如,

Access-Control-Allow-Origin: http://myhomesite.example
Access-Control-Allow-Origin: *

否則瀏覽器將取消加載腳本

對於Apache:

Header set Access-Control-Allow-Origin "*"

(請參閱其他Web服務器的 CORS示例。)

如果您使用PHP發送腳本:

header('Access-Control-Allow-Origin', 'http://myhomesite.example');

我已經測試過了,它按預期工作。 window.onerror處理程序會通過消息,文件和行詳細信息捕獲script.js中的所有錯誤。

WebKit錯誤尚未得到修復,但已經提出了一個補丁(並使用相同的解決方案)。 希望這個修復會很快發布。

有關CORS的更多信息,請訪問: http://enable-cors.org/ : http://enable-cors.org/

Question

我有一個腳本,檢測我的網站上的Javascript錯誤,並將它們發送到我的後端進行報告。 它報告遇到的第一個錯誤,假定的行號和時間。

編輯包括文檔類型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">

...

<script type="text/javascript">
//<![CDATA[
// for debugging javascript!
(function(window){
    window.onerror = function(msg, url, ln) {
        //transform errors
        if (typeof(msg) === 'object' && msg.srcElement && msg.target) {
            if(msg.srcElement == '[object HTMLScriptElement]' && msg.target == '[object HTMLScriptElement]'){
                msg = 'Error loading script';
            }else{
                msg = 'Event Error - target:' + msg.target + ' srcElement:' + msg.srcElement;
            }
        }

        msg = msg.toString();

        //ignore errors
        if(msg.indexOf("Location.toString") > -1){
            return;
        }
        if(msg.indexOf("Error loading script") > -1){
            return;
        }

        //report errors
        window.onerror = function(){};
        (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date());
    };
})(window);
//]]>
</script>

由於這個腳本,我很清楚在我的網站上發生的任何javascript錯誤。 最大的罪犯之一是“腳本錯誤”。 在Chrome 10+和Firefox 3 + 上的第0行 。 這個錯誤在Internet Explorer中不存在(或可能被稱為別的?)。

更正(5/23/2013):此“腳本錯誤,第0行”錯誤現在顯示在IE7以及可能的其他版本的IE中。 可能是最近IE安全補丁的結果,因為此行為以前不存在。

有誰知道這個錯誤是什麼意思或者是什麼原因造成的? 它發生在我的整個頁面上的大約0.25%,並且代表了報告錯誤的一半。




由於%低,你可以假設他們不是普通用戶。 用戶可能有用戶腳本,書籤,甚至可能只是在您的網站上搞亂控制台。 讓頁面的整個HTML發生,可以幫助測試這個理論。 以及完整的錯誤。 它應該給你一個網址,它總是一樣的嗎? 該行真的是0還是只是未定義?

我不認為在你設置默認值時,onerror是一個好主意,當錯誤不在頁面上時,0可能來自parseInt(ln || 0) (見上面的例子)。

如果在JavaScript中忽略這些錯誤(因為它們可能不是來自您自己的代碼)或者在服務器端代碼中分別處理這些錯誤,那麼添加一個if以查看該行是否已知會使imo更好。

===編輯===必須: http://www.xavierm02.net/AZE/ ://www.xavierm02.net/AZE/安裝user.js文件(我在Chrome上做過,但它也應該在Firefox上運行)。 然後在同一瀏覽器上打開html頁面。 它會告訴你錯誤(我只改變了向服務器報告的內容,它將它寫在頁面上)。 以行號為0。




我經歷過

腳本錯誤。 第0行

當客戶瀏覽器發生錯誤時,有一段時間的錯誤會報告給我們的服務器。 昨天第一次(在介紹"use strict";在我們的javascript中),我能夠在Windows 7上的Safari和Chrome中復制這個問題。用alert()語句拋出代碼後,我將這個錯誤追溯到使用一個未定義的變量! 例如xx = 123; 其中xx沒有用var語句定義。

Safari將此報告為

ReferenceError:嚴格模式禁止隱式創建全局屬性'xx'

在Web Inspector中,但window.onerror函數正在檢測

腳本錯誤。 第0行




我會告訴你在Safari(WebKit)上為我解決了什麼問題:如果我將JS回調例程實際放在頁面上 ,那麼我會得到完整的信息。 如果我通過標籤將它包含在.js文件中,那麼我只會收到“腳本錯誤”錯誤(不包括布料編號等)。

也許這與Broofa所說的有關。

Anwyay,所以現在我在頁面中有一個小的回調,然後在頁面之外的文件的其餘部分。




我做了一個修復來解決這個問題。

我創建了Hermes.js ,它是一個具有相同問題的日誌錯誤系統。

在調查了一段時間後,我做了一個修復,可以幫助您處理有關不同域中的腳本的“腳本錯誤”跨域策略。

我叫CORSET,你可以here看到它是如何工作的。









Links