Загадочный «Ошибка скрипта». сообщается в Javascript в Chrome и Firefox

199

У меня есть скрипт, который обнаруживает ошибки 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.

Исправление (23.05.2013): эта ошибка «Ошибка сценария, строка 0» теперь отображается в IE7 и, возможно, в других версиях IE. Возможно, это результат недавнего исправления безопасности IE, так как ранее такого поведения не было.

Кто-нибудь знает, что означает эта ошибка или что ее вызывает? Это происходит примерно на 0,25% моих общих загрузок страниц и составляет половину зарегистрированных ошибок.

Майк Шеров
источник
Какой твой доктайп? Если вы не объявляете тип документа XHTML, то вам не нужны CDATA, что может быть причиной ошибок скрипта.
Джеймс
Я ценю помощь ... Добавлен doctype: XHTML. Кроме того, однако, это происходит только на 0,25% загрузок страниц ... Я думаю, что это что-то более экзотическое.
Майк Шеров
3
@jayp: Просто упомяну. Тип документа XHTML по-прежнему остается анализатором HTML. Вы должны отправить контент как application/xhtml+xmlдля запуска его в XHTML-парсере (как сказано в спецификации XHTML). Существует много контента, который претендует на XHTML, но отправляет обычный HTML-тип документа. Из-за того, что создатели контента неправильно используют XHTML, браузеры решили использовать только парсер XML application/xhtml+xml(это действительно строгий парсер). В hixie.ch/advocacy/xhtml и webdevout.net/articles/beware-of-xhtml говорится, почему бы не использовать анализатор HTML с XHTML.
Конрад Боровски
11
Вздох ... ради любви к Богу, любой, кто читает это, пожалуйста, заставьте свои сообщения об ошибках объяснить точно, что пошло не так! Экономя 30 секунд усилий на написании этого, вы тратите впустую весь мир на человека!
Роман Старков
1
Вы игнорируете ошибки загрузки скрипта. Зачем? Их безопасно игнорировать?
Рампр

Ответы:

261

«Ошибка сценария». происходит в 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 так же, как исключения того же происхождения. (И Опера не поддерживает ошибку.)

Из уст лошадей: источник WebKit, который проверяет происхождение при передаче исключений в onerror (). И источник Firefox, который проверяет .

ОБНОВЛЕНИЕ (21.10.11) : ошибка Firefox, которая отслеживает эту проблему, включает ссылку на пост в блоге, который вдохновил это поведение.

ОБНОВЛЕНИЕ (12/2/14) : теперь вы можете включить полный междоменный отчет об ошибках в некоторых браузерах, указав crossoriginатрибут в тегах сценария и сделав так, чтобы сервер отправлял соответствующие заголовки HTTP-ответов CORS .

broofa
источник
3
Спасибо за это. Я хотел бы немного разъяснений. Я вижу подробные сообщения об ошибках из сценариев, которые я постоянно размещаю на своей странице. Например, если я включаю jQuery из cdn от Google и использую его для манипулирования несуществующим элементом на моей странице, я получаю ошибку, которая указывает на CDN Google. Вы говорите, что «Ошибка скрипта». происходит, потому что удаленный скрипт вызывает исключение?
Майк Шеров
150
Вы могли бы подумать, что у кого-то есть смысл сказать «Удаленный скрипт выдал ошибку, которая была скрыта из-за политики того же происхождения», вместо того, чтобы оставить вас в размышлении, что пошло не так, а? ...
Роман Старков
3
@broofa Означает ли это, что я поправлюсь, кроме случаев, когда я размещу jquery на своем домене вместо использования CDN от Google?
Пол Биггар
6
Небольшое обновление. Это также происходит локально, когда страница загружается через file: // и скрипт запускается через eval (). Незначительный сценарий использования, но все же :)
Виллем Малдер
6
После некоторого расследования я заметил, что Script Error.также происходит, если пользователь установил расширение Safari (вероятно, то же самое для плагинов Firefox), которое внедряет код JavaScript с ошибками
Алекс Хоппен
49

Обновление для тех, кто столкнется с этим вопросом в будущем: брофа прав с ответом, и для этого нет обходного пути.

Очевидно, что другие столкнулись с этим ограничением, и некоторые ошибки, запрашивающие исправление, были поданы для 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');

Я проверил это, и он работает как ожидалось. все ошибки из window.onerrorфайла script.js будут перехвачены обработчиком с подробным сообщением, файлом и строкой.

Ошибка WebKit еще не исправлена, но был предложен патч (и использует то же решение). Надеюсь, исправление будет выпущено в ближайшее время.

Больше информации о CORS здесь: http://enable-cors.org/

adig
источник
2
Хорошее резюме: blog.errorception.com/2012/12/…
Сэм
1
Re WebKit. Если вы имеете в виду это, похоже, что оно решено сейчас: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek
3
Допустим, мы хотим отслеживать ошибки JS в mysite.com/index.php, который включает в себя файл JS от внешней стороны (например, сервер провайдера API apiprovider.com/api.js); в этом случае у нас нет доступа к этому серверу, поэтому мы не можем добавить заголовок «Access-Control-Allow-Origin». Есть ли способ получить сообщения об ошибках от api.js?
Эудженио
23

