Şifreli "Komut Dosyası Hatası." Chrome ve Firefox'ta Javascript'te bildirildi


201

Web sitemde Javascript hatalarını tespit eden ve bunları raporlama için arka ucuma gönderen bir komut dosyası var. Karşılaşılan ilk hatayı, varsayılan satır numarasını ve saati bildirir.

Dokümanı dahil etmek için DÜZENLE:

<!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>

Bu komut dosyası nedeniyle, sitemde meydana gelen javascript hatalarının farkındayım. En büyük suçlulardan biri "Script Hatası" dır. Chrome 10+ ve Firefox 3+ sürümlerinde 0 satırında . Internet Explorer'da bu hata yok (veya başka bir şey olarak adlandırılabilir mi?).

Düzeltme (23.05.2013): Bu "Komut Dosyası Hatası, Satır 0" hatası şimdi IE7'de ve muhtemelen IE'nin diğer sürümlerinde gösteriliyor. Muhtemelen, bu davranış daha önce mevcut olmadığından son zamanlarda yapılan IE güvenlik düzeltme ekinin bir sonucudur.

Bu hatanın ne anlama geldiği veya neye sebep olduğu hakkında bir fikri olan var mı? Genel sayfa yüklerimin yaklaşık% 0.25'inde olur ve bildirilen hataların yarısını temsil eder.


Doktrin nedir? Bir XHTML dokümanı bildirmiyorsanız, CDATA'ya ihtiyacınız yoktur, bu yüzden komut dosyası hataları olabilir.
James

Yardımı takdir ediyorum ... XHTML dokümanı eklendi. Yine de, sayfa yüklerinin yalnızca% 0,25'inde oluyor ... Bunun daha egzotik bir şey olduğunu düşünürdüm.
Mike Sherov

3
@jayp: Sadece bahsediyoruz. XHTML dokümanı hala HTML ayrıştırıcısıdır. İçeriği application/xhtml+xmlXHTML ayrıştırıcısında çalışacak şekilde göndermeniz gerekir (XHTML belirtiminde belirtildiği gibi). XHTML olduğunu iddia eden, ancak normal HTML doküman türünü gönderen çok fazla içerik var. İçerik oluşturucuların XHTML'yi ne kadar yanlış kullandığından, tarayıcılar yalnızca XML ayrıştırıcısını kullanmaya karar verdi application/xhtml+xml(gerçekten katı ayrıştırıcı). Hixie.ch/advocacy/xhtml ve webdevout.net/articles/beware-of-xhtml XHTML HTML ayrıştırıcı kullanmayın neden söylüyor.
Konrad Borowski

11
Ah ... Tanrının sevgisi için, bunu okuyan herkes, lütfen hata mesajlarınızın tam olarak neyin yanlış gittiğini açıklamasını sağlayın ! Kendinizi yazmak için 30 saniyelik çabadan tasarruf ederek, dünya insan yıllarını boşa harcıyorsunuz!
Roman Starkov

1
Komut Dosyası Hataları Yükleme Hatası yoksayıyorsunuz. Neden? Görmezden gelmek güvenli mi?
rampr

Yanıtlar:


263

"Komut dosyası hatası." Firefox, Safari ve Chrome'da tarayıcının aynı menşei politikasını ihlal ettiğinde (yani, geçerli sayfanın alan adından farklı bir alanda barındırılan bir komut dosyasında hata oluştuğunda) gerçekleşir.

