Chrome和Firefox中的Javascript中报告了隐藏的“脚本错误”
我有一个脚本,检测我的网站上的Javascript错误,并将其发送到我的后端进行报告。 它报告遇到的第一个错误,假定的行号和时间。
编辑包括文档types:
<!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%,并且代表了一半报告的错误。
“脚本错误”。 当一个exception违反了浏览器的同源策略时 ,也就是在Firefox,Safari和Chrome中发生的情况,即在当前页面的域以外的域中托pipe的脚本中发生错误时。
此行为是故意的,以防止脚本泄漏到外部域的信息。 举一个为什么这是必要的例子,想象不小心访问evilsite.com
,它提供了一个页面<script src="yourbank.com/index.html">
。 (是的,我们指出,在HTML脚本标记,而不是JS)。 这将导致脚本错误,但错误是有趣的,因为它可以告诉我们,如果您login或不。 如果你login,错误可能是'Welcome Fred...' is undefined
,而如果你不是,它可能是'Please Login ...' is undefined
。 沿着这些线的东西。
如果evilsite.com为前20名左右的银行机构这样做,那么他们对于访问哪个银行网站有一个相当好的想法,并且可以提供更有针对性的钓鱼页面。 (当然,这只是一个例子,但它说明了为什么浏览器不应该允许任何数据跨越域边界)。
我已经在最新版本的Safari,Chrome和Firefox中testing过了 – 他们都这样做。 IE9不会 – 它将x来源exception视为同源exception。 (Opera不支持错误。)
从马嘴: WebKit源,检查来源时传递给onerror()的exception。 以及检查的Firefox源代码 。
更新(10/21/11) : 跟踪这个问题的Firefox错误包括一个链接到启发了这种行为的博客文章。
UPDATE(12/2/14) :您现在可以在某些浏览器上启用完整的跨域错误报告,方法是在脚本标记上指定crossorigin
属性 ,并让服务器发送相应的CORS HTTP响应标头。
对于那些将来会陷入这个问题的更新:broofa是正确的答案,没有解决方法。
很明显,其他人偶然发现了这个限制,并要求修复一些错误提交给Firefox: 错误69301和WebKit: 错误70574
好消息是Firefox的Firefox 13版本已经解决了这个问题。这就是你使用它的方法:
<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');
我已经testing了这个,它按预期工作。 所有来自script.js的错误都将被window.onerror
处理程序捕获,包含消息,文件和行详细信息。
WebKit的bug还没有被修复,但是一个补丁已经被提出(并且使用相同的解决scheme)。 希望这个解决scheme很快就会发布。
有关CORS的更多信息,请访问: http : //enable-cors.org/
这一个花了不less东西才搞清楚。
我们做了一堆东西来试图解决它,包括通过Ajax将WHOLE文档体转储回我们的服务器来尝试解决这个问题。
我仍然不确定是什么导致“脚本错误”。 (随着时间的BTW,这就是它显示在我们的Ajaxlogging器)在Firefox中,但在Chrome中,我们能够缩小到…
击鼓…
Google Chrome的自动翻译function。
许多说英语的人可能甚至不知道这个function,但是为了testing它,我想用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中popup的翻译栏。
b)通过translate.google.com禁用翻译页面。
无论如何,在我们的情况下,这解决了这些“脚本错误”的TON。 我们遇到的问题。
请原谅在这篇文章中的拼写错误,我仍然在Chrome的非英文模式中写这个,而拼写检查器没有设置为英文;)时间切换回来。
请享用!
由于%低,你可以假设他们不是正常的用户。 也许用户有用户脚本,书签,甚至可能只是搞乱你的网站上的控制台。 让页面的整个HTML发生,可以帮助testing这个理论。 以及完整的错误。 它应该给你一个url,它总是一样的吗? 线是真的0还是只是未定义?
我不认为在你设置默认值onerror是一个好主意,0错误可能来自parseInt(ln || 0)
当错误不是真的在页面上(见上面的例子)。
如果在JavaScript中忽略这些错误(因为它们可能不是来自您自己的代码),或者在服务器端代码中分别处理这些错误,那么添加一个if来查看该行是否已知会更好。
===编辑===得到: http ://www.xavierm02.net/AZE/安装user.js文件(我在Chrome上做过,但它也应该在Firefox上工作)。 然后在同一浏览器上打开html页面。 它会告诉你错误(我只是改变了报告给服务器的诡计,它把它写在页面上)。 以0作为行号。
我有一个类似的问题:我的脚本是由一个子域服务,并在同一个原始限制下。 不过,我解决了这个问题:
1)像这样添加每个脚本标签:
<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />
2)通过在每个虚拟主机中添加以下内容来修改Apache httpd.conf(必须启用mod_headers):
<IfModule mod_headers.c> Header add Access-Control-Allow-Origin "*.mydomain.tld" </IfModule>
希望这可以帮助 …
编辑
在我的一个服务器上,我无法通过replace来实现这个function
*.mydomain.tld
通过
*
注意可能允许*传播扩展信息的缺陷。 有关CORS,同源,img&fonts,cdn的文档可用,但有关脚本标签的更多信息,请参阅crossorigin详细信息。
我做了一个修复来解决这个问题。
我创build了Hermes.js ,这是一个具有相同问题的日志错误系统。
经过一段时间的调查,我做了一个修复,可以帮助您解决有关不同域中的脚本的“脚本错误”跨域策略。
我叫CORSET,你可以在这里看到它是如何工作的。
在Chrome中,当从file://
加载HTML和Javascript时,我也会得到“脚本错误”(在第0行)。 这在Firefox中不会发生。 可能过度热衷于Chrome的同源保护。
当通过HTTP加载相同的HTML和Javascript时,所有的都是好的。
我会告诉你什么在Safari(WebKit)上为我解决了这个问题:如果我把JScallback例程放在页面上 ,那么我会得到完整的信息。 如果我通过标签将它包含在一个.js文件中,我只是得到了“脚本错误”错误(没有linenumber等)。
也许这与Broofa所说的有关。
Anwyay,所以现在我在页面中有一个小的callback,然后在页面之外的文件的其余部分。
下面怎么样。 脚本错误不是通过JavaScript提供的,所以只要隔离特定的情况并尽可能地处理它。
window.onerror = function (msg, url, lineNo, columnNo, error) { var string = msg.toLowerCase(); var substring = "script error"; if (string.indexOf(substring) > -1){ alert('Script Error: See Browser Console for Detail'); } else { alert(msg, url, lineNo, columnNo, error); } return false; };
一个好的文章,最后指向这个线程。 https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
我已经做了一些search,看起来“脚本错误”意味着加载一个文件,它被要求寻找的麻烦。 这可能是客户端的caching问题,也可能是由于重载导致的服务器问题。
这很可能是由类似这样的情况引起的,脚本本身就是它无法加载的文件,因此在第0行出现错误。
<script type="text/javascript" src="somescript.js"></script>
我经历过
脚本错误。 0行
在客户浏览器发生错误时,有一段时间的错误报告回我们的服务器。 昨天第一次(在介绍"use strict";
在我们的javascript中),我能够在Windows 7的Safari和Chrome上复制这个问题。用alert()语句抛出代码后,我将这个错误追溯到使用一个未定义的variables! 例如xx = 123;
其中xx不是用var
语句定义的。
Safari报告为
ReferenceError:严格模式禁止隐式创build全局属性'xx'
在Web Inspector中,但window.onerror函数正在检测
脚本错误。 0行
清理Firefox的源代码显示没有"Script Error."
。 因此,您网站上的某些脚本很可能会抛出未被捕获的错误,如下所示:
throw new Error('Script Error.');
也许这个声明只能在Firefox和Chrome中得到。
不知道为什么没有行号。 也许一些eval()
问题?