[英]javascript addEventListener is not working
我正在編寫一個簡單的chrome擴展,列出了所有打開的標簽,我有這個代碼
function changeTab(tabID){
chrome.tabs.update(tabID,{active:false})
}
chrome.windows.getCurrent({populate: true},function (window){
list = document.getElementById('open-tabs');
for (var i = 0; i < window.tabs.length; i++)
{
var li = document.createElement('li');
var element = document.createElement('a');
element.setAttribute('href','#');
element.innerHTML = window.tabs[i].title;
element.addEventListener("click",function(){
changeTab(window.tabs[i].id);
},false);
li.appendChild(element);
list.appendChild(li);
}
});
它列出了打開的選項卡,但似乎沒有添加onClick事件,當我檢查chrome控制台時,我得到了這個
為什么不正確添加事件?
--edit--如果有幫助的話,添加html
<!doctype html>
<html>
<head>
<title>Count Me</title>
<link rel="stylesheet" href="popup.css" type="text/css">
<script src="popup.js"></script>
</head>
<body>
<div id="main">
<ul id="open-tabs"></ul>
</div>
</body>
</html>
我嘗試使用.bind(this,i)
給出答案的sugestion .bind(this,i)
但仍然不起作用,我添加了console.log()
以查看發生了什么,似乎它不會進入addEventListener
內部繼承代碼日志調用:
function changeTab(tabID){
chrome.tabs.update(tabID,{active:false})
}
chrome.windows.getCurrent({populate: true},function (window){
list = document.getElementById('open-tabs');
for (var i = 0; i < window.tabs.length; i++)
{
var li = document.createElement('li');
var element = document.createElement('a');
element.setAttribute('href','#');
element.innerHTML = window.tabs[i].title;
console.log('before');
console.log(window.tabs[i].id);
element.addEventListener("click",function(iVal){
console.log('inside');
changeTab(window.tabs[iVal].id);
}.bind(this,i),false);
console.log('after');
console.log(window.tabs[i].id);
li.appendChild(element);
list.appendChild(li);
}
});
正如您所看到的,我有一個Before and After console.log()
以及addEventListener
內部,它似乎沒有調用addEventListener
任何內容,如下所示:
它在addEventListener
調用console.log
但仍然無法正常工作
嘗試在函數closure around
添加一個closure around
(function(num) {
element.addEventListener("click",function(){
changeTab(window.tabs[num].id);
},false);
})(i)
單擊該元素后,將在稍后階段執行該事件。 因此,當for循環完成時, i
總是指向最后一個迭代值。
因此,將其封閉在匿名函數中會在變量周圍創建一個閉包,該閉包在click事件發生時可用。
您的函數回調發生在無法識別i的上下文中。您可以將i值綁定到函數,並使其工作:
element.addEventListener("click",function(iVal){
changeTab(window.tabs[iVal].id);
}.bind(this,i),false);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.