从请求脚本的位置获取主机

时间:2013-08-09 13:53:37

标签: javascript

我有一个其他人在我们的主机网站上请求的脚本。我有多个环境(开发/测试/生产),在我的脚本中,我想知道它已被加载的环境。

例如,我在以下网站上提供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
};

我该如何做到这一点?

4 个答案:

答案 0 :(得分:1)

我很难理解你真正追求的是什么,但你可以循环遍历所有脚本并解析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') );

答案 1 :(得分:1)

如果不对服务脚本的方式进行一些更改,我认为这是不可能的。我相信您需要将主机名硬编码到脚本声明的某个变量中,并在脚本文件从dev移动到testwww时进行更改。或者,您可以使用例如动态插入值。 PHP。

示例:在您的脚本中,您将拥有类似

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

    myfunc = function(args) {
        ...

    }

    // your code goes here
};

在您投放之前,将__STAGE_PLACEHOLDER__替换为dev / test / www,然后您可以使用myscript.stage进行内省。

答案 2 :(得分:0)

如果您希望env依赖于脚本的路径,而不是包含它的页面,那么window.location将不起作用。您可以做的是为每个env使用不同的js脚本,其中包含自定义getHost()函数,即:

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

为了避免使用多个脚本的开销,您可以在服务器端动态生成此附加功能。

您也可以要求用户自己定义环境,即:

MyApp.config.env = 'dev';

答案 3 :(得分:-1)

来自window.location的Mozilla开发者网站参考:

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