Eu tenho um script que detecta erros de Javascript no meu site e os envia ao meu back-end para geração de relatórios. Ele relata o primeiro erro encontrado, o número da linha suposta e a hora.
EDIT para incluir 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" 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>
Devido a esse script, estou ciente de quaisquer erros de javascript que estão acontecendo no meu site. Um dos maiores infratores é o "Erro de script". na linha 0. no Chrome 10+ e Firefox 3+. Este erro não existe (ou pode ser chamado de outra coisa?) No Internet Explorer.
Correção (23/05/2013): Este erro "Erro de script, linha 0" está aparecendo no IE7 e possivelmente em outras versões do IE. Possivelmente resultado de um patch de segurança recente do IE, pois esse comportamento não existia anteriormente.
Alguém tem alguma idéia do que esse erro significa ou o que causa? Isso acontece em cerca de 0,25% do meu total de carregamentos de páginas e representa metade dos erros relatados.
fonte
application/xhtml+xml
para executá-lo no analisador XHTML (como a especificação XHTML diz). Existe um monte de conteúdo que afirma ser XHTML, mas envia um tipo de documento HTML normal. Devido à forma como os criadores de conteúdo incorretamente usam XHTML, os navegadores decidiram usar apenas o analisador XMLapplication/xhtml+xml
(é realmente um analisador estrito). O hixie.ch/advocacy/xhtml e webdevout.net/articles/beware-of-xhtml diz por que não usar o analisador de HTML com XHTML.Respostas:
O "erro de script". acontece no Firefox, Safari e Chrome quando uma exceção viola a política de mesma origem do navegador - ou seja, quando o erro ocorre em um script hospedado em um domínio que não seja o domínio da página atual.
Esse comportamento é intencional, para impedir que scripts vazem informações para domínios externos. Para um exemplo de por que isso é necessário, imagine uma visita acidental
evilsite.com
, que serve uma página com<script src="yourbank.com/index.html">
. (sim, apontamos essa tag de script para html, não para JS). Isso resultará em um erro de script, mas o erro é interessante porque pode nos dizer se você está logado ou não. Se você estiver logado, o erro pode ser'Welcome Fred...' is undefined
, enquanto se não estiver, pode ser'Please Login ...' is undefined
. Algo nesse sentido.Se evilsite.com fizer isso para as 20 principais instituições bancárias, elas terão uma boa idéia de quais sites bancários você visitar e poderão fornecer uma página de phishing muito mais direcionada. (Este é apenas um exemplo, é claro. Mas ilustra por que os navegadores não devem permitir que nenhum dado ultrapasse os limites do domínio.)
Eu testei isso nas últimas versões do Safari, Chrome e Firefox - todos eles fazem isso. O IE9 não - trata as exceções de origem x da mesma forma que as exceções de mesma origem. (E o Opera não suporta onerror.)
Da boca do cavalo: fonte do WebKit que verifica a origem ao passar exceções para onerror (). E a fonte do Firefox que verifica .
ATUALIZAÇÃO (21/10/11) : o bug do Firefox que acompanha esse problema inclui um link para a postagem do blog que inspirou esse comportamento.
ATUALIZAÇÃO (02/12/14) : agora você pode ativar o relatório completo de erros entre domínios em alguns navegadores, especificando um
crossorigin
atributo nas tags de script e solicitando que o servidor envie os cabeçalhos de resposta HTTP CORS apropriados .fonte
Script Error.
também ocorre se o usuário instalou uma extensão do Safari (provavelmente a mesma para os plug-ins do Firefox) que injeta código JavaScript com errosUma atualização para aqueles que encontrarão essa pergunta no futuro: broofa está certa com a resposta e não há solução alternativa para isso.
Obviamente, outros tropeçaram nessa limitação e alguns bugs solicitando uma correção foram arquivados para Firefox: Bug 69301 e WebKit: Bug 70574
A boa notícia é que o bug foi resolvido no Firefox com o lançamento do Firefox 13. É assim que você o usa:
crossorigin
é equivalente acrossorigin=anonymous
e diz ao navegador para fazer uma busca CORS do script sem enviar credenciais.Você deve garantir que o script seja enviado com um
Access-Control-Allow-Origin
valor de cabeçalho HTTP que corresponda ao domínio solicitante, por exemplo,caso contrário, o navegador cancelará o carregamento do script .
Para o Apache:
(E veja exemplos do CORS para outros servidores da web .)
Se você estiver enviando scripts em PHP:
Eu testei isso e funciona como esperado. todos os erros do script.js serão capturados pelo
window.onerror
manipulador com detalhes de mensagem, arquivo e linha.O bug do WebKit ainda não foi corrigido, mas um patch foi proposto (e usa a mesma solução). Esperamos que a correção seja lançada em breve.
Mais informações sobre o CORS aqui: http://enable-cors.org/
fonte
Este demorou um pouco para descobrir.
Fizemos várias coisas para tentar resolvê-lo, incluindo fazer o envio de todo o corpo do documento de volta aos nossos servidores via Ajax para tentar descobrir.
Ainda não tenho certeza do que causa "Erro de script". (com o período BTW, é assim que aparece no nosso registrador Ajax) no Firefox, mas no Chrome, conseguimos reduzi-lo a ...
Rolo de tambor ...
O recurso de conversão automática do Google Chrome.
Muitas pessoas que falam inglês provavelmente nem conhecem esse recurso, mas para testá-lo, acho que visitam um site que não seja o inglês usando o Chrome. Ou melhor ainda, se você pesquisar nas opções do Chrome, há um local para alterar o idioma do navegador. Altere para algo que não seja o inglês, reinicie o navegador e visite um site em inglês.
Você deve obter a barra na parte superior perguntando se deseja que o Chrome traduza a página para você.
De qualquer forma, o tradutor estava causando o problema, pois injeta uma tag de script no corpo do documento e (adivinha aqui) usa algum tipo de sistema baseado em JS para enviar o conteúdo aos servidores do Google e fazer com que eles o traduzam.
Mesmo que o erro no console fosse algo não referenciado, a mensagem que estava sendo enviada para window.onerror era "Erro de script".
De qualquer forma, existe uma cura.
http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html
Isso fará duas coisas (até onde sabemos, talvez mais?):
a) Desative a barra de conversão de aparecer no Chrome.
b) Desative a tradução da página em translate.google.com.
De qualquer maneira, em nossa situação, isso resolveu MUITAS "Erros de script". problemas que estávamos enfrentando.
Desculpe os erros ortográficos nesta postagem. Ainda estou no modo não inglês no Chrome, e o verificador ortográfico não está definido como inglês;) Hora de voltar.
Aproveitar!
fonte
onerror
(pelo menos no Firefox) apenas diz "Erro de script" nesse caso.Devido ao baixo%, você pode assumir que eles não são usuários normais. Provavelmente usuários com scripts de usuários, bookmarklets ou até mesmo brincando com o console no site. Ter todo o HTML de uma página onde isso acontece pode ajudar a testar essa teoria. Bem como o erro completo. Deve fornecer um URL, é sempre o mesmo? A linha é realmente 0 ou apenas indefinida?
Eu não acho que definir valores padrão em você no erro seja uma boa idéia e o 0 provavelmente vem
parseInt(ln || 0)
quando o erro não está realmente na página (veja os exemplos acima).Adicionar um if para ver se a linha é conhecida no JavaScript por ignorar esses erros (porque provavelmente não provém do seu próprio código) ou no código do servidor para cuidar deles separadamente seria melhor .
=== EDIT === Chegou a: http://www.xavierm02.net/AZE/ Instale o arquivo user.js (eu fiz no Chrome, mas também deve funcionar no Firefox). Em seguida, abra a página html no mesmo navegador. Ele mostrará o erro (apenas mudei esse instinto de relatar ao servidor, ele o grava na página). Com 0 como número da linha.
fonte
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());
e você provavelmente não verá nenhum URL (porque é uma extensão ou algo local para que o navegador não mostre) e nenhum número de linha.Eu tive um problema semelhante: meus scripts são servidos por um subdomínio e se enquadram na mesma restrição de origem. No entanto, resolvi isso da seguinte maneira:
1) adicionando todas as tags de script assim:
2) modificando o apache httpd.conf adicionando o seguinte dentro de cada vhost (você deve ativar mod_headers):
Espero que isto ajude ...
EDITAR
Em um dos meus servidores, não pude tornar isso funcional, exceto substituindo
de
Esteja ciente das falhas ao permitir * phishing informações estendidas. Documentação sobre CORS, mesma origem, img e fontes, cdn está disponível, mas muito menos sobre detalhes sobre a origem de tags de script está disponível.
fonte
No Chrome, também recebo "Erro de script" (na linha 0) ao carregar o HTML e o Javascript
file://
. Isso não acontece no Firefox. Provavelmente proteção excessivamente zelosa do Chrome da mesma origem.Tudo é bom ao carregar o mesmo HTML e Javascript sobre HTTP.
fonte
Que tal o abaixo. O erro de script não está disponível via JavaScript; basta isolar esse caso específico e lidar com ele da melhor maneira possível.
fonte
Um bom artigo que finalmente aponta para esse tópico. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
fonte
O Chrome e o Firefox no iOS são baseados no Safari Webview, mas insere vários scripts personalizados em cada página carregada. Se em algum desses scripts algo der errado, será relatado que
Script error on line 0
. (Os scripts inseridos pelo navegador também contam como origem cruzada)Como eu rastreei e documentei nesse outro segmento SO, o Chrome e o Firefox no iOS têm problemas em seus scripts personalizados que manipulam os elementos SVG corretamente. Portanto, além de todas as outras respostas neste tópico: Se você usar elementos e
<a>
tags SVG dentro de<svg>
tags na sua página, isso seráScript errors
reportado no iOS Chrome e no iOS Firefox.fonte
Vou lhe dizer o que foi corrigido para mim no Safari (WebKit): se eu colocar a rotina de retorno de chamada JS realmente na página , receberei informações completas. Se eu incluí-lo em um arquivo .js por meio de uma tag, recebo o erro "Erro de script" (sem número de roupa etc.).
Talvez isso esteja relacionado ao que Broofa disse.
De qualquer forma, agora tenho um pequeno retorno de chamada na página e o restante do arquivo fora da página.
fonte
Pesquisei um pouco e parece que um "Erro de script" significa que houve problemas ao carregar um arquivo que foi solicitado a procurar. Isso pode ser um problema de armazenamento em cache no lado do cliente ou pode ser um problema no servidor devido à sobrecarga.
Provavelmente, é causado por algo assim, onde o próprio script é o arquivo que não pode carregar, daí o erro que ocorre na linha 0.
fonte
script.onerror
não foi demitido por falta de scripts em alguns navegadores.Eu experimentei
Erro de script. linha 0
erros há algum tempo relatados ao nosso servidor quando ocorreu o erro nos navegadores do cliente. Ontem, pela primeira vez (depois de introduzir
"use strict";
nosso javascript), consegui replicar esse problema no Safari e no Chrome no Windows 7. Depois de colocar nosso código com instruções alert (), localizei esse erro no uso de uma variável indefinida! por exemplo,xx = 123;
onde xx não está definido com umavar
declaração.O Safari relatou isso como
ReferenceError: O modo estrito proíbe a criação implícita da propriedade global 'xx'
no Web Inspector, mas a função window.onerror estava detectando
Erro de script. linha 0
fonte
Grepping o código fonte do Firefox revela que não existe
"Script Error."
. Portanto, é muito provável que algum script no seu site esteja lançando um erro não detectado como este:Provavelmente, esta afirmação é alcançada apenas no Firefox e Chrome.
Não sei por que não há número de linha. Talvez algum
eval()
problema?fonte