Bu davranış, komut dosyalarının dış etki alanlarına bilgi sızdırmasını önlemek için kasıtlıdır. Bunun neden gerekli olduğuna dair bir örnek için, yanlışlıkla evilsite.combir sayfayı ziyaret ettiğini düşünün <script src="yourbank.com/index.html">. (evet, komut dosyası etiketini JS yerine html'de gösteriyoruz). Bu bir komut dosyası hatasına neden olur, ancak giriş ilginç olup olmadığını bize söyleyebileceğinden hata ilginçtir. Oturum açtıysanız hata olabilir 'Welcome Fred...' is undefined, oysa girilmeyebilir 'Please Login ...' is undefined. Bu çizgiler boyunca bir şey.

Evilsite.com bunu en iyi 20 banka kuruluşu için yaparsa, hangi bankacılık sitelerini ziyaret ettiğiniz hakkında oldukça iyi bir fikirleri olur ve çok daha hedefli bir kimlik avı sayfası sağlayabilir. (Bu elbette sadece bir örnektir. Ancak tarayıcıların neden herhangi bir verinin etki alanı sınırlarını aşmasına izin vermemesi gerektiğini gösterir .)

Bunu Safari, Chrome ve Firefox'un en son sürümlerinde test ettim - hepsi bunu yapıyor. IE9 yapmaz - x kaynaklı istisnaları aynı kökenli olanlarla aynı şekilde ele alır. (Ve Opera hata vermiyor.)

Atların ağzından: Bir istisnayı onerror () öğesine iletirken kökeni kontrol eden WebKit kaynağı . Ve kontrol eden Firefox kaynağı .

GÜNCELLEME (21/10/11) : Bu sorunu izleyen Firefox hatası, bu davranışa ilham veren blog gönderisine bir bağlantı içerir.

GÜNCELLEME (12/2/14) : Artık komut dosyası etiketlerinde bir crossoriginöznitelik belirterek ve sunucunun uygun CORS HTTP yanıt başlıklarını göndermesini sağlayarak bazı tarayıcılarda tam etki alanları arası hata raporlamasını etkinleştirebilirsiniz .


3
Bunun için teşekkürler. Biraz açıklama yapmak istiyorum. Sayfama her zaman eklediğim komut dosyalarından ayrıntılı hata mesajları görüyorum. Örneğin, google'ın cdn'sinden jQuery ekler ve sayfamda var olmayan bir öğeyi değiştirmek için kullanırsam, google'ın CDN'sini gösteren bir hata alırım. "Komut Dosyası Hatası" mı diyorsunuz? komut dosyası istisnayı atıyor çünkü oluyor?
Mike Sherov

153
Birisinin neyin yanlış gittiğini merak etmek yerine "Uzak kaynaklı bir script, aynı menşei politikası nedeniyle gizlenmiş bir hata attı" demenin bir anlamı olacağını düşünürdünüz, ...
Roman Starkov

3
@broofa Bu, etki alanımda Google'ın CDN'sini kullanmak yerine jquery barındırırsam casinolar dışında daha iyi olacağım anlamına mı geliyor?
Paul Biggar

6
Küçük güncelleme. Ayrıca, bir sayfa file: // aracılığıyla yüklendiğinde ve komut dosyası eval () aracılığıyla çalıştırıldığında yerel olarak da gerçekleşir. Küçük kullanım durumu ama yine de :)
Willem Mulder

6
Bazı araştırmalardan sonra Script Error., kullanıcının JavaScript kodunu hatalı olarak enjekte eden bir Safari Uzantısı (muhtemelen Firefox Eklentileri için de) yüklediğinde de gerçekleştiğini fark ettim
Alex Hoppen

49

Gelecekte bu soruya rastlayacak olanlar için bir güncelleme: broofa cevap ile doğru ve bunun için bir çözüm yok.

Açıkçası diğer Bu kısıtlamaya içine tökezledi ve bir düzeltme için talepte bulunan bazı hatalar Firefox için yöneltildi: Bug 69301 ve WebKit için: Bug 70574

İyi haber, hatanın Firefox 13'ün piyasaya sürülmesiyle Firefox için çözülmüş olmasıdır.

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

crossorigineşdeğerdir crossorigin=anonymousve tarayıcıya kimlik bilgilerini göndermeden komut dosyasının CORS getirmesini yapmasını söyler .

Komut dosyasının, Access-Control-Allow-Originistekte bulunan alan adıyla eşleşen bir HTTP üstbilgisi değeriyle gönderildiğinden emin olmalısınız , ör.

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

aksi takdirde tarayıcı komut dosyasının yüklenmesini iptal eder .

Apache için:

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

(Ve diğer web sunucuları için CORS örneklerine bakın .)

PHP'de komut dosyası gönderiyorsanız:

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

Bunu test ettim ve beklendiği gibi çalışıyor. script.js'deki tüm hatalar window.onerrorişleyici tarafından mesaj, dosya ve satır ayrıntılarıyla yakalanır .

WebKit hatası henüz düzeltilmedi, ancak bir yama önerildi (ve aynı çözümü kullanıyor). Umarım düzeltme yakında yayınlanacak.

CORS hakkında daha fazla bilgi için: http://enable-cors.org/



1
Yeniden webkit. Eğer bunu kastediyorsanız, şimdi çözülmüş gibi görünüyor: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek

3
Diyelim ki harici bir tarafın JS dosyasını içeren mysite.com/index.php dosyasındaki JS hatalarını izlemek istiyoruz (örn. API sağlayıcısının sunucusu apiprovider.com/api.js); bu durumda o sunucuya erişimimiz yoktur, bu nedenle "Access-Control-Allow-Origin" üstbilgisini ekleyemeyiz. Api.js kaynaklı hata mesajları almanın bir yolu var mı?
Eugenio

23

Bunu anlamak biraz zaman aldı.

Bunu denemek ve çözmek için bir sürü şey yaptık, bunu denemek ve çözmek için BÜTÜN belge gövdesini Ajax aracılığıyla sunucularımıza geri dökmek gibi şeyler yapmak da dahil.

Hala "Komut Dosyası Hatası" nı neden olduğundan emin değilim. (BTW dönemi ile, Ajax kaydedicimizde bu şekilde görünür) Firefox'ta, ancak Chrome'da, bunu ...

Davul rulosu ...

Google Chrome'un otomatik çeviri özelliği.

İngilizce konuşan birçok kişi muhtemelen bu özelliği bilmiyor, ancak test etmek için Chrome'u kullanan İngilizce olmayan bir siteyi ziyaret ediyorum. Ya da daha iyisi, Chrome seçeneklerini araştırırsanız, tarayıcı dilini değiştirmek için bir yer vardır. İngilizce olmayan bir şeyle değiştirin, tarayıcıyı yeniden başlatın ve bir İngilizce sitesini ziyaret edin.

Çubuğun üst kısmına Chrome'un sayfayı sizin için çevirmesini isteyip istemediğinizi soracaksınız.

Her halükarda bizim durumumuzda, çevirmen soruna neden oluyor çünkü belge gövdesine bir komut dosyası etiketi ekliyor ve (burada tahmin etmek) içeriği Google'ın sunucularına göndermek ve çevirmelerini sağlamak için bir çeşit JS tabanlı sistem kullanıyor.

Konsoldaki hata Referanssız bir şey olsa da, window.onerror öğesine gönderilen ileti "Komut Dosyası Hatası" idi.

Her neyse, bir tedavi var.

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

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

Bu 2 şey yapacak (bildiğimiz kadarıyla, belki daha fazla?):

a) Çeviri çubuğunun Chrome'da görüntülenmesini devre dışı bırakın.

