簡體   English   中英

從請求腳本的地方獲取主機

[英]Get host from where script has been requested

我有一個腳本,其他人可以從我的房東在他們的網站上請求。 我有多個環境(開發/測試/生產),並且在我的腳本中,我想知道從其加載的環境。

例如,我在以下站點提供script.js (文件在所有站點上都相同):

dev.mysite.com/script.js
test.mysite.com/script.js
www.mysite.com/script.js

有人將我的腳本加載為:

<script src="dev.mysite.com/script.js"></script>

因此,在script.js ,我想要一些代碼,該代碼能夠從中請求腳本本身的主機:

var getHost = function() {
  var host = // host from where it has been requested
  return host; // in this case it should return dev.mysite.com
};

我該怎么做?

我很難理解您的實際需求,但是您可以循環瀏覽所有腳本並解析src

jQuery的:

function getHosts(scriptName){
   var hosts  = [];
   scriptName = scriptName.replace(/([.])/g,"\\$1"); // escape special characters

   $('script').each(function(){
      var _src    = this.src;

      if ( RegExp(scriptName).test(_src) ){
         _src = _src.replace(/^https*:\/\//,'');     // remove protocol
         _src = _src.replace(/\/.*$/,'');            // remove rest of path
         hosts[hosts.length] = _src;                 // store it for return
      }
   });

   return hosts;                                     // return results as array
}

alert( getHosts('script.js').join(',') );

而且沒有jQuery:

function getHosts(scriptName){
   var hosts  = [];
   scriptName = scriptName.replace(/([.])/g,"\\$1"); // escape special characters

   var scripts = document.getElementsByTagName('script');
   for (var n=scripts.length;n--;){
      var _src = scripts[n].src;

      if ( RegExp(scriptName).test(_src) ){
         _src = _src.replace(/^https*:\/\//,'');     // remove protocol
         _src = _src.replace(/\/.*$/,'');            // remove rest of path
         hosts[hosts.length] = _src;                 // store it for return
      }
   }

   return hosts;                                     // return results as array
}

alert( getHosts('test.js').join('\n') );

我認為不對腳本的提供方式進行一些更改就不可能實現。 我相信您需要將主機名硬編碼為腳本聲明的某個變量,並在腳本文件從dev轉到testwww test更改。 或者,您可以使用例如PHP動態插入值。

示例:在腳本中,您將看到類似

var myscript = {
    // declare a 'namespace'
    stage = '__STAGE_PLACEHOLDER__';

    myfunc = function(args) {
        ...

    }

    // your code goes here
};

在提供服務之前,將__STAGE_PLACEHOLDER__替換為dev / test / www ,然后可以使用myscript.stage進行內部檢查。

如果您希望環境依賴於腳本的路徑,而不是包含腳本的頁面,則window.location將不起作用。 您可以做的是為每個環境創建一個不同的js腳本,並在其中添加一個自定義的getHost()函數,即:

var getHost = function () {
  return "dev";
}

為了避免擁有多個腳本的開銷,您可以在服務器端動態生成此附加功能。

您還可以要求用戶自己定義環境,即:

MyApp.config.env = 'dev';

從Mozilla開發人員網站參考window.location

window.location.hostname // the host name (without the port number or square brackets)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM