Криптична "Помилка сценарію". повідомляється у Javascript у Chrome та Firefox


199

У мене є скрипт, який виявляє помилки Javascript на моєму веб-сайті та надсилає їх до мого бекенда для звітування. Він повідомляє про першу виниклу помилку, передбачуваний номер рядка та час.

EDIT для включення доктрипу:

<!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, через що можуть виникнути помилки сценарію.
Джеймс

Я вдячний за допомогу ... Додано вчення: XHTML. Крім того, це відбувається лише на 0,25% завантаженості сторінок ... Я думаю, що це щось більш екзотичне.
Майк Шеров

3
@jayp: Просто згадую. XHTML doctype все ще залишає 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
Ви ігноруєте помилку завантаження помилок сценарію. Чому? Чи безпечно їх ігнорувати?
rampr

Відповіді:


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 так само, як і ті ж джерела. (І Opera не підтримує onerror.)

З вуст коней: джерело WebKit, яке перевіряє походження при передачі винятків onerror (). І джерело Firefox, яке перевіряє .

ОНОВЛЕННЯ (21.10.11) : Помилка Firefox, яка відстежує цю проблему, містить посилання на допис у блозі, який надихнув на цю поведінку.

ОНОВЛЕННЯ (12.12.14) : Тепер ви можете ввімкнути повне звітування про помилки між доменами в деяких браузерах, вказавши crossoriginатрибут тегів сценарію та змусивши сервер надсилати відповідні заголовки відповідей CORS HTTP.


3
Дякую за це Я хотів би трохи уточнити. Я бачу докладні повідомлення про помилки зі сценаріїв, які я постійно включаю на свою сторінку. Наприклад, якщо я включаю jQuery з cdn google і використовую його для маніпулювання неіснуючим елементом на своїй сторінці, я отримую onerror, який вказує на CDN google. Ви кажете, що "Помилка сценарію". відбувається тому, що віддалений скрипт кидає виняток?
Майк Шеров

150
Ви могли б подумати, що хтось мав би сенс сказати "Віддалений сценарій видав помилку, приховану через політику того самого походження", а не залишати вас цікаво, що пішло не так, так? ...
Роман Старков

3
@broofa Чи означає це, що я стану кращим, крім, якщо я розміщую jquery у своєму домені, а не використовую CDN Google?
Пол Біггар

6
Невелике оновлення. Це також відбувається локально, коли сторінка завантажується через файл: // і сценарій запускається через eval (). Незначні випадки використання, але все ж :)
Віллем Малдер

6
Після деякого розслідування я помітив, що Script Error.відбувається також, якщо користувач встановив розширення Safari (можливо, те саме для Firefox Plug-Ins), яке вводить код JavaScript з помилками
Alex Hoppen

49

Оновлення для тих, хто в майбутньому натрапить на це запитання: broofa вірно відповідає і відповіді для цього немає.

Очевидно, що інші натрапили на це обмеження, і деякі помилки, що вимагають виправлення, були подані для Firefox: Bug 69301 та для WebKit: Bug 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');

Я перевірив це, і він працює, як очікувалося. всі помилки з script.js будуть виявлені window.onerrorобробником з деталями повідомлення, файлів та рядків.

Помилка WebKit ще не виправлена, але запропоновано виправлення (і використовує те саме рішення). Сподіваємось, виправлення буде випущено незабаром.

Більше інформації про CORS тут: http://enable-cors.org/


2
Гарне резюме: blog.errorception.com/2012/12 / ...
Сем

1
Повторно веб-сайт. Якщо ви маєте на увазі саме цей, схоже, це вирішено зараз: 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, щоб спробувати розібратися.

Я досі не впевнений, що викликає "помилку сценарію". (з періодом BTW, саме так відображається в нашому реєстраторі 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 речі (наскільки ми знаємо, можливо більше?):

а) Вимкніть панель перекладу, щоб не з’являлася в Chrome.

b) Вимкнути переклад сторінки через translate.google.com.

У нашій ситуації все одно це вирішило ТОН цих "помилок сценарію". проблеми, з якими ми стикалися.

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

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


4
Пряма причина, ймовірно, в тому, що сценарій перекладача був запущений з іншого домену, а не веб-сторінки, і onerror(принаймні, у Firefox) просто сказано "Помилка сценарію" в такому випадку.
Тгр

10

Через низький% ви можете припустити, що вони не звичайні користувачі. Можливо, користувачі, які користуються сценаріями користувачів, закладками або навіть, можливо, просто возиться з консоллю на вашому веб-сайті. Наявність цілого HTML сторінки, де це відбувається, може допомогти перевірити цю теорію. А також повна помилка. Це має дати вам URL-адресу, чи завжди це однаково? Чи дійсно рядок 0 або просто невизначений?

