我整个早上一直在绞尽脑汁。在我的HTML代码中,我有一个包含字母a - j的列表,并希望在单击时控制对象的日志。
我创建了一个for
循环来运行节点列表,我可以让控制台的脚本注销掉被点击的元素的编号,但是一旦我尝试获取{{1}或类似的东西它返回undefined。
但是当我只是在控制台输入innerHTML
时,它会返回我想要的字母。
请帮助我理解为什么只是因为它经过一个el[3].innerHTML
循环才会使它未定义?
我不只是在寻找解决方案,而且还要了解它为什么会这样,这样我才能成为更好的编码器。
谢谢!
代码:
for
答案 0 :(得分:1)
您错过了变量名称:
的console.log(this.innerHTML);
var list = document.getElementsByTagName('ul')[0];
var el = list.getElementsByTagName('li');
console.log(el)
for(var i = 0; i < el.length; i++ ) {
el[i].addEventListener("click",function(f){
return function(event){
event.preventDefault();
console.log(this.innerHTML);
};
}(i));
}
&#13;
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
&#13;
答案 1 :(得分:1)
当您将i
作为参数传递给函数时,f
会获得i
的值,所以当您尝试获取f.innerHTML
时,您试图获取来自整数的HTML,而不是来自被点击的元素。
您可以使用this
来定位点击的元素。这是一个有效的例子:
var list = document.getElementsByTagName('ul')[0];
var el = list.getElementsByTagName('li');
for(var i = 0; i < el.length; i++ ) {
el[i].addEventListener("click",function(f){
return function(event){
event.preventDefault();
console.log(this.innerHTML);
};
}(i));
}
<ul>List
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
感谢@Teemu编辑了更正的信息。
答案 2 :(得分:0)
这是工作示例,我认为传递正确的元素
是个问题var list = document.getElementsByTagName('ul')[0];
var el = list.getElementsByTagName('li');
for(var i = 0; i < el.length; i++ ) {
el[i].addEventListener("click",function(e){
return function(event){
event.preventDefault();
console.log(e.innerHTML);
};
}(el[i]));
}
答案 3 :(得分:0)
正如@teemu在评论中提到的那样f
是event
对象。要访问innerHtml
,您需要访问target
。
目前,您有<li>
个元素eventListener
。您<ul>
只能拥有一个更清洁的代码库。
将eventListener添加到<ul>
时,您可以通过event.target
访问其中的每个点击元素。
var list = document.getElementsByTagName('ul')[0];
list.addEventListener('click', logInnerHtml)
function logInnerHtml(event) {
event.preventDefault()
console.log(
event.currentTarget.innerHtml
)
}
var list = document.getElementsByTagName('ul')[0];
list.addEventListener('click', logInnerHtml)
function logInnerHtml(event) {
console.log(event.target.innerHTML)
}
<ul>
<li>first</li>
<li>second</li>
</ul>