Загадочная " Ошибка Скрипта."сообщается в Javascript в Chrome и Firefox
у меня есть скрипт, который обнаруживает ошибки 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" 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, которые происходят на моем сайте. одним из самых больших правонарушителей является "ошибка скрипта." на линии 0. в Chrome 10+ и Firefox 3+. Эта ошибка не существует (или можно назвать что-то еще?) в Internet Explorer.
коррекция (5/23/2013): эта ошибка "ошибка скрипта, строка 0" теперь отображается в IE7 и, возможно, в других версиях IE. Возможно, это результат недавнего исправления безопасности IE, поскольку это поведение ранее не существовало.
кто-нибудь знает, что означает эта ошибка и что его вызывает? Это происходит примерно на 0,25% от моего общего загружает страницы и представляет половину сообщенных ошибок.
12 ответов:
"ошибка сценария."происходит в 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-происхождения так же, как и те же самые. (И Opera не поддерживает onerror.)
из лошадиного рта:WebKit источник, который проверяет происхождение при передаче исключений в onerror (). И источник Firefox, который проверяет.
обновление (10/21/11): The Firefox ошибка, которая отслеживает эту проблему включает ссылку на сообщение в блоге, которое вдохновило это поведение.
обновление (12/2/14): теперь вы можете включить полную междоменную отчетность об ошибках в некоторых браузерах, указав
crossorigin
атрибут на теги скрипта и имея сервер отправить соответствующий CORS HTTP-ответа заголовки.
обновление для тех, кто столкнется с этим вопросом в будущем : бруфа прав с ответом, и для этого нет обходного пути.
очевидно, что другие наткнулись на это ограничение, и некоторые ошибки, запрашивающие исправление, были поданы для 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 "*"
(и см. примеры CORS для другой веб-серверы.)
если вы отправляете скрипты на PHP:
header('Access-Control-Allow-Origin', 'http://myhomesite.example');
Я проверил это, и это работает, как ожидалось. все ошибки из скрипта.js будет пойман
window.onerror
обработчик с информацией о сообщении, файле и строке.ошибка WebKit еще не исправлена, но патч был предложен (и использует то же решение). Надеюсь, исправление будет выпущено в ближайшее время.
подробнее о CORS здесь : http://enable-cors.org/
это заняло совсем немного, чтобы понять.
мы сделали кучу вещей, чтобы попытаться решить эту проблему, в том числе делать такие вещи, как сброс всего тела документа обратно на наши серверы через Ajax, чтобы попытаться понять это.
Я все еще не уверен, что вызывает "ошибка скрипта."(с периодом кстати, вот как он отображается в нашем AJAX logger) в Firefox, но в Chrome мы смогли сузить его до...
барабанная дробь...
функция автоматического перевода Google Chrome.
многие англоязычные люди, вероятно, даже не знают об этой функции, но чтобы проверить ее, я думаю, посетите неанглоязычный сайт с помощью Chrome. Или еще лучше, если вы копаетесь в настройках Chrome, есть место, чтобы изменить язык браузера. Измените его на что-то неанглийское, перезапустите браузер и посетите английский сайт.
вы должны получить бар в верхней части спрашивая, если вы хотите Chrome, чтобы перевести страницу для вас.
в нашем случае в любом случае, переводчик вызывал проблему, так как он вводит тег сценария в тело документа и (угадывая здесь) использует какую-то систему на основе JS для отправки контента на серверы Google и заставить их перевести его.
несмотря на то, что ошибка в консоли была Unreferenced что-то, сообщение, которое было отправлено в окно.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 пишу это, и проверка орфографии не установлена на английский язык ;) время для переключения обратно.
наслаждайтесь!
из-за низкого %, вы можете предположить, что они не обычные пользователи. Вероятно, пользователи с userscripts, букмарклеты или даже, может быть, просто возиться с консолью на вашем сайте. Наличие всего HTML страницы, где это происходит, может помочь проверить эту теорию. Как и полная ошибка. Он должен дать вам url, это всегда одно и то же? Действительно ли строка 0 или просто не определена?
Я не думаю, что установка значений по умолчанию в вас onerror-это хорошая идея, и 0, вероятно, исходит от
parseInt(ln || 0)
когда ошибка на самом деле не на странице (см. примеры выше).добавление if, чтобы увидеть, известна ли строка либо в JavaScript, чтобы игнорировать эти ошибки (потому что они, вероятно, не исходят из вашего собственного кода), либо в коде на стороне сервера, чтобы заботиться о них отдельно, ИМО, было бы лучше.
=== редактировать === Добраться: http://www.xavierm02.net/AZE/ Установите пользователя.JS-файл (я сделал это на Chrome, но он должен работать и на Firefox). Затем откройте HTML-страницу на тот же браузер. Он покажет вам ошибку (я только изменил этот экземпляр отчета на сервер, он записывает его на странице). С 0 в качестве номера строки.
у меня была аналогичная проблема: мои скрипты обслуживаются поддоменом и подпадают под одно и то же ограничение происхождения. Тем не менее, я решил это с помощью:
1) добавление каждого тега скрипта следующим образом:
<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />
2) Изменение Apache httpd.conf, добавив следующее внутри каждого vhost (вы должны enbable mod_headers):
<IfModule mod_headers.c> Header add Access-Control-Allow-Origin "*.mydomain.tld" </IfModule>
надеюсь, что это помогает ...
EDIT
на одном из моих серверов я не смог сделать этот функционал за исключением замены
*.mydomain.tld
by
*
будьте в курсе недостатков с потенциально позволяя * Фиш расширенной информации. Документации на технологии CORS, единого происхождения, ИМГ и шрифты, CDN является доступным, но очень немногие о теге скрипт crossorigin детали есть в наличии.
в Chrome я также получаю "ошибку скрипта" (в строке 0) При загрузке HTML и Javascript из
file://
. Этого не происходит в Firefox. Вероятно, переусердствовала защита от Хрома того же происхождения.все хорошо при загрузке одного и того же HTML и Javascript через HTTP.
Как насчет ниже. Ошибка скрипта недоступна через 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; };
Я скажу вам, что исправил это для меня на Safari (WebKit): Если я поставлю процедуру обратного вызова JS на самом деле на странице, тогда я получаю полную информацию. Если я включу его в a .JS-файл через тег, я просто получаю ошибку" ошибка скрипта " (без номера строки и т. д.).
может быть, это связано с тем, что сказал Бруфа.
Anwyay, так что теперь у меня есть небольшой обратный звонок на странице, а затем остальная часть файла за пределами страницы.
хорошая статья, которая, наконец, указывает на эту тему. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
Я сделал немного поиска, и кажется, что "ошибка скрипта" означает, что у него возникли проблемы с загрузкой файла, который его попросили искать. Это может быть проблема с кэшированием на стороне клиента, или это может быть проблема сервера из-за перегрузки.
это, скорее всего, вызвано чем-то вроде этого, где сам скрипт является файлом, который он не может загрузить, поэтому ошибка возникает в строке 0.
<script type="text/javascript" src="somescript.js"></script>
Я
Ошибка Сценария. линия 0
ошибки в течение некоторого времени сообщается обратно на наш сервер, когда произошла ошибка в браузерах клиентов. Вчера в первый раз (после введения
"use strict";
в нашем javascript) я смог воспроизвести эту проблему в Safari и Chrome на Windows 7. После засорения нашего кода инструкциями alert () я проследил эту ошибку до использования неопределенной переменной! например,xx = 123;
здесь xx не определяется с помощьюvar
заявление.Safari сообщил об этом как
ReferenceError: строгий режим запрещает неявное создание глобального свойства 'xx'
в веб-инспекторе, но окно.функция onerror обнаруживала
Ошибка Сценария. линия 0
Grepping исходный код Firefox показывает, что нет
"Script Error."
. Таким образом, это очень вероятно, что какой-то скрипт на вашем сайте будет бросать ошибку непойманные такой:throw new Error('Script Error.');
вероятно, это утверждение только в Firefox и Chrome.
не уверен, почему нет номера строки, хотя. Может быть, некоторые
eval()
вопрос?