2010-08-26 3 views
9

In Javascript, als ein Skript von Somer Host geladen, gibt es eine Möglichkeit zu wissen, welcher Server/Host ich geladen wurde? Ich muss zusätzliche Ajax-Anfragen zurück zu diesem Host machen und würde es vorziehen, den Host dynamisch herauszufinden.In Javascript eine Möglichkeit zu wissen, aus welchem ​​Host-Skript geladen wurde?

Also, wenn Sie umfassen eine Javascript-Datei auf einer Seite

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

wenn das Javascript ausgeführt werden, innerhalb test.js ...

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

Dank

+0

+1 gute Frage, daran interessiert zu sehen, ob es möglich mit JS – Mikey1980

Antwort

11

Gibt es eine Möglichkeit zu wissen, welcher Server/Host I wurde aus geladen?

Ja, es ist möglich außer, wenn das Skript asynchron mit geladen wird defer oder async Attribute seit dem letzten Skript im DOM müssen nicht unbedingt die aktuell ausgeführten Skripts sein in diesem Fall. Weitere Informationen finden Sie in den Kommentaren von @kangax.

Auch diese same question wurde vor kurzem veröffentlicht.

In Ihrer test.js, holen Sie sich das letzte Skriptelement, welches das gerade analysierte Skript sein wird (test.js in Ihrem Fall), und erhalten Sie src.

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

Einer der src gefunden wird, analysiert die Host-regex.

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

Letzte Script-Element ist nicht notwendigerweise derjenige das wird jedoch gerade ausgeführt (denke "defer" und "async" Attribute), so dass dieser Ansatz nicht zuverlässig ist. – kangax

+0

@kangax - ist es richtig zu sagen, dass das obige funktioniert, außer wenn 'defer' oder' async' Attribute verwendet werden? – Anurag

+2

Ja, ich denke schon. Die aktuelle HTML5-Spezifikation - die zum größten Teil das Verhalten echter Browser widerspiegelt - sagt: "Wenn keines der Attribute vorhanden ist (was" defer "und" async "bedeutet), wird das Skript sofort abgerufen und ausgeführt, bevor der Benutzeragent fortfährt Parsing der Seite. " Das aktuell ausgeführte Skript sollte eigentlich das letzte Skriptelement im Dokument sein (da das Parsing erst fortgesetzt werden kann, wenn die Ausführung abgeschlossen ist). – kangax

0

Nee, sorry.

Wenn die <script> eine ID hatte, dann vielleicht. Aber darauf kann man sich nicht wirklich verlassen.

0

Nicht sicher, ob das mit JavaScript gemacht werden kann. Wenn das Skript in einer PHP-Datei ist tun es wie folgt aus:

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

Auf meiner Seite Ich schließe meine JS-Skripte mit PHP nur aus diesem Grund. Ich bin interessiert zu sehen, ob es einen besseren Weg gibt.

0

Aufgrund der gleichen Ursprungsrichtlinie können Sie AJAX-Anfragen nur an den Ursprung (Host + Protokoll + Port) stellen, von dem die HTML-Seite (Dokument) geladen wurde - was nicht unbedingt mit dem Ursprung Ihrer js übereinstimmt von.

Sie können window.location.hostname oder document.location.hostname verwenden, um den Hostnamen des Dokuments herauszufinden.

+0

Erinnern Sie sich, während Ajax Aufrufe sind begrenzt, ein Javascript-Skript kann zusätzliche Skripte, Daten (mit JSONP), Bilder usw. von jeder Domäne laden. Die Same-Origin-Richtlinie bezieht sich auf direkte Ajax-Aufrufe. –

+1

@Larry: Ja, aber das OP fragte speziell nach Ajax-Anrufen. (JSONP ist nicht Ajax.) –

0

Kennt das Skript seinen eigenen Dateinamen? ("test.js" in der OP-Frage.)

Wenn ja, könnte Ihr Skript das dom nach allen Skript-Tags abfragen und nach denen mit einem src-Attribut suchen. Aber Sie müssen auf zwei Skripts mit demselben Dateinamen achten, die von verschiedenen Servern geladen wurden.ZB

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

Hier JS, die für alle der Script-Tags in einer el aussieht:

var scripts = el.getElementsByTagName('SCRIPT'); 
Verwandte Themen