Я не думаю, що встановлення значень за замовчуванням у вас onerror є гарною ідеєю, і 0, ймовірно, виникає, parseInt(ln || 0)коли помилка насправді не на сторінці (див. Приклади вище).

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

=== EDIT === Перейшов до: http://www.xavierm02.net/AZE/ Встановити файл user.js (я це зробив у Chrome, але він також повинен працювати і на Firefox). Потім відкрийте сторінку HTML у тому ж браузері. Він покаже вам помилку (я змінив лише те видалення звіту на сервер, він пише це на сторінці). З номером рядка 0.


URL рівномірно розподіляється серед сторінок мого сайту. Я також здогадуюсь закладки або навіть розширення чи теми, враховуючи, що це FF та хром. Однак я хотів би мати можливість спростувати це повідомлення про помилку, перш ніж безпечно ігнорувати його.
Майк Шеров

Замініть рядок (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());і ви, ймовірно, не побачите URL-адреси (оскільки це розширення або щось місцеве, щоб браузер не показував вас) і номер рядка.
xavierm02

І btw, вам слід скористатися міткою часу з вашим сервером, а не з JS (і навіть, можливо, просто отримати версію замість часової мітки).
xavierm02

1
Насправді, JS повинен просто надсилати необроблені дані, а PHP повинен піклуватися про ігнорування помилок завантаження тощо.
xavierm02

Я виконую деяку обробку на стороні JS, тому що хочу лише повідомити ПЕРШУ відповідну помилку, тому я перепризначую функцію onerror назад ні до чого після появи справжньої помилки. Це також запобігає помилкам, що трапляються в циклі, від ddos'ing мого сервера .
Майк Шеров

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>

Сподіваюся, це допомагає ...

EDIT

На одному з моїх серверів я не зміг зробити цей функціонал за винятком заміни

*.mydomain.tld

від

*

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


1
"* .mydomain.tld" не є дійсним значенням для атрибута crossorigin developer.mozilla.org/en-US/docs/Web/HTML/…
icenac

1

У Chrome я також отримую "Script error" (у рядку 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-файл через тег, я просто отримаю помилку "Помилка сценарію" (без лінописного номера тощо).

Можливо, це пов’язано з тим, що сказав Брофа.

Anwyay, тому зараз у мене невеликий зворотний дзвінок на сторінці, а потім решта файлу поза сторінкою.


-2

Я трохи пошукав, і виявляється, що "помилка скрипта" означає, що у неї виникли проблеми з завантаженням файлу, який його попросили шукати. Це може бути проблема кешування на стороні клієнта, або це може бути проблема із сервером через перевантаження.

Це, швидше за все, викликано чимось подібним, коли сам сценарій - це файл, який він не може завантажити, отже, помилка, що виникає в рядку 0.

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

Хороша думка, але ми явно ігноруємо, коли сценарій не завантажується. Ми виявили цю помилку спеціально і ігноруємо її.
Майк Шеров

1
Як ви виявили, коли сценарій не завантажується? Я пам’ятаю, що в цей момент виникли проблеми з цим. script.onerrorне було звільнено за відсутні сценарії в деяких браузерах.
Чарлі Кіліан

"Помилка джерела." (little-e) з'являється в джерелах веб-файлів та FF. Дивіться мою відповідь вище. виганяти.
брофа

-3

Я пережив

Помилка сценарію рядок 0

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

Сафарі повідомив про це як

ReferenceError: Суворий режим забороняє неявне створення глобальної властивості 'xx'

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

Помилка сценарію рядок 0


-11

Очікуючи вихідний код Firefox виявляє, що немає "Script Error.". Таким чином, велика ймовірність, що якийсь скрипт на вашому веб-сайті видає помилку, що не сприймається так:

throw new Error('Script Error.');

Ймовірно, це твердження досягається лише у Firefox та Chrome.

Не впевнений, чому немає номера рядка. Може, якесь eval()питання?


1
Я намагався кинути це саме так, як ви рекомендували. Він не повідомляє "Помилка сценарію." Він повідомляє, що "Викинуте виняток не спіймано: помилка сценарію". Хороша думка, хоча.
Майк Шеров

Також це може бути одне з розширень, встановлених користувачем, що викликає помилку.
Чарлі Кіліан

1
У жодному разі. "Помилка сценарію" ви побачите в усьому Інтернеті, якщо подивитеся на правильні дошки.
Амальговінус

2
Ні, ні. Це насправді "Помилка сценарію". з невеликим «е». Тому я його не знайшов у вихідному коді.
користувач123444555621
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.