Osu*_*kaa 4 javascript google-chrome-extension
我正在编写一个简单的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);
}
});
Run Code Online (Sandbox Code Playgroud)
它列出了打开的选项卡,但似乎没有添加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>
Run Code Online (Sandbox Code Playgroud)
我尝试使用答案给出的答案,.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);
}
});
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我有一个前后console.log()以及内部addEventListener,它似乎没有调用任何内部addEventListener,你可以在这里看到:

它正在调用console.log内部,addEventListener但仍然无法正常工作

尝试添加closure around该功能
(function(num) {
element.addEventListener("click",function(){
changeTab(window.tabs[num].id);
},false);
})(i)
Run Code Online (Sandbox Code Playgroud)
单击该元素后,将在稍后阶段执行该事件.因此,当for循环完成时,i始终指向最后一个迭代值.
因此,将其封闭在匿名函数中会在变量周围创建一个闭包,该闭包在click事件发生时可用.
| 归档时间: |
|
| 查看次数: |
5465 次 |
| 最近记录: |