Google chrome extension [Javascript]将本地变量作为参数传递给EnventListener单击

Google chrome extension [Javascript]将本地变量作为参数传递给EnventListener单击,google-chrome-extension,Google Chrome Extension,我需要将局部变量值传递给函数。我的代码只能在局部变量未用作另一个函数的参数时发出警报。当我尝试传递该值时。 这是我的代码,来自文件“test.js”: function test() { var divs = document.getElementsByClassName('post'); for (var i = 0; i < divs.length; i++) { if (divs[i].id != null) { var el

我需要将局部变量值传递给函数。

我的代码只能在局部变量未用作另一个函数的参数时发出警报。
当我尝试传递该值时。

这是我的代码,来自文件“test.js”:

function test() 
{
    var divs = document.getElementsByClassName('post');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id != null) {
            var element = document.createElement("div");
            var currentId = divs[i].id;

            element.className = 'myclass';

           //alert(currentId); <-- Correct value

            element.addEventListener("click", function(){
                alert(currentId);// <-- Value == null ?!
            }, false);

            divs[i].appendChild(element);
        }
    }
}
如果我直接使用divs[I].id而不是currentId var,Chrome控制台将报告:

未捕获的TypeError:无法读取未定义的属性“id”
(匿名函数)

您可以在事件侦听器中动态获取id

element.addEventListener("click", function(e){
    alert(e.target.parentNode.id);
}, false);

您可以在事件侦听器中动态获取id

element.addEventListener("click", function(e){
    alert(e.target.parentNode.id);
}, false);

您可以在事件侦听器中动态获取id

element.addEventListener("click", function(e){
    alert(e.target.parentNode.id);
}, false);

您可以在事件侦听器中动态获取id

element.addEventListener("click", function(e){
    alert(e.target.parentNode.id);
}, false);
“循环中的闭包”问题(请参阅我对您原始帖子的评论)

试试这个

function test() 
{
    var divs = document.getElementsByClassName('post');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id != null) {
            var element = document.createElement("div");
            var currentId = divs[i].id;

            element.className = 'myclass';

            //alert(currentId); <-- Correct value

            element.addEventListener("click", functionFactory(currentId), false);

            divs[i].appendChild(element);
        }
    }
}

function functionFactory(_localId) {
   return function(){
      alert(_localId);
   }
}
功能测试()
{
var divs=document.getElementsByClassName('post');
对于(变量i=0;i
试试这个

function test() 
{
    var divs = document.getElementsByClassName('post');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id != null) {
            var element = document.createElement("div");
            var currentId = divs[i].id;

            element.className = 'myclass';

            //alert(currentId); <-- Correct value

            element.addEventListener("click", functionFactory(currentId), false);

            divs[i].appendChild(element);
        }
    }
}

function functionFactory(_localId) {
   return function(){
      alert(_localId);
   }
}
功能测试()
{
var divs=document.getElementsByClassName('post');
对于(变量i=0;i
试试这个

function test() 
{
    var divs = document.getElementsByClassName('post');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id != null) {
            var element = document.createElement("div");
            var currentId = divs[i].id;

            element.className = 'myclass';

            //alert(currentId); <-- Correct value

            element.addEventListener("click", functionFactory(currentId), false);

            divs[i].appendChild(element);
        }
    }
}

function functionFactory(_localId) {
   return function(){
      alert(_localId);
   }
}
功能测试()
{
var divs=document.getElementsByClassName('post');
对于(变量i=0;i
试试这个

function test() 
{
    var divs = document.getElementsByClassName('post');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].id != null) {
            var element = document.createElement("div");
            var currentId = divs[i].id;

            element.className = 'myclass';

            //alert(currentId); <-- Correct value

            element.addEventListener("click", functionFactory(currentId), false);

            divs[i].appendChild(element);
        }
    }
}

function functionFactory(_localId) {
   return function(){
      alert(_localId);
   }
}
功能测试()
{
var divs=document.getElementsByClassName('post');
对于(变量i=0;i//警报(currentId);这是“循环中的闭包”问题。在执行click处理程序时,创建处理程序的循环已经结束,因此“currentId”的值是上一个循环周期的值(显然是“null”)而不是事件处理程序创建时间的值。解决方案:1.内部闭包,2.函数工厂…两者都将在绑定事件处理程序时关闭currentId的当前值这是“循环中的闭包”问题。在执行click处理程序时,创建处理程序的循环已经结束,因此“currentId”的值是上一个循环周期的值(显然是“null”)而不是事件处理程序创建时间的值。解决方案:1.内部闭包,2.函数工厂…两者都将在绑定事件处理程序时关闭currentId的当前值这是“循环中的闭包”问题。在执行click处理程序时,创建处理程序的循环已经结束,因此“currentId”的值是上一个循环周期的值(显然是“null”)而不是事件处理程序创建时间的值。解决方案:1.内部闭包,2.函数工厂…两者都将在绑定事件处理程序时关闭currentId的当前值这是“循环中的闭包”问题。在执行click处理程序时,创建处理程序的循环已经结束,因此“currentId”的值是上一个循环周期的值(显然是“null”)而不是事件处理程序创建时间的值。解决方案:1.内部闭包,2.函数工厂…都将在绑定事件处理程序时关闭currentId的当前值我认为OP的代码显示单击的
元素
没有类
postdiv
的idde>我认为OP的代码显示点击的
元素
没有原始
div
的id,class
post
我认为OP的代码显示点击的
元素
没有原始
div
的id,class
post
我认为OP的代码显示点击的e> 元素
没有类为
post的原始
div
的id