Mam skrypt, który wykrywa błędy Javascript w mojej witrynie i wysyła je do zaplecza w celu zgłoszenia. Podaje pierwszy napotkany błąd, przypuszczalny numer linii i godzinę.
EDYCJA, aby dołączyć 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>
Z powodu tego skryptu jestem w pełni świadomy wszelkich błędów javascript, które występują w mojej witrynie. Jednym z największych przestępców jest „Błąd skryptu”. w linii 0. w Chrome 10+ i Firefox 3+. Ten błąd nie istnieje (lub może być nazywany czymś innym?) W Internet Explorerze.
Korekta (23.05.2013): Ten błąd „Błąd skryptu, wiersz 0” jest teraz wyświetlany w IE7 i prawdopodobnie w innych wersjach IE. Prawdopodobnie wynik niedawnej poprawki zabezpieczeń IE, ponieważ takie zachowanie wcześniej nie istniało.
Czy ktoś ma pojęcie, co oznacza ten błąd lub co go powoduje? Zdarza się to w około 0,25% moich wszystkich ładowań stron i stanowi połowę zgłoszonych błędów.
źródło
application/xhtml+xml
aby uruchomić ją w parserze XHTML (jak mówi specyfikacja XHTML). Istnieje wiele treści, które podają się za XHTML, ale wysyłają normalny typ HTML. Z powodu tego, w jaki sposób twórcy treści używają niepoprawnie XHTML, przeglądarki zdecydowały się używać parsera XML tylkoapplication/xhtml+xml
(jest to naprawdę ścisły parser). Hixie.ch/advocacy/xhtml i webdevout.net/articles/beware-of-xhtml mówi dlaczego nie używać HTML parser z XHTML.Odpowiedzi:
„Błąd skryptu”. zdarza się w Firefox, Safari i Chrome, gdy wyjątek narusza zasady tego samego pochodzenia przeglądarki - tj. gdy błąd występuje w skrypcie hostowanym w domenie innej niż domena bieżącej strony.
Takie zachowanie jest celowe, aby zapobiec wyciekaniu przez skrypty informacji do domen zewnętrznych. Na przykład, dlaczego jest to konieczne, wyobraź sobie przypadkowe odwiedziny
evilsite.com
, na których wyświetla się strona<script src="yourbank.com/index.html">
. (tak, wskazujemy ten skrypt na HTML, a nie JS). Spowoduje to błąd skryptu, ale błąd jest interesujący, ponieważ może nam powiedzieć, czy jesteś zalogowany, czy nie. Jeśli jesteś zalogowany, może to oznaczać błąd'Welcome Fred...' is undefined
, a jeśli nie, to może być'Please Login ...' is undefined
. Coś w tym stylu.Jeśli evilsite.com robi to dla około 20 najlepszych instytucji bankowych, mieliby całkiem niezłe pojęcie o tym, które witryny bankowe odwiedzasz, i mogłyby zapewnić znacznie bardziej ukierunkowaną stronę phishingową. (To oczywiście tylko jeden przykład. Ale ilustruje, dlaczego przeglądarki nie powinny zezwalać żadnym danym na przekraczanie granic domen.)
Przetestowałem to w najnowszych wersjach Safari, Chrome i Firefox - wszystkie to robią. IE9 nie - traktuje wyjątki pochodzenia x tak samo jak wyjątki tego samego pochodzenia. (A Opera nie obsługuje onerror.)
Z ust koni: źródło WebKit, które sprawdza pochodzenie , przekazując wyjątki do onerror (). I źródło Firefox, które sprawdza .
AKTUALIZACJA (21.10.11) : Błąd Firefoksa, który śledzi ten problem, zawiera link do postu na blogu, który zainspirował to zachowanie.
AKTUALIZACJA (12/2/14) : Możesz teraz włączyć pełne raportowanie błędów między domenami w niektórych przeglądarkach, określając
crossorigin
atrybut znaczników skryptu i wysyłając przez serwer odpowiednie nagłówki odpowiedzi CORS HTTP.źródło
Script Error.
zdarza się również wtedy, gdy użytkownik zainstalował rozszerzenie Safari (prawdopodobnie takie samo dla wtyczek Firefox), które wstrzykuje kod JavaScript z błędamiAktualizacja dla tych, którzy napotkają to pytanie w przyszłości: Broofa ma rację z odpowiedzią i nie ma na to obejścia.
Oczywiście inne natknęły się na to ograniczenie i niektóre błędy wymagające poprawki zostały zgłoszone do przeglądarki Firefox: Bug 69301 i WebKit: Bug 70574
Dobrą wiadomością jest to, że błąd został rozwiązany w Firefoksie wraz z wydaniem Firefoksa 13. Oto jak go wykorzystujesz:
crossorigin
jest równoważnecrossorigin=anonymous
i nakazuje przeglądarce wykonanie skryptu przez CORS bez wysyłania poświadczeń.Musisz upewnić się, że skrypt jest wysyłany z
Access-Control-Allow-Origin
wartością nagłówka HTTP pasującą do domeny żądającej, np.w przeciwnym razie przeglądarka anuluje ładowanie skryptu .
W przypadku Apache:
(I zobacz przykłady CORS dla innych serwerów sieciowych ).
Jeśli wysyłasz skrypty w PHP:
Przetestowałem to i działa zgodnie z oczekiwaniami. wszystkie błędy z script.js zostaną przechwycone przez
window.onerror
moduł obsługi ze szczegółami komunikatu, pliku i wiersza.Błąd WebKit nie został jeszcze naprawiony, ale zaproponowano łatkę (i używa tego samego rozwiązania). Mamy nadzieję, że poprawka zostanie wkrótce wydana.
Więcej informacji o CORS tutaj: http://enable-cors.org/
źródło
To zajęło sporo czasu.
Zrobiliśmy wiele rzeczy, aby spróbować to rozwiązać, w tym takie rzeczy, jak zrzut Całą dokumentację z powrotem na nasze serwery za pośrednictwem Ajax, aby spróbować ją rozwiązać.
Nadal nie jestem pewien, co powoduje „Błąd skryptu”. (z okresem BTW, tak to pokazuje się w naszym rejestratorze Ajax) w Firefox, ale w Chrome mogliśmy zawęzić go do ...
Werble...
Funkcja automatycznego tłumaczenia w Google Chrome.
Wiele osób mówiących po angielsku prawdopodobnie nawet nie wie o tej funkcji, ale aby ją przetestować, myślę, że odwiedzam witrynę w języku innym niż angielski za pomocą Chrome. Lub jeszcze lepiej, jeśli przejrzysz opcje Chrome, możesz zmienić język przeglądarki. Zmień to na coś innego niż angielski, uruchom ponownie przeglądarkę i odwiedź witrynę w języku angielskim.
Na górze powinien pojawić się pasek z pytaniem, czy chcesz, aby Chrome przetłumaczył stronę za Ciebie.
W naszym przypadku i tak przyczyną problemu był tłumacz, który wstrzykuje znacznik skryptu do treści dokumentu i (zgadując tutaj) używa jakiegoś systemu opartego na JS do wysyłania treści na serwery Google i zmuszania ich do przetłumaczenia.
Mimo że błąd w konsoli był niepowiązany, komunikat wysyłany do window.onerror brzmiał „Błąd skryptu”.
W każdym razie istnieje lekarstwo.
http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html
To zrobi 2 rzeczy (o ile wiemy, może więcej?):
a) Wyłącz pasek tłumaczeń, aby pojawiał się w Chrome.
b) Wyłącz tłumaczenie strony za pośrednictwem translate.google.com.
W naszej sytuacji rozwiązało to TONĘ tych „błędów skryptu”. problemy, które mieliśmy.
Przepraszam za błędy ortograficzne w tym poście, wciąż piszę w Chrome w trybie innym niż angielski, a moduł sprawdzania pisowni nie jest ustawiony na angielski;) Czas na powrót.
Cieszyć się!
źródło
onerror
(przynajmniej w Firefox) po prostu mówi „błąd skryptu” w takim przypadku.Ze względu na niski% możesz założyć, że nie są zwykłymi użytkownikami. Prawdopodobnie użytkownicy mają skrypty użytkownika, skryptozakładki, a nawet po prostu majstrują przy konsoli w Twojej witrynie. Posiadanie całego kodu HTML strony, na której to się dzieje, może pomóc w testowaniu tej teorii. Jak również całkowity błąd. Powinien dać ci adres URL, czy zawsze jest taki sam? Czy linia jest naprawdę 0 czy tylko niezdefiniowana?
Nie sądzę, aby ustawienie wartości domyślnych w tobie było dobrym pomysłem, a 0 prawdopodobnie pochodzi z
parseInt(ln || 0)
sytuacji, gdy błędu tak naprawdę nie ma na stronie (patrz przykłady powyżej).Dodanie if, aby sprawdzić, czy wiersz jest znany w JavaScript, aby zignorować te błędy (ponieważ prawdopodobnie nie pochodzą one z twojego kodu) lub w kodzie po stronie serwera, aby zająć się nimi osobno, byłoby, imo, lepiej .
=== EDYCJA === Muszę: http://www.xavierm02.net/AZE/ Zainstalować plik user.js (Zrobiłem to w Chrome, ale powinien również działać w Firefoksie). Następnie otwórz stronę HTML w tej samej przeglądarce. Pokaże ci błąd (zmieniłem tylko tę instancję raportowania do serwera, zapisuje to na stronie). Z 0 jako numer linii.
źródło
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());
a prawdopodobnie nie zobaczysz adresu URL (ponieważ jest to rozszerzenie lub coś lokalnego, więc przeglądarka Cię nie wyświetla) i numeru linii.Miałem podobny problem: moje skrypty są obsługiwane przez subdomenę i podlegają temu samemu ograniczeniu pochodzenia. Rozwiązałem to jednak poprzez:
1) dodając każdy tag skryptu w ten sposób:
2) modyfikowanie httpd.conf apache przez dodanie następujących elementów w każdym vhostie (musisz włączyć mod_headers):
Mam nadzieję że to pomoże ...
EDYTOWAĆ
Na jednym z moich serwerów nie byłem w stanie uczynić tego funkcjonalnym inaczej niż przez wymianę
przez
Bądź świadomy wad, które potencjalnie pozwalają * na wyłudzanie informacji rozszerzonych. Dokumentacja na temat CORS, tego samego pochodzenia, img i czcionek, cdn jest dostępna, ale jest bardzo mało na temat szczegółów crossorigin tagów skryptowych.
źródło
W Chrome pojawia się również „Błąd skryptu” (w wierszu 0) podczas ładowania zarówno HTML, jak i Javascript
file://
. Nie dzieje się tak w przeglądarce Firefox. Prawdopodobnie nadgorliwa ochrona tego samego pochodzenia Chrome.Wszystko jest dobrze, gdy ładujesz ten sam HTML i JavaScript przez HTTP.
źródło
Co powiesz na to poniżej? Błąd skryptu nie jest dostępny przez JavaScript, więc po prostu wyizoluj tę konkretną sprawę i postępuj z nią jak najlepiej.
źródło
Dobry artykuł, który w końcu wskazuje na ten wątek. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
źródło
Zarówno Chrome, jak i Firefox na iOS są oparte na przeglądarce Safari Webview, ale wstaw kilka niestandardowych skryptów do każdej ładowanej strony. Jeśli w którymkolwiek z tych skryptów coś pójdzie nie tak, zostanie również zgłoszone s
Script error on line 0
. (Skrypty wstawione do przeglądarki są również liczone jako cross origin)Jak już wyśledziłem i udokumentowałem w tym innym wątku SO, zarówno Chrome, jak i Firefox na iOS mają problemy ze swoimi niestandardowymi skryptami poprawnie obsługującymi elementy SVG. Oprócz wszystkich innych odpowiedzi w tym wątku: jeśli używasz elementów SVG i
<a>
tagów wewnątrz<svg>
tagów na swojej stronie, spowodujeScript errors
to zgłoszenie w iOS Chrome i iOS Firefox.źródło
Powiem ci, co to naprawiło dla mnie w Safari (WebKit): Jeśli umieszczę procedurę wywołania zwrotnego JS na stronie , to otrzymam pełne informacje. Jeśli dołączę go do pliku .js za pomocą tagu, po prostu pojawia się błąd „Błąd skryptu” (bez numeru bielizny itp.).
Może ma to związek z tym, co powiedział Broofa.
Anwyay, więc teraz mam małe oddzwanianie na stronie, a następnie resztę pliku poza stroną.
źródło
Przeprowadziłem trochę wyszukiwania i wygląda na to, że „Błąd skryptu” oznacza, że miał problem z załadowaniem pliku, o którego wyszukanie został poproszony. Może to być problem z buforowaniem po stronie klienta lub może to być problem z serwerem z powodu przeciążenia.
Najprawdopodobniej jest to spowodowane tym, że sam skrypt jest plikiem, którego nie można załadować, stąd błąd występujący w linii 0.
źródło
script.onerror
nie został zwolniony z powodu brakujących skryptów w niektórych przeglądarkach.Doświadczyłem
Błąd skryptu. wiersz 0
błędy przez pewien czas są zgłaszane z powrotem do naszego serwera, gdy wystąpił błąd w przeglądarkach klientów. Wczoraj po raz pierwszy (po wprowadzeniu
"use strict";
w naszym javascript) mogłem replikować ten problem w Safari i Chrome na Windows 7. Po zaśmieceniu naszego kodu instrukcjami alert () prześledziłem ten błąd aż do użycia niezdefiniowanej zmiennej! np.xx = 123;
gdzie xx nie jest zdefiniowane za pomocąvar
instrukcji.Safari zgłosiło to jako
ReferenceError: Tryb ścisły zabrania niejawnego tworzenia właściwości globalnej „xx”
w programie Web Inspector, ale wykrywała funkcję window.onerror
Błąd skryptu. wiersz 0
źródło
Grepping kodu źródłowego Firefoksa ujawnia, że nie ma
"Script Error."
. Dlatego bardzo prawdopodobne jest, że jakiś skrypt w Twojej witrynie zgłasza taki błąd:Prawdopodobnie to stwierdzenie jest dostępne tylko w Firefox i Chrome.
Nie jestem pewien, dlaczego nie ma numeru linii. Może jakiś
eval()
problem?źródło