Cryptic "Script Ошибка." сообщается в Javascript в Chrome и Firefox

У меня есть script, который обнаруживает ошибки Javascript на моем веб-сайте и отправляет их на мой бэкэнд для отчетности. В нем сообщается первая ошибка, предполагаемый номер строки и время.

EDIT включить 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>

Из-за этого script я остро знаю любые ошибки JavaScript, которые происходят на моем сайте. Один из самых крупных нарушителей: "Script Ошибка". в строке 0. в Chrome 10+ и Firefox 3+. Эта ошибка не существует (или может быть вызвана чем-то еще?) В Internet Explorer.

Исправление (5/23/2013): Эта ошибка Script Ошибка, строка 0 "теперь отображается в IE7 и, возможно, в других версиях IE. Возможно, это результат недавнего обновления безопасности IE, поскольку этого ранее не было.

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

Ответ 1

Ошибка "Script". происходит в Firefox, Safari и Chrome, когда исключение нарушает браузер политика одного и того же происхождения - то есть, когда ошибка возникает в script, которая размещена в домене, отличном от домена текущей страницы.

Это поведение является преднамеренным, предотвращая утечку информации из внешних доменов. Для примера, почему это необходимо, представьте себе случайное посещение evilsite.com, которое обслуживает страницу с <script src="yourbank.com/index.html">. (да, мы указываем, что тег script в html, а не JS). Это приведет к ошибке script, но ошибка интересна тем, что она может сообщить нам, если вы вошли в систему или нет. Если вы вошли в систему, ошибка может быть 'Welcome Fred...' is undefined, тогда как если бы вы не могли быть 'Please Login ...' is undefined. Что-то в этом роде.

Если evilsite.com сделает это для топ-20 банковских учреждений, у них будет неплохая идея о том, какие банковские сайты вы посещаете, и может предоставить гораздо более целенаправленную фишинговую страницу. (Это, конечно, только один пример, но он иллюстрирует, почему браузеру не разрешается передавать какие-либо данные через границы домена.)

Я тестировал это в последних версиях Safari, Chrome и Firefox - все это делают. В IE9 нет - он рассматривает исключения х-происхождения как те же самые. (И Opera не поддерживает атеррор.)

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

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

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

Ответ 2

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

Очевидно, что другие наткнулись на это ограничение, и некоторые ошибки, требующие исправления, были отправлены для Firefox: Ошибка 69301 и для WebKit: Ошибка 70574

Хорошей новостью является то, что ошибка была решена для Firefox с выпуском Firefox 13. Вот как вы его используете:

<script src="http://somremotesite.example/script.js" crossorigin>

crossorigin эквивалентен crossorigin=anonymous и сообщает браузеру сделать выборку CORS script без отправки учетных данных.

Вы должны убедиться, что script отправлен с значком заголовка Access-Control-Allow-Origin HTTP, который соответствует запрашивающему домену, например,

Access-Control-Allow-Origin: http://myhomesite.example
Access-Control-Allow-Origin: *

, иначе браузер отменит загрузку script.

Для Apache:

Header set Access-Control-Allow-Origin "*"

(И посмотрите примеры CORS для других веб-серверов.)

Если вы отправляете скрипты в PHP:

header('Access-Control-Allow-Origin', 'http://myhomesite.example');

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

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

Подробнее о CORS здесь: http://enable-cors.org/

Ответ 3

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

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

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

Рулон барабанов...

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

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

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

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

Несмотря на то, что ошибка в консоли была не найдена, сообщение, отправленное в window.onerror, было "Script Ошибка.".

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

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

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

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

a) Отключите панель перевода от Chrome в Chrome.

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

В нашей ситуации, в любом случае, это разрешило A TON этих ошибок < Script. которые мы испытывали.

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

<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

по

*

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

Ответ 6

Я решил исправить эту проблему.

Я создал Hermes.js, который является системой ошибок журнала, которая имела такую ​​же проблему.

После изучения некоторого времени я сделал исправление, которое может помочь вам в междоменной политике "Script Ошибка" о скриптах в разных доменах.

Я позвонил в CORSET, и вы можете увидеть здесь, как это работает.

Ответ 7

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

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

Ответ 8

Как насчет ниже. Ошибка script недоступна с помощью 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;
};

Ответ 10

Я расскажу вам, что исправил его для меня в Safari (WebKit): Если я наложу JS-процедуру обратного вызова на страницу, тогда я получу полную информацию. Если я включу его в файл .js через тег, я просто получаю ошибку "Script" (без линея и т.д.).

Возможно, это связано с тем, что сказал Брофа.

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

Ответ 11

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

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

Ответ 12

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

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

<script type="text/javascript" src="somescript.js"></script>

Ответ 13

Я испытал

Script Ошибка. строка 0

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

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

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

внутри Web Inspector, но функция window.onerror обнаруживала

Script Ошибка. строка 0

Ответ 14

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

throw new Error('Script Error.');

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

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