示例代碼JavaScript的問題:關於關鍵字這個
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script language="javascript" type="text/javascript">
function init() {
var nodeList = document.getElementsByTagName("a");
var nodeArr = [];
for(var i = 0; i < nodeList.length; i++) // Copy NodeList to Array
nodeArr.push(nodeList[i]);
for(var i = 0; i < nodeArr.length; i++) // Loop over array
if(nodeArr[i].className == "clickLink")
nodeArr[i].onclick = clickLink2; // Attach event function
}
window.onload = init; //Attach event function
function clickLink2() {
console.log("this: " + this); //Prints window URL in href
console.dir(this); //show attributes of anchor
console.log(this.name); // Prints name attribute
}
function clickLink(elem) {
console.log("this: " + this); //Prints [object Window]
console.dir(this); // Shows attributes, etc. al of [object Window]
console.log("name: " + elem.name);
}
</script>
</head>
<body>
<!-- inline -->
<a href="#" name="blah1" onclick="clickLink(this); return false;">Test 1</a>
<a href="#" name="blah2" onclick="clickLink(this); return false;">Test 2</a>
<a href="#" name="blah3" onclick="clickLink(this); return false;">Test 3</a>
<a href="#" name="blah4" onclick="clickLink(this); return false;">Test 4</a>
<hr/>
<!-- not inline -->
<a href="#" name="blah5" class="clickLink">Test 5</a>
<a href="#?t" name="blah6" class="clickLink">Test 6</a>
<a href="#" name="blah7" class="clickLink">Test 7</a>
<a href="#" name="blah8" class="clickLink">Test 8</a>
</body>
</html>
我沒有在Firefox的測試,用Firebug查看控制檯輸出。
現在我想知道:
- 爲什麼
clickLink
沒有這指窗口對象? - 爲什麼這個在
clickLink2
打印到控制檯作爲鏈接的href值? - 有沒有更好的方法將這個傳遞給這樣一個不顯眼的附件?你怎麼能確定這個指的是什麼?
OK,所以我把碎片從答案在這裏,發現這是在某些瀏覽器有點古怪。此外,將功能分配給onclick
與附加功能不同(但不幸的是,並非所有IE版本都支持addEventListener
與attachEvent
)。由於某種原因,舊IE瀏覽器也使這個內部的一個事件觸發器函數仍然指向窗口對象而不是調用者。所以我用event.srcElement
。下面是一些新的示例代碼:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script language="javascript" type="text/javascript">
function init() {
var nodeList = document.getElementsByTagName("a");
var nodeArr = [];
for(var i = 0; i < nodeList.length; i++) // Copy NodeList to Array
nodeArr.push(nodeList[i]);
for(var i = 0; i < nodeArr.length; i++) // Loop over array
if(nodeArr[i].className == "clickLink") {
var a = nodeArr[i];
if (a.addEventListener) { //IE9, other browsers
a.addEventListener('click', clickLink2); // Attach event function
} else if (a.attachEvent) { //IE6,7,8, etc.
a.attachEvent('onclick', clickLink2); // Legacy IE Attach event function
}
a.onclick = function() { return false }; // override default onclick behavior for these anchors so URL is not followed
}
}
window.onload = init; //Attach event function
function clickLink2() {
if(typeof(event) != 'undefined') {
elem = event.srcElement; //IE < 8 keeps this as window object
} else {
elem = this;
}
alert(elem.name);
}
function clickLink(elem) {
alert(elem.name);
}
</script>
</head>
<body>
<!-- inline -->
<a href="#" name="blah1" onclick="clickLink(this); return false;">Test 1</a>
<a href="#" name="blah2" onclick="clickLink(this); return false;">Test 2</a>
<a href="#" name="blah3" onclick="clickLink(this); return false;">Test 3</a>
<a href="#" name="blah4" onclick="clickLink(this); return false;">Test 4</a>
<hr/>
<!-- not inline -->
<a href="#" name="blah5" class="clickLink">Test 5</a>
<a href="#?t" name="blah6" class="clickLink">Test 6</a>
<a href="#" name="blah7" class="clickLink">Test 7</a>
<a href="#" name="blah8" class="clickLink">Test 8</a>
</body>
</html>
聽起來像你需要閱讀關於['this'](https://developer.mozilla.org/en/JavaScript/Reference/Operators/this) – zzzzBov 2012-03-15 13:54:11
你正在傳遞一個引用到當前元素'onclick =「點擊鏈接(this)'並在函數clickLink(elem)中接收它爲'elem'。爲什麼不使用那個? – Stefan 2012-03-15 13:56:21
@Stefan我提供的代碼並不是真的想要做任何具體的事情,只是爲了弄清楚結合zzzzBov的MDN鏈接,下面的解釋以及我自己的修補程序,我認爲我現在可以更好地處理Javascript中的_this_了。謝謝所有 – user17753 2012-03-15 14:16:12