Этому потребовалось немало времени, чтобы понять.

Мы сделали кучу вещей, чтобы попытаться решить их, включая такие вещи, как выгрузка всего тела документа обратно на наши серверы через Ajax, чтобы попытаться выяснить это.

Я все еще не уверен, что вызывает «Ошибка скрипта». (с периодом между прочим, вот как это проявляется в нашем Ajax-логгере) в Firefox, но в Chrome мы смогли сузить его до ...

Барабанная дробь...

Функция автоматического перевода Google Chrome.

Многие англоговорящие люди, вероятно, даже не знают об этой функции, но для ее тестирования, я думаю, посетите неанглоязычный сайт с помощью Chrome. Или, что еще лучше, если вы поковыряетесь в настройках Chrome, есть место для изменения языка браузера. Измените его на что-нибудь неанглийское, перезапустите браузер и посетите сайт на английском языке.

Вы должны получить панель вверху, спрашивая, хотите ли вы, чтобы Chrome перевел страницу для вас.

В любом случае, в нашем случае переводчик вызывал проблему, так как он вставляет тег сценария в тело документа и (догадываясь здесь) использует какую-то систему на основе JS для отправки контента на серверы Google и получения его для его перевода.

Несмотря на то, что ошибка в консоли была чем-то не связанным, сообщение, которое отправлялось в window.onerror, было «Ошибка сценария».

В любом случае, есть лекарство.

http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

<meta name="google" content="notranslate"/>

Это сделает 2 вещи (насколько мы знаем, может быть, больше?):

a) Отключите переводчик, чтобы он появлялся в Chrome.

б) Отключить перевод страницы через translate.google.com.

В любом случае, в нашей ситуации это решило тонну этих «ошибок сценария». проблемы, которые мы испытывали.

Извините за орфографические ошибки в этом посте, я все еще нахожусь на неанглийском режиме в Chrome, пишущем это, и проверка орфографии не установлена ​​на английский;) Время переключиться назад.

Наслаждайтесь!

анонимные один
источник
4
Прямая причина, вероятно, заключается в том, что скрипт переводчика был запущен из другого домена, чем веб-страница, и onerror(по крайней мере, в Firefox) просто говорит «Ошибка скрипта » в таком случае.
Tgr
10

Из-за низкого% вы можете предположить, что они не обычные пользователи. Возможно, пользователи с пользовательскими скриптами, букмарклетами или даже просто возятся с консолью на вашем сайте. Наличие всего HTML страницы, где это происходит, может помочь проверить эту теорию. Как и полная ошибка. Это должно дать вам URL, это всегда то же самое? Строка действительно 0 или просто не определена?

Я не думаю, что установка значений по умолчанию в вашем onerror - это хорошая идея, и 0, вероятно, появляется, parseInt(ln || 0)когда ошибки на самом деле нет на странице (см. Примеры выше).

Добавление if, чтобы увидеть, известна ли строка либо в JavaScript, чтобы игнорировать эти ошибки (потому что они, вероятно, не исходят из вашего собственного кода), либо в коде на стороне сервера, чтобы позаботиться о них отдельно, было бы, imo, лучше ,

=== РЕДАКТИРОВАТЬ === Получил: http://www.xavierm02.net/AZE/ Установите файл user.js (я сделал это на Chrome, но он должен работать и на Firefox). Затем откройте HTML-страницу в том же браузере. Он покажет вам ошибку (я только изменил этот отчет о сообщении на сервер, он пишет это на странице). С 0 в качестве номера строки.

xavierm02
источник
URL-адрес равномерно распределяется по страницам моего сайта. Я предполагаю букмарклеты или даже расширения или темы тоже, учитывая, что это FF и хром. Однако я хотел бы иметь возможность воспроизвести это сообщение об ошибке точно, прежде чем безопасно его игнорировать.
Майк Шеров
Замените свою строку на, (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());и вы, вероятно, не увидите URL (потому что это расширение или что-то локальное, поэтому браузер не показывает вам) и номер строки.
xavierm02
И, между прочим, вы должны получить временную метку с вашим сервером, а не с JS (и даже, может быть, просто получить версию вместо временной метки).
xavierm02
1
Фактически, JS должен просто отправлять необработанные данные, а PHP должен заботиться об игнорировании ошибок загрузки и так далее.
xavierm02
Я выполняю некоторую обработку на стороне JS, потому что хочу только сообщить о ПЕРВОЙ соответствующей ошибке, поэтому я переназначаю функцию onerror на ничто после того, как появляется настоящая ошибка. Это также предотвращает ошибки, которые происходят в циклах, от удаления моего сервера ,
Майк Шеров
3

У меня была похожая проблема: мои сценарии обслуживаются поддоменом и подпадают под то же ограничение происхождения. Однако я решил это следующим образом:

1) добавление каждого тега скрипта следующим образом:

<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />

2) изменить apache httpd.conf, добавив в каждый vhost следующее (вы должны включить mod_headers):

<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*.mydomain.tld"
</IfModule>

Надеюсь это поможет ...

