[英]How do I pass argument to anonymous Javascript function?
我正在編寫一個簡單的計數器,並且我想使用戶的安裝非常簡單。 我見過的最簡單的計數器代碼(針對安裝它的用戶)之一是Google Analytics(分析)代碼
因此,我想將主要代碼存儲在文件中,要安裝我的計數器的用戶只需設置如下的websiteID:
<html><head><title></title></head><body>
<script type="text/javascript" src="http://counterhost.lan/tm.js">
var websiteId = 'XXXXX';
</script>
</body></html>
這是我的代碼:
<script type="text/javascript" src="http://counterhost.lan/tm.js">
var page = _gat.init('new');
</script>
這是我的JS文件:
(function() {
var z = '_gat';
var aa = function init(data) { alert(data); alert(z);};
function na() {
return new z.aa();
}
na();
})();
我試圖了解Google Analytics(分析)的javascript代碼,但未能做到這一點。 誰能建議我如何指定標簽之間的變量,然后以javascript文件中的匿名函數讀取它? 謝謝。
在您的示例中, websiteId
是全局變量。 因此它可以在任何地方訪問,包括匿名函數,除非有一個同名的局部變量
<script> var websiteId = "something"; </script>
稍后在頁面或包含的js文件中...
(function() {
alert(websiteId); //this should work
})();
誰能建議我如何指定標簽之間的變量,然后讀取它[...]
如果您的標簽同時具有SRC屬性和JS內容,則不會。
<script type="text/javascript" src="http:/x.com/x.js"></script>
..與...不同,
<script type="text/javascript">
var x = 1;
</script>
Dojo是一個可以向JSRIPT標簽添加JS變量的框架。 因此,如果您使用的是Dojo,則可以通過編寫以下代碼將變量添加到全局djConfig哈希中:
<script type="text/javascript" src="mxclientsystem/dojo/dojo.js"
djConfig="
usePlainJson: true,
parseOnLoad: true
">
</script>
Dojo通過運行SCRIPT標記並評估自定義djConfig屬性來完成此操作。
但是,這不能解決您的問題。
您確實需要兩個SCRIPT標簽。 有一句話,
<script type="text/javascript">
var websiteId = '123456';
</script>
這將設置一個全局變量websiteId和另一個,
<script type="text/javascript" src="http:/x.com/myreporter.js"></script>
可以從任何地方加載並讀取websiteId變量,我假設將其報告回來。
您可以像這樣將變量傳遞給匿名函數:
(function(arg1, arg2, arg3) {
alert(arg1);
alert(arg2);
alert(arg3);
})("let's", "go", "redsox");
// will alert "let's", then "go", then "redsox" :)
我不清楚您要問什么,但是...
您可以使用id
屬性標記任何HTML元素,然后使用
document.getEntityById()
以檢索該特定元素。
您還可以給HTML元素用戶定義的屬性具有自己選擇的名稱,然后在Javascript中為該元素獲取並設置它們。
我認為您對JS對象的調用方式有些困惑。
z
是字符串'_gat'
。 您不能在其上調用aa()
,因為字符串沒有名為aa
成員。 aa
是存儲在局部變量中的獨立函數。 即使您確實調用了aa()
,它也不會返回任何內容,因此對結果使用new
運算符是沒有意義的。 new
只能在構造函數上調用。
我猜你的意思是這樣的:
var _gat= function() {
// Private variable
//
var data= null;
// Object to put in window._gat
//
return {
// Set the private variable
//
init: function(d) {
data= d;
}
};
}();
然后像第二個示例中那樣調用_gat.init('foo')
會將變量設置為網站_gat.init('foo')
'foo'
。 之所以_gat
是因為_gat
對象是在匿名函數內定義的return {init: function() {...}}
對象,並在隱藏的data
變量上保留了引用(“ closure”)。
如果您將src
屬性指定為script
元素的一部分,則script
元素標簽本身內的任何代碼都不會執行。 但是,您可以使用以下代碼添加此功能。 我從Crockford(我相信是他)那里獲得了這項技術,他在演講中談到了無關的主題,即渲染性能,並為此目的將腳本異步加載到頁面中。
JavaScript:
(function() {
// Using inner class example from bobince's answer
var _gat = (function() {
var data= null;
return {
init: function(d) {
console.info("Configuration data: ", d);
data = d;
}
}
})();
// Method 1: Extract configuration by ID (SEE FOOT NOTE)
var config = document.getElementById("my-counter-apps-unique-and-long-to-avoid-collision-id").innerHTML;
// Method 2: search all script tags for the script with the expected name
var scripts = document.getElementsByTagName("script");
for ( var i=0, l=scripts.length; i<l; ++i ) {
if ( scripts[i].src = "some-script.js" ) {
config = scripts[i].innerHTML;
break;
}
}
_gat.init( eval("(" +config+ ")") );
})();
HTML:
<script type="text/javascript" src="some-script.js" id="my-counter-apps-unique-and-long-to-avoid-collision-id">
{some: "foo", config: "bar", settings: 123}
</script>
使用唯一且不會沖突的ID將使確定正確的腳本元素更加准確和快捷; 但是,這不是有效的HTML4 / XHTML標記。 在HTML5中,您可以定義任意屬性,因此在那時不會有問題
此方法是有效的HTML標記; 但是,如果您的網址可能更改(例如:http vs https),那么我展示的簡單比較可能會很容易中斷,並且可能需要一種更強大的比較方法
eval
的注釋 兩種方法都使用eval
。 關於此功能的典型口頭禪是“評估是邪惡的”。 然而,去與說使用eval
不知道的危險eval
是邪惡的。
在這種情況下, script
標記中包含的數據AFAIK不會受到注入攻擊,因為在將HTML解析為DOM時,一旦到達該評估腳本(顯示的代碼),該腳本便立即執行。 先前可能已定義的腳本無法訪問計數器的script
標記中包含的數據,因為該節點在執行時就不在DOM
樹中。
可能的情況是,從先前包含的腳本執行的適時的setTimeout
可能能夠在計數器script
的包含與評估時間之間的時間運行; 但是,情況可能會也可能並非如此,並且如果可能,取決於CPU負載等,情況可能會不一致。
如果您擔心這個故事的寓意,請添加一個非eval
的JSON解析器,然后改用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.