b) Sayfanın translate.google.com adresinden çevrilmesini devre dışı bırakın.

Zaten bizim durumumuzda, bu bu "Script Hatası" bir TON çözüldü. yaşadığımız sorunlar.

Bu yazıda yazım hatalarını özür dilerim, Chrome'da hala İngilizce olmayan bir moddayım ve yazım denetleyicisi İngilizce olarak ayarlanmamış;) Geri dönme zamanı.

Zevk almak!


4
Bunun doğrudan nedeni, çevirmen betiğinin web sayfasından farklı bir etki alanından çalıştırılması ve onerror(en azından Firefox'ta) böyle bir durumda yalnızca "Betik hatası" yazmasıdır.
Tgr

10

Düşük% nedeniyle, normal kullanıcı olmadığını varsayabilirsiniz. Muhtemelen kullanıcı yazıları, yer imleri veya hatta sadece web sitenizdeki konsolla uğraşanlar. Bir sayfanın tam HTML'sinin olduğu yerde bulunması bu teoriyi test etmeye yardımcı olabilir. Yanı sıra tam bir hata. Size bir url vermeli, her zaman aynı mı? Çizgi gerçekten 0 mı yoksa tanımsız mı?

Sana varsayılan değerleri ayarlamak iyi bir fikir olduğunu düşünmüyorum ve 0 muhtemelen parseInt(ln || 0)hata gerçekten sayfada olmadığında geliyor (yukarıdaki örneklere bakın).

Satırın JavaScript'te bu hataları görmezden gelip gelmediğini (muhtemelen kendi kodunuzdan gelmediği için) veya sunucu tarafı kodunda ayrı ayrı ele alınması için bilinip bilinmediğini görmek için bir i ekleyin. .

=== DÜZENLEME === Erişim : http://www.xavierm02.net/AZE/ user.js dosyasını yükleyin (Chrome'da yaptım ancak Firefox'ta da çalışmalıdır). Ardından aynı tarayıcıda html sayfasını açın. Size hatayı gösterecektir (Ben sadece sunucuya raporlama içgüdüsünü değiştirdim, sayfaya yazar). Satır numarası olarak 0 ile.


URL, sitemin sayfaları arasında eşit olarak dağıtılır. FF ve krom olduğunu düşünerek yer imleri, hatta uzantılar veya temalar da tahmin ediyorum. Ancak, güvenli bir şekilde görmezden gelmeden önce bu hata mesajını tam olarak kopyalamak isterim.
Mike Sherov

Satırınızı değiştirin (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());ve muhtemelen hiçbir URL (tarayıcının size göstermemesi için bir uzantı veya yerel bir şey olduğundan) ve satır numarası görmeyeceksiniz.
xavierm02

Ve btw, zaman damgasını JS yerine sunucunuzla almayı tercih etmelisiniz (ve belki de zaman damgası yerine sürümü almanız gerekir).
xavierm02

1
Aslında, JS sadece ham verileri göndermeli ve PHP yük hatalarını görmezden gelmeye özen göstermelidir.
xavierm02

JS tarafında bazı işlemler yapıyorum, çünkü sadece İLK ilgili hatayı rapor etmek istiyorum, bu yüzden gerçek bir hata geldikten sonra hata işlevini tekrar hiçbir şeye yeniden atayacağım. Bu da döngülerde oluşan hataları sunucumdan .
Mike Sherov

3

Benzer bir sorunum vardı: komut dosyalarım bir alt alan adı tarafından sunuluyor ve aynı kaynak kısıtlaması altında kalıyor. Ancak, bunu şu şekilde çözdüm:

1) böyle her komut dosyası etiketini eklemek:

