猿问
下载APP

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

我有一个脚本可以检测我网站上的Javascript错误,并将它们发送到我的后端进行报告。它报告遇到的第一个错误,假设的行号和时间。


编辑包含doctype:


<!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" 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中不存在此错误(或可能称为其他内容?)。


更正(2013年5月23日):此“脚本错误,第0行”错误现在显示在IE7和可能的其他版本的IE中。可能是最近的IE安全补丁的结果,因为此行为以前不存在。


有谁知道这个错误意味着什么或是什么导致它?它发生在我的总页面加载量的大约0.25%上,并且代表报告错误的一半。


炎炎设计
浏览 59回答 3
3回答

料青山看我应如是

“脚本错误”。当异常违反浏览器的同源策略时(即当在当前页面的域以外的域上托管的脚本中发生错误时)会发生在Firefox,Safari和Chrome中。此行为是故意的,以防止脚本泄漏信息到外部域。有关为什么这是必要的一个例子,想象一下意外访问evilsite.com,提供一个页面<script src="yourbank.com/index.html">。(是的,我们将脚本标记指向html,而不是JS)。这将导致脚本错误,但错误很有趣,因为它可以告诉我们您是否已登录。如果您已登录,则可能是错误'Welcome Fred...' is undefined,而如果您不是,则可能是错误'Please Login ...' is undefined。沿着那条线的东西。如果evilsite.com为前20家左右的银行机构提供此服务,他们会非常了解您访问的银行网站,并且可以提供更具针对性的网上诱骗网页。(当然,这只是一个例子。但它说明了为什么浏览器不允许任何数据跨越域边界。)我已经在Safari,Chrome和Firefox的最新版本中对此进行了测试 - 他们都是这样做的。IE9没有 - 它将x-origin异常视为与同源异常相同。(并且Opera不支持错误。)来自马口:WebKit源,在将异常传递给onerror()时检查原点。和Firefox的源码检查。

慕村225694

对那些将来会遇到这个问题的人的更新:broofa是正确的答案,并没有解决方法。显然其他人偶然发现了这个限制,并且为Firefox提出了一些请求修复的错误:Bug 69301和WebKit:Bug 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.exampleAccess-Control-Allow-Origin: *否则浏览器将取消加载脚本。对于Apache:Header set Access-Control-Allow-Origin "*"(并参阅其他Web服务器的 CORS示例。)如果您使用PHP发送脚本:header('Access-Control-Allow-Origin', 'http://myhomesite.example');我测试了这个,它按预期工作。来自script.js的所有错误都将由window.onerror处理程序捕获,包含消息,文件和行详细信息。WebKit错误尚未修复,但已提出补丁(并使用相同的解决方案)。希望修复程序很快就会发布。有关CORS的更多信息,请访问:http://enable-cors.org/

RISEBY

这个花了很多时间来弄明白。我们做了一些尝试解决它的东西,包括通过Ajax将WHOLE文档体转储回我们的服务器来尝试解决它。我仍然不确定导致“脚本错误”的原因。(在BTW期间,这就是它在我们的Ajax记录器中显示的方式)在Firefox中,但在Chrome中,我们能够将其缩小到......击鼓...Google Chrome的自动翻译功能。许多讲英语的人可能甚至不知道这个功能,但为了测试它,我想使用Chrome访问一个非英语网站。或者更好的是,如果您通过Chrome选项进行挖掘,则可以更改浏览器语言。将其更改为非英语,重新启动浏览器,并访问英语站点。你应该得到顶部的栏,询问你是否希望Chrome为你翻译页面。在我们的案例中,无论如何,翻译器引起了问题,因为它向您的文档正文中注入了一个脚本标记,并且(在此猜测)使用某种基于JS的系统将内容发送到Google的服务器并让他们进行翻译。即使控制台中的错误是Unreferenced something,发送到window.onerror的消息也是“Script Error。”。无论如何,有一种治疗方法。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中使用非英语模式写这个,并且拼写检查器未设置为英语;)时间切换回来。请享用!
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答