1

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

例如,我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

4 回答 4

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') );
于 2013-08-09T13:57:41.503 回答
1

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

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

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

    myfunc = function(args) {
        ...

    }

    // your code goes here
};

在上菜之前,已经__STAGE_PLACEHOLDER__dev//代替了testwww然后你就可以用myscript.stage.

于 2013-08-09T14:02:56.170 回答
0

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

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

为了避免拥有多个脚本的开销,您可以在服务器端动态生成这个附加函数。

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

MyApp.config.env = 'dev';
于 2013-08-09T14:07:52.130 回答
-1

来自 Mozilla 开发人员站点参考window.location

window.location.hostname // the host name (without the port number or square brackets)
于 2013-08-09T14:03:59.237 回答