神秘的“脚本错误”。 在Chrome和Firefox中用Javascript报告

我有一个脚本,检测我的网站上的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%,并且代表了报告错误的一半。


“脚本错误”。 当一个异常违反了浏览器的同源策略时,即在当前页面域以外的域中托管的脚本中发生错误时,会在Firefox,Safari和Chrome中发生。

这种行为是有意的,以防止脚本泄露信息到外部域。 举一个为什么这是必要的例子,想象不小心访问了evilsite.com ,它提供了一个<script src="yourbank.com/index.html"> 。 (是的,我们将这个script标签指向html,而不是JS)。 这会导致脚本错误,但错误很有趣,因为它可以告诉我们您是否已登录。 如果你登录了,错误可能是'Welcome Fred...' is undefined ,但如果你不是,它可能是'Please Login ...' is undefined 。 沿着这些线的东西。

如果evilsite.com为前20名左右的银行机构提供这种服务,他们会很清楚您访问哪些银行网站,并且可以提供更具针对性的钓鱼页面。 (当然,这只是一个例子,但它说明了为什么浏览器不应允许任何数据跨越域边界。)

我已经在Safari,Chrome和Firefox的最新版本中测试过了 - 它们都是这样做的。 IE9不会 - 它将x来源异常与同源异常对待。 (并且Opera不支持错误。)

从马嘴:WebKit源,当传递异常到onerror()时检查源。 检查的Firefox源代码。

UPDATE(10/21/11) :跟踪这个问题的Firefox错误包括一个链接到启发了这种行为的博客文章。

UPDATE(12/2/14) :您现在可以在某些浏览器上启用完整的跨域错误报告,方法是在脚本标记上指定crossorigin属性并让服务器发送相应的CORS HTTP响应标头。


对于那些未来会陷入这个问题的更新: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/


这个花了很多时间才弄清楚。

我们做了大量的工作来尝试解决它,包括通过Ajax将WHOLE文档体转储回我们的服务器以尝试解决问题。

我仍然不确定是什么导致“脚本错误”。 (随着时间的BTW,这就是它在我们的Ajax记录器中显示的),但在Chrome中,我们能够缩小到...

击鼓...

Google Chrome的自动翻译功能。

很多讲英语的人可能甚至不知道这个功能,但为了测试它,我猜想使用Chrome浏览器访问非英文网站。 或者更好的是,如果您通过Chrome选项进行挖掘,那么有一个地方可以更改浏览器语言。 将其更改为非英文版本,重新启动浏览器并访问英文网站。

您应该在顶部询问是否希望Chrome为您翻译网页。

在我们的例子中,翻译者引发了这个问题,因为它将脚本标签注入到文档主体中,并且(在这里猜测)使用某种基于JS的系统将内容发送到Google的服务器并让它们进行翻译。

即使控制台中的错误是Unreferenced,但发送到window.onerror的消息是“脚本错误”。

无论如何,这是一种治疗方法。

http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

<meta name="google" content="notranslate"/>

这将做2件事(据我们所知,也许更多?):

a)禁用Chrome中弹出的翻译栏。

b)通过translate.google.com禁用翻译页面。

无论如何,在我们的情况下,这解决了这些“脚本错误”的问题。 我们遇到的问题。

请原谅这篇文章中的拼写错误,我在Chrome中仍然处于非英文模式,并且拼写检查器未设置为英文;)时间转回。

请享用!

链接地址: http://www.djcxy.com/p/17333.html

上一篇: Cryptic "Script Error." reported in Javascript in Chrome and Firefox

下一篇: Jquery $.Post works in Firefox but not Chrome