【问题标题】:Pass contextual variable to onclick event handler as argument将上下文变量作为参数传递给 onclick 事件处理程序
【发布时间】:2016-09-10 04:51:07
【问题描述】:

*这发生在更大的代码块中,在 for 循环中。整个循环见帖子结尾。

我已经阅读了所有关于这个主题的帖子,但我仍然迷路。

我正在尝试将onclick 事件分配给复选框。分配给onclick 事件的函数需要能够访问在定义复选框的范围内可用的变量 (idvariable)。

var idvariable = parentChildList[i].children[j]["subjectid"];
var input = document.createElement("input");
input.type = "checkbox";
input.value = "";
input.onclick = function () {
   return clicked(idvariable);
};

function clicked(id) {
   alert(id); 
};

我已经尝试了内联函数和命名函数的所有变体,但我不知道如何让单击的函数访问idvariable。在上面的示例中,该变量的值是未定义的。

或者,如果我用这种方式尝试:

var input = document.createElement("input");
input.type = "checkbox";
input.value = "";

var idvariable = parentChildList[i].children[j]["subjectid"];
input.onclick = function (idvariable) {
  return clicked(idvariable);
};

function clicked(id) {
   alert(id); 
};

我收到一条提示 [object MouseEvent]。与以下相同,我从分配给onclick 事件的方法名称中删除了()

var idvariable = parentChildList[i].children[j]["subjectid"];
input.onclick = function () {
   return clicked;
}(idvariable);

function clicked(id) {
   return alert(id); 
};

*整个循环:

    for (var i = 0; i < parentChildList.length; i++) {
        var row = table1.insertRow(-1);
        var cell = row.insertCell(0);
        cell.innerHTML =
            "<h4 class=\"panel-title\"><a data-toggle=\"collapse\" data-parent=\"#accordion\" href=\"#collapse" + i + "\">" + parentChildList[i]["title"] + "</a></h4>";

        if (parentChildList[i].children.length > 0) {
            var row2 = table1.insertRow(-1);
            var cell2 = row2.insertCell(0);

            var table2 = document.createElement("table");
            table2.className = "collapse";
            table2.id = "collapse" + i;
            cell2.appendChild(table2); 

            for (var j = 0; j < parentChildList[i].children.length; j++) {
                var row3 = table2.insertRow(-1);
                var cell3 = row3.insertCell(0);
                var div = document.createElement("div");
                div.className = "checkbox";

                var label = document.createElement("label");
                label.innerText = parentChildList[i].children[j]["title"];

                var input = document.createElement("input");
                input.type = "checkbox";
                input.value = "";
                input.setAttribute('subj', idvariable);

                var idvariable = parentChildList[i].children[j]["subjectid"];
                alert(idvariable); 
                input.onclick = function () {
                    return clicked(this.getAttribute('subj'));
                };

                function clicked(id) {
                    return alert(id); 
                };

                cell3.style.padding = "0px 0px 0px 10px";
                cell3.style.fontsize = "x-small";

                cell3.appendChild(div);
                div.appendChild(label);
                label.insertBefore(input, label.childNodes[0]);
            }
        }
    }

【问题讨论】:

  • 这里显然没有显示一些代码。我猜你是在循环中执行此操作,基于通常用作计数器的 ij 变量。这是一个会影响答案的重要细节。
  • 没错,迈克。我没有意识到这会影响这段代码的行为。
  • 用更大的代码 sn-p 更新。

标签: javascript onclick dom-events


【解决方案1】:

onclick 处理程序接收Event 对象。如果附加为elem.onclick=handler 的处理程序,则该元素在处理程序内作为this 可用。所以这是解决方法。

var idvariable = parentChildList[i].children[j]["subjectid"];
var input = document.createElement("input");
input.type = "checkbox";
input.value = "";
input.setAttribute('data-subj', idvariable); 
input.onclick = function () {
   return clicked(this.getAttribute('data-subj'));
};

function clicked(id) {
   alert(id); 
};

【讨论】:

  • 效果很好!谢谢亚历克斯!
【解决方案2】:

您必须先使用以下代码将复选框附加到某个现有元素。

 var element = document.getElementById("one").appendChild(input);

然后您可以使用类似以下的方式获取父级...

 var x = document.getElementById("someId").parentElement;

其中 x 将包含父元素。

此链接https://stackoverflow.com/a/9418326/886393 是关于事件(自定义事件)中的自定义数据。希望对您有所帮助。

谢谢

帕拉斯

【讨论】:

  • 感谢您的回答帕拉斯,但我不认为它解决了我的问题。我试图弄清楚如何访问 onclick 事件中的变量。
  • 我也不认为这是相同的情况。我没有自定义事件,只是将基本功能分配给 onclick 事件。
猜你喜欢
  • 2012-08-30
  • 2018-08-03
  • 1970-01-01
  • 2011-10-05
  • 2011-07-26
  • 2021-05-30
相关资源
最近更新 更多