<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />

2) her vhost içine aşağıdakileri ekleyerek apache httpd.conf'u değiştirmek (mod_headers'ı etkinleştirmelisiniz):

<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*.mydomain.tld"
</IfModule>

Bu yardımcı olur umarım ...

DÜZENLE

Sunucumdan birinde, yerine başka bir şey yapamadım.

*.mydomain.tld

tarafından

*

Genişletilmiş bilginin kimlik avını yapmasına * izin veren kusurların farkında olun. CORS, aynı orijinli, img ve fontlar, cdn ile ilgili dokümantasyon mevcuttur ancak script tag crossorigin detayları hakkında çok daha az bilgi mevcuttur.


1
"* .mydomain.tld" crossorigin niteliği için geçerli bir değer değil developer.mozilla.org/en-US/docs/Web/HTML/...
icenac

1

Chrome'da, hem HTML'yi hem de Javascript'i yüklerken "Kod hatası" nı (satır 0'da) alıyorum file://. Firefox'ta bu olmaz. Muhtemelen aşırı derecede aynı kökten gelen Chrome koruması.

Aynı HTML ve Javascript'i HTTP üzerinden yüklerken her şey yolunda.


1

Aşağıdaki nasıl. Komut dosyası hatası JavaScript aracılığıyla kullanılamıyor, bu nedenle bu özel durumu izole edin ve mümkün olan en iyi şekilde ele alın.

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;
};

bunu karmaya nasıl kaydedersiniz?
CommonSenseCode

Tarayıcı konsolunun ayrıntılara sahip olduğunu söylüyorsunuz, ama hata yok mu?
Michael Freidgeim


0

İOS'ta hem Chrome hem de Firefox, Safari Web Görünümü'ne dayanıyor, ancak yüklenen her sayfaya bir sürü özel komut dosyası ekliyor. Bu senaryoların herhangi birinde bir şeyler ters giderse, o da bildirilir Script error on line 0. (Tarayıcıya eklenen komut dosyaları çapraz kaynak olarak da sayılır)