РЕДАКТИРОВАТЬ

На одном из моих серверов я не смог сделать этот функционал, кроме как заменив

*.mydomain.tld

по

*

Помните о недостатках, которые могут позволить * фишировать расширенную информацию. Доступна документация по CORS, одинакового происхождения, img & fonts, cdn, но доступно очень мало подробностей о происхождении тега скрипта.

Спутник
источник
1
«* .mydomain.tld» не является допустимым значением для атрибута crossorigin developer.mozilla.org/en-US/docs/Web/HTML/…
icenac
1

В Chrome я также получаю «Ошибка скрипта» (в строке 0) при загрузке как HTML, так и Javascript из file://. Этого не происходит в Firefox. Вероятно, чрезмерно усердная защита Chrome того же происхождения.

Все хорошо при загрузке того же HTML и Javascript через HTTP.

Мирн Стол
источник
1

Как насчет ниже. Ошибка сценария недоступна через 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;
};
Ронни Ройстон
источник
как вы регистрируете это на карме?
CommonSenseCode
Вы говорите, что в консоли браузера есть детали, а в onerror нет?
Майкл
0

И Chrome, и Firefox на iOS основаны на веб-представлении Safari, но вставляют несколько пользовательских сценариев в каждую загруженную страницу. Если в каком-либо из этих сценариев что-то идет не так, о нем также сообщается Script error on line 0. (Скрипты, вставленные в браузер, также считаются перекрестными источниками)

Как я обнаружил и задокументировал в этом другом SO-потоке, у Chrome и Firefox на iOS есть проблемы в своих пользовательских скриптах, корректно обрабатывающих элементы SVG. Итак, в дополнение ко всем остальным ответам в этой теме: если вы используете SVG-элементы и <a>теги внутри <svg>тегов на своей странице, это приведет к Script errorsтому , что о них будет сообщено в iOS Chrome и iOS Firefox.

Ласло Корте
источник
-1

Я расскажу вам, что это исправило для меня в Safari (WebKit): если я на самом деле помещу процедуру обратного вызова JS на страницу , то получу полную информацию. Если я включаю его в файл .js через тег, я просто получаю сообщение об ошибке «Ошибка скрипта» (без номера белья и т. Д.).

Может быть, это связано с тем, что сказал Бруфа.

Итак, теперь у меня есть небольшой обратный вызов на странице, а затем остальная часть файла за пределами страницы.

kbern
источник
-2

Я провел небольшой поиск, и кажется, что «Ошибка скрипта» означает, что у него возникли проблемы с загрузкой файла, который его попросили найти. Это может быть проблема с кэшированием на стороне клиента или проблема с сервером из-за перегрузки.

Скорее всего, это вызвано чем-то вроде этого, где сам скрипт - это файл, который он не может загрузить, поэтому ошибка в строке 0.

<script type="text/javascript" src="somescript.js"></script>
Ник Брант
источник
Хорошая мысль, но мы явно игнорируем, когда скрипт не загружается. Мы обнаружили эту ошибку специально и игнорируем ее.
Майк Шеров
1
Как вы обнаружили, когда скрипт не загружается? Я помню, что однажды у меня были проблемы с этим. script.onerrorне был уволен за отсутствующие скрипты в некоторых браузерах.
Чарли Килиан
"Ошибка источника." (little-e) появляется в обоих источниках: webkit и FF. Смотрите мой ответ выше. FWIW.
Брооф
-3

Я испытал

Ошибка сценария. строка 0

сообщения об ошибках в течение некоторого времени возвращаются на наш сервер, когда ошибка возникла в клиентских браузерах. Вчера впервые (после представления "use strict";в нашем javascript) я смог повторить эту проблему в Safari и Chrome на Windows 7. После засорения нашего кода с помощью операторов alert () я отследил эту ошибку до использования неопределенной переменной! например, xx = 123;где xx не определен с varоператором.

Safari сообщил об этом как

ReferenceError: Строгий режим запрещает неявное создание глобального свойства 'xx'

в веб-инспекторе, но обнаруживалась функция window.onerror

Ошибка сценария. строка 0

Блуждающий зомби
источник
-11

Grepping исходный код Firefox показывает, что нет "Script Error.". Таким образом, очень вероятно, что какой-то скрипт на вашем сайте выдает неперехваченную ошибку, подобную этой:

throw new Error('Script Error.');

Вероятно, это утверждение достигается только в Firefox и Chrome.

Не уверен, почему нет номера строки, хотя. Может быть, какая-то eval()проблема?

user123444555621
источник
1
Я пытался бросить это именно так, как вы рекомендовали. Он не сообщает «Ошибка скрипта». Он сообщает «Брошенное исключение не обнаружено: ошибка сценария». Хорошая мысль, хотя.
Майк Шеров
Это также может быть одно из расширений, установленных пользователем, которое вызывает ошибку.
Чарли Килиан
1
Ни за что. Вы увидите «Ошибка сценария» во всем Интернете, если вы посмотрите на правильные страницы.
Амальговинус
2
Нет Это на самом деле «Ошибка скрипта». с маленьким «е». Вот почему я не нашел его в исходном коде.
user123444555621