Загадочная " Ошибка Скрипта."сообщается в 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 183

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