Bu diğer SO iş parçacığında izlediğim ve belgelediğim için iOS'ta Chrome ve Firefox'un her ikisinde de özel komut dosyalarında SVG öğelerini doğru şekilde işleyen sorunlar var. Bu konudaki diğer tüm yanıtlara ek olarak: Sayfanızdaki <a>etiketlerin içinde SVG öğeleri ve etiketleri kullanırsanız <svg>, bu Script errorsiOS Chrome ve iOS Firefox'ta raporlanmaya neden olur .


-1

Safari'de (WebKit) benim için neyin düzeltildiğini anlatacağım: JS geri arama rutinini aslında sayfaya koyarsam, tam bilgi alırım. Bir etiketi ile bir .js dosyasına eklerseniz, sadece "Komut dosyası hatası" hatası alıyorum (linenumber, vb olmadan).

Belki de bu Broofa'nın söyledikleriyle ilgilidir.

Anwyay, bu yüzden şimdi sayfada küçük bir geri arama var ve daha sonra dosyanın geri kalan kısmı sayfa dışında.


-2

Biraz arama yaptım ve "Komut Dosyası Hatası" araması istenen bir dosyayı yüklerken sorun olduğu anlamına geliyor. Bu, istemci tarafında bir önbellek sorunu veya aşırı yükleme nedeniyle bir sunucu sorunu olabilir.

Büyük olasılıkla betiğin kendisi yükleyemediği dosya olduğu böyle bir şeyden kaynaklanır, bu nedenle 0 satırında oluşan hata.

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

İyi düşünülmüş, ancak bir komut dosyası yüklenemediğinde açıkça yok sayıyoruz. Bu hatayı özellikle tespit ettik ve yok saydık.
Mike Sherov

1
Bir komut dosyasının yüklenemediğini nasıl tespit ettiniz? Bir noktada bununla ilgili sorun yaşadığımı hatırlıyorum. script.onerrorbazı tarayıcılarda eksik komut dosyaları nedeniyle işten çıkarılmadı.
Charlie Kilian

"Kaynak hatası." (küçük-e) hem webkit hem de FF kaynaklarında görünür. Yukarıdaki cevabımı gör. FWIW.
broofa

-3

Yaşadım

Komut Dosyası Hatası. satır 0

hata, müşteri tarayıcılarında hata oluştuğunda sunucumuza geri bildirilir. Dün ilk kez ( "use strict";javascriptimize giriş yaptıktan sonra ) Windows 7'de Safari ve Chrome'da bu sorunu çoğaltmayı başardım. Kodumuzu alert () ifadeleriyle karıştırdıktan sonra bu hatayı tanımsız bir değişkenin kullanımına kadar takip ettim! örneğin xx = 123;, xxvar ifadeyle tanımlanmadı .

Safari bunu şöyle bildirdi

ReferenceError: Katı mod, 'xx' global özelliğinin örtülü olarak oluşturulmasını yasaklar

Web Inspector içinde, ancak window.onerror işlevi tespit ediyordu

Komut Dosyası Hatası. satır 0


-11

Firefox'un kaynak kodunu selamlamak, hiçbir şeyin olmadığını gösterir "Script Error.". Bu nedenle, sitenizdeki bazı komut dosyalarının yakalanmayan bir hatayı şu şekilde atması muhtemeldir:

throw new Error('Script Error.');

Muhtemelen bu ifadeye yalnızca Firefox ve Chrome'da ulaşılmıştır.

Neden hiç satır numarası olmadığından emin değilim. Belki bir eval()sorun mu var?


1
Bunu tam olarak önerdiğin gibi atmaya çalıştım. "Komut Dosyası Hatası" bildirmiyor. "Atılan İstisna yakalanmadı: Komut Dosyası Hatası" bildiriyor. İyi düşünülmüş olsa da.
Mike Sherov

Ayrıca, hataya neden olan kullanıcı tarafından yüklenen uzantılardan biri olabilir.
Charlie Kilian

1
Olmaz. Doğru boşluklara bakarsanız web'in her yerinde "Komut Dosyası Hatası" nı görürsünüz.
Amalgovinus

2
Oh hayır. Aslında "Komut dosyası hatası". küçük bir "e" ile. Bu yüzden kaynak kodunda bulamadım.
user123444555621
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.