Загадочные "Ошибка Сценария."сообщается в 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% от моего общего pageloads, и представляет собой половину ошибки.

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-origin так же, как и те же самые. (И Opera не поддерживает onerror.)

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

обновление (10/21/11): элемент Firefox ошибка, которая отслеживает эту проблему включает ссылку на сообщение в блоге, которое вдохновило это поведение.

обновление (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 "*"

(и см. примеры 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 и заставить их перевести его.

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

= = = EDIT === Добраться: http://www.xavierm02.net/AZE/ Установите пользователя.JS-файл (я сделал это в Chrome, но он должен работать и в Firefox). Затем откройте HTML-страницу на тот же браузер. Он покажет вам ошибку (я только изменил этот insteal отчетов на сервер, он пишет его на странице). С 0 в качестве номера строки.


у меня была аналогичная проблема: мои скрипты обслуживаются поддоменом и подпадают под то же ограничение origin. Тем не менее, я решил это:

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>

надеюсь, что это помогает ...

редактировать

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

*.mydomain.tld

by

*

имейте в виду недостатки с потенциально позволяя * Фиш расширенной информации. Документация по CORS, same-origin, img & fonts, 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-файл через тег, я просто получаю ошибку" ошибка скрипта " (без номера строки и т. д.).

может быть, это связано с тем, что сказал Broofa.

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() вопрос?