2010-08-26 19 views
9

, Somer ana bilgisayardan yüklenen bir komut dosyası olarak, ben yüklenen ne sunucu/ana bilmek herhangi bir yolu var mı? Bu sunucuya ek ajax istekleri eklemem gerekiyor ve ana makineyi dinamik olarak bulmayı tercih ediyorum.Javascript'te hangi ana makine betiğinin yüklendiğini bilmek için herhangi bir yol var mı? javascript içinde

Yani bir sayfa

<script src="http://somehost.com/js/test.js"></script> 

üzerinde bir javascript dosyası javascript yürütmek zaman test.js içinde ...

var host_loaded_from = ??? // should be somehost.com 

Teşekkür

+0

+1 iyi soruya, bu JS – Mikey1980

cevap

11

ben yüklenen ne sunucu/ana bilmek herhangi bir yolu var mı? komut mutlaka bu durumda şu anda yürütülen komut dosyası olmayabilir DOM'da son komut beri defer veya async özelliklerini kullanarak uyumsuz yüklendiğinde

Evet, hariç mümkündür. Daha fazla bilgi için @kangax'ın yorumlarına bakın.

Ayrıca, bu same question son zamanlarda yayınlanmıştır.

Test.js'nizin içinde, şu anda ayrıştırılmış komut dosyası (durumunuzda test.js) olacak olan ve src numarasını aldığınız son komut dosyası öğesini bulun.

// test.js 
var scripts = document.getElementsByTagName('script'); 
var src = scripts[scripts.length - 1].src; 

Bir src

bulunursa, regex kullanarak ev sahibi çözümlenen.

src.match(new RegExp('https?://[^/]*')) 
["http://somehost.com"] // for your example 
+0

kullanarak mümkünse görme ilgi: Ör

<script src="http://somehost.com/js/test.js"></script> <script src="http://somehost_number2.com/js/test.js"></script> 

İşte bir el komut dosyası etiketlerinin tüm arar JS var Şu anda idam ediliyor (düşün “erteleme” ve “async” özellikleri), bu yüzden bu yaklaşım güvenilir değil. – kangax

+0

@kangax - Yukarıdaki 'defer' veya 'async' öznitelikleri kullanıldığında istisna ile çalışacağını söylemek doğru mu? – Anurag

+2

Evet, öyle düşünüyorum. Geçerli HTML5 özellikleri - çoğunlukla gerçek tarayıcı davranışlarını yansıtmalıdır - diyor ki: "Hiçbir özellik mevcut değilse (" defer "ve" async "), komut dosyası kullanıcı aracısı devam etmeden önce hemen getirilir ve çalıştırılır. sayfayı ayrıştırma. " Şu anda çalıştırılan betik aslında belgede son komut dosyası olmalıdır (ayrıştırma işlemi tamamlanana kadar devam edemediğinden). – kangax

0

Hayır, üzgünüm eklerseniz.

<script> bir kimliğe sahipse, belki de. Ama buna gerçekten güvenemezsin.

0

Bunun JavaScript ile yapılıp yapılamayacağından emin değil. komut bir PHP dosyası içinde ise böyle yapmak: Benim sitemde

... 
var host_loaded_from = <?php echo $_SERVER[SERVER_NAME] ?> 
... 

ben sadece bu nedenle PHP kullanarak benim JS komut dosyaları içerir. Daha iyi bir yol olup olmadığını görmek istiyorum.

0

Aynı Kaynak İlkesi nedeniyle, AJAX isteklerini yalnızca kökeni (ana makine + iletişim kuralı + bağlantı noktası) yapabilir, HTML sayfası (belge) yüklendi; bu, js yüklendiğiniz kaynak ile aynı olmayabilir. dan.

Belgenin ana bilgisayar adını öğrenmek için window.location.hostname veya document.location.hostname kullanabilirsiniz.

+0

Ajax aramaları sınırlıdır, bir Javascript betiği Herhangi bir alandan ek komut dosyaları, veri (JSONP kullanarak), resim, vb. Yükleyebilir. Aynı Köken Politikası, düz Ajax çağrıları ile ilgilidir. –

+1

@Larry: Evet, ancak OP özellikle Ajax çağrılarını soruyordu. (JSONP Ajax değildir.) –

0

komut kendi dosya adını biliyor mu? ("test.js", OP sorusundaki.)

Öyleyse, komut dosyanız tüm betik etiketlerinin dom değerini sorgulayabilir ve src özelliğine sahip olanları arayabilir. Ancak, farklı sunuculardan yüklenen aynı dosya adına sahip iki betiğe dikkat etmeniz gerekir.Son yazı elemanı mutlaka biri değildir

var scripts = el.getElementsByTagName('SCRIPT'); 
İlgili konular