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;
};
Ответ 9
Хорошая статья, которая, наконец, указывает на эту тему. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
Ответ 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()
?