示例代码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