[英]SCRIPT5022: The collection has not been initialized. It has not been requested or the request has not been executed
[英]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
轉到test
到www
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.