Tengo una secuencia de comandos que detecta errores de Javascript en mi sitio web y los envía a mi backend para informar. Informa el primer error encontrado, el supuesto número de línea y la hora.
EDITAR 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>
Debido a este script, soy muy consciente de los errores de JavaScript que están ocurriendo en mi sitio. Uno de los mayores delincuentes es "Error de secuencia de comandos". en la línea 0. en Chrome 10+ y Firefox 3+. Este error no existe (¿o puede llamarse de otra manera?) En Internet Explorer.
Corrección (23/05/2013): este error "Error de script, línea 0" ahora se muestra en IE7 y posiblemente en otras versiones de IE. Posiblemente como resultado de un parche de seguridad de IE reciente ya que este comportamiento no existía anteriormente.
¿Alguien tiene alguna idea de lo que significa este error o qué lo causa? Ocurre en aproximadamente el 0.25% de mis cargas de página generales, y representa la mitad de los errores reportados.
fuente
application/xhtml+xml
para ejecutarlo en el analizador XHTML (como dice la especificación XHTML). Hay una gran cantidad de contenido que dice ser XHTML, pero envía un tipo de documento HTML normal. Debido a la forma incorrecta en que los creadores de contenido usan XHTML, los navegadores decidieron usar solo el analizador XMLapplication/xhtml+xml
(es un analizador realmente estricto). El hixie.ch/advocacy/xhtml y webdevout.net/articles/beware-of-xhtml dice por qué no usar el analizador HTML con XHTML.Respuestas:
El "error de script". sucede en Firefox, Safari y Chrome cuando una excepción viola la política del mismo origen del navegador es decir, cuando se produce el error en un script alojado en un dominio que no es el dominio de la página actual.
Este comportamiento es intencional, para evitar que las secuencias de comandos filtren información a dominios externos. Para ver un ejemplo de por qué esto es necesario, imagine visitarlo accidentalmente
evilsite.com
, que sirve una página con<script src="yourbank.com/index.html">
. (sí, estamos apuntando esa etiqueta de script en html, no JS). Esto dará como resultado un error de script, pero el error es interesante porque puede decirnos si ha iniciado sesión o no. Si ha iniciado sesión, el error podría ser'Welcome Fred...' is undefined
, mientras que si no lo está, podría ser'Please Login ...' is undefined
. Algo en ese sentido.Si evilsite.com hace esto para las 20 principales instituciones bancarias, tendrían una idea bastante clara de qué sitios bancarios visita y podrían proporcionar una página de phishing mucho más específica. (Este es solo un ejemplo, por supuesto. Pero ilustra por qué los navegadores no deberían permitir cualquier dato cruce los límites del dominio).
He probado esto en las últimas versiones de Safari, Chrome y Firefox; todos lo hacen. IE9 no lo hace: trata las excepciones de origen x de la misma manera que las excepciones del mismo origen. (Y Opera no admite onerror).
De la boca de los caballos: fuente de WebKit que verifica el origen al pasar excepciones a onerror (). Y la fuente de Firefox que verifica .
ACTUALIZACIÓN (21/10/11) : el error de Firefox que rastrea este problema incluye un enlace a la publicación del blog que inspiró este comportamiento.
ACTUALIZACIÓN (12/2/14) : ahora puede habilitar el informe completo de errores entre dominios en algunos navegadores especificando un
crossorigin
atributo en las etiquetas de script y haciendo que el servidor envíe los encabezados de respuesta HTTP CORS apropiados .fuente
Script Error.
también ocurre si el usuario ha instalado una extensión de Safari (probablemente la misma para los complementos de Firefox) que inyecta código JavaScript con erroresUna actualización para aquellos que tropezarán con esta pregunta en el futuro: broofa tiene razón con la respuesta y no hay solución para esto.
Obviamente, otros tropezaron con esta limitación y algunos errores que solicitaron una solución se archivaron para Firefox: Bug 69301 y para WebKit: Bug 70574
La buena noticia es que el error se ha resuelto para Firefox con el lanzamiento de Firefox 13. Así es como lo usa:
crossorigin
es equivalentecrossorigin=anonymous
y le dice al navegador que haga una búsqueda CORS del script sin enviar credenciales.Debe asegurarse de que el script se envíe con un
Access-Control-Allow-Origin
valor de encabezado HTTP que coincida con el dominio solicitante, por ejemplo,de lo contrario, el navegador cancelará la carga del script .
Para Apache:
(Y vea ejemplos de CORS para otros servidores web ).
Si envía scripts en PHP:
He probado esto y funciona como se esperaba. todos los errores del script.js serán detectados por el
window.onerror
controlador con los detalles del mensaje, archivo y línea.El error de WebKit aún no se ha solucionado, pero se ha propuesto un parche (y utiliza la misma solución). Con suerte, la solución se lanzará pronto.
Más información sobre CORS aquí: http://enable-cors.org/
fuente
Este tardó bastante en darse cuenta.
Hicimos un montón de cosas para tratar de resolverlo, incluyendo hacer cosas como descargar el cuerpo del documento ENTERO a nuestros servidores a través de Ajax para tratar de resolverlo.
Todavía no estoy seguro de qué causa el "Error de script". (con el período BTW, así es como se muestra en nuestro registrador Ajax) en Firefox, pero en Chrome, pudimos reducirlo a ...
Rollo de tambor ...
La función de traducción automática de Google Chrome.
Probablemente, muchas personas de habla inglesa ni siquiera conocen esta característica, pero para probarla, supongo que visite un sitio que no esté en inglés con Chrome. O mejor aún, si explora las opciones de Chrome, hay un lugar para cambiar el idioma del navegador. Cambie a algo que no esté en inglés, reinicie el navegador y visite un sitio en inglés.
Debería obtener la barra en la parte superior preguntando si desea que Chrome traduzca la página por usted.
De todos modos, en nuestro caso, el traductor estaba causando el problema ya que inyecta una etiqueta de script en el cuerpo de su documento y (adivinando aquí) usa algún tipo de sistema basado en JS para enviar el contenido a los servidores de Google y hacer que lo traduzcan.
Aunque el error en la consola fue algo sin referencia, el mensaje que se envió a window.onerror fue "Error de script".
De todos modos, hay una cura.
http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html
Esto hará 2 cosas (hasta donde sabemos, ¿quizás más?):
a) Desactiva la barra de traducción para que no aparezca en Chrome.
b) Desactive la traducción de la página a través de translate.google.com.
De todos modos, en nuestra situación, esto resolvió UNA TONELADA de estos "Error de Script". problemas que estábamos experimentando
Disculpe los errores de ortografía en esta publicación, todavía estoy en un modo que no está en inglés en Chrome escribiendo esto, y el corrector ortográfico no está configurado en inglés;) Hora de volver atrás.
¡Disfrutar!
fuente
onerror
(al menos en Firefox) simplemente dice "Error de secuencia de comandos" en tal caso.Debido al bajo porcentaje, puede asumir que no son usuarios normales. Probablemente usuarios con guiones de usuario, marcadores o incluso simplemente jugando con la consola en su sitio web. Tener todo el HTML de una página donde sucede podría ayudar a probar esta teoría. Así como el error completo. Debería darte una url, ¿es siempre lo mismo? ¿La línea es realmente 0 o simplemente no está definida?
No creo que establecer valores predeterminados en usted onerror sea una buena idea y el 0 probablemente proviene de
parseInt(ln || 0)
cuando el error no está realmente en la página (consulte los ejemplos anteriores).Agregar un if para ver si la línea se conoce en JavaScript para ignorar esos errores (porque probablemente no provienen de su propio código) o en el código del lado del servidor para cuidarlos por separado sería, en mi opinión, mejor .
=== EDITAR === Tengo que: http://www.xavierm02.net/AZE/ Instalar el archivo user.js (lo hice en Chrome pero también debería funcionar en Firefox). Luego abra la página html en el mismo navegador. Le mostrará el error (solo cambié esa indicación de informar al servidor, lo escribe en la página). Con 0 como número de línea.
fuente
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());
y probablemente no verá ninguna URL (porque es una extensión o algo local para que el navegador no lo muestre) y ningún número de línea.Tuve un problema similar: mis scripts son atendidos por un subdominio y caen bajo la misma restricción de origen. Sin embargo, resolví esto por:
1) agregando cada etiqueta de script como esta:
2) modificando el httpd.conf de apache agregando lo siguiente dentro de cada vhost (debe deshabilitar mod_headers):
Espero que esto ayude ...
EDITAR
En uno de mis servidores no pude hacer que esto funcionara excepto al reemplazar
por
Tenga en cuenta las fallas que potencialmente permiten * robar información extendida. La documentación sobre CORS, del mismo origen, img y fonts, cdn está disponible, pero hay muy pocos datos disponibles sobre los detalles de origen cruzado de etiquetas de script.
fuente
En Chrome, también recibo "Error de script" (en la línea 0) al cargar tanto HTML como Javascript desde
file://
. Esto no sucede en Firefox. Probablemente sobre celoso protección del mismo origen de Chrome.Todo está bien al cargar el mismo HTML y Javascript sobre HTTP.
fuente
¿Qué tal lo de abajo? El error de la secuencia de comandos no está disponible a través de JavaScript, así que solo aísle ese caso en particular y trátelo lo mejor que pueda.
fuente
Un buen artículo que finalmente apunta a este hilo. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
fuente
Tanto Chrome como Firefox en iOS se basan en Safari Webview pero insertan un montón de scripts personalizados en cada página que se carga. Si en alguno de esos scripts algo sale mal, se informa s
Script error on line 0
. (Los scripts insertados en el navegador también cuentan como origen cruzado)Como he rastreado y documentado en este otro hilo SO, tanto Chrome como Firefox en iOS tienen problemas en sus scripts personalizados que manejan los elementos SVG correctamente. Por lo tanto, además de todas las otras respuestas en este hilo: si usa elementos y
<a>
etiquetas SVG dentro de las<svg>
etiquetas en su página, eso generaráScript errors
informes en iOS Chrome y iOS Firefox.fuente
Te diré lo que me solucionó en Safari (WebKit): si pongo la rutina de devolución de llamada JS en la página , entonces obtengo información completa. Si lo incluyo en un archivo .js a través de una etiqueta, solo aparece el error "Error de script" (sin número de lino, etc.).
Quizás esto esté relacionado con lo que dijo Broofa.
Anwyay, así que ahora tengo una pequeña devolución de llamada en la página, y luego el resto del archivo fuera de la página.
fuente
He buscado un poco y parece que un "Error de script" significa que tuvo problemas para cargar un archivo que se le pidió que buscara. Esto podría ser un problema de almacenamiento en caché en el lado del cliente, o podría ser un problema del servidor debido a una sobrecarga.
Lo más probable es que sea causado por algo así, donde el script en sí es el archivo que no puede cargar, de ahí el error que ocurre en la línea 0.
fuente
script.onerror
no fue despedido por la falta de scripts en algunos navegadores.He experimentado
Error de guión. línea 0
los errores se informaron durante algún tiempo a nuestro servidor cuando se produjo el error en los navegadores de los clientes. Ayer por primera vez (después de introducir
"use strict";
en nuestro javascript) pude replicar este problema en Safari y Chrome en Windows 7. ¡Después de ensuciar nuestro código con declaraciones alert (), rastreé este error hasta el uso de una variable indefinida! por ejemplo,xx = 123;
donde xx no está definido con unavar
declaración.Safari informó esto como
ReferenceError: el modo estricto prohíbe la creación implícita de la propiedad global 'xx'
dentro de Web Inspector, pero la función window.onerror estaba detectando
Error de guión. línea 0
fuente
El código fuente de Grepping Firefox revela que no hay
"Script Error."
. Por lo tanto, es muy probable que algún script en su sitio arroje un error no detectado como este:Probablemente esta declaración solo se alcanza en Firefox y Chrome.
Sin embargo, no estoy seguro de por qué no hay un número de línea. Tal vez algún
eval()
problema?fuente