onchange 属性:从中调用函数时的上下文到底是什么?

onchange attribute: what exactly is the context when calling a function from this?

所以我正在尝试制作一个简单的待办事项列表,其中我创建的每个列表项都有复选框。每次我更改与某个任务关联的复选框时,我都想调用一个函数,该函数将有一个 if else 语句。 if else 语句会告诉我该框是选中还是未选中,并根据该逻辑执行代码。问题是,我不知道如何访问我所指的特定复选框,因为每个任务都是通过 javascript 创建的,并且没有唯一的 ID。

话虽如此,我的问题是:

如何引用我正在更改的特定复选框?我使用 "this" 关键字吗?如果是这样,"this" 在这种特定情况下到底指的是什么?

这是我的js代码:

$("#add").button();
$("#remove").button();

  //Constructor for ToDo Object
  function ToDo(name){
    this.name = name;
  }

  ToDo.prototype.addItem = function(string){

    var list = document.querySelector("#list");
    var listItem = document.createElement("div");
    var listItemPar = document.createElement("p");
    var listItemText = document.createTextNode(string);
    var checkBox = document.createElement("input")
    checkBox.setAttribute('type','checkbox');
    checkBox.className = "checkBoxes"
    checkBox.setAttribute("onchange","checkedBoxes()")
    var removeButton = document.createElement("button")
    removeButton.className = "removeButtons"
    list.appendChild(listItem);
    listItem.appendChild(listItemPar);
    listItemPar.appendChild(listItemText);
    listItem.appendChild(checkBox);
    listItem.appendChild(removeButton);
    $("button.removeButtons").button();
    $(".removeButtons").hide();
    document.querySelector("#input").value = "";
  };

  ToDo.prototype.removeItem = function(){
    console.log("remove item");
  }


document.querySelector("#remove").addEventListener("click",function(){
  item = new ToDo();
  item.removeItem();
  window.alert("hi");
})

document.querySelector("#add").addEventListener("click",function(){
  var item = new ToDo();
  item.addItem(document.querySelector("input").value);
})


function checkedBoxes(){
  //function I am referring to
}

所以在代码中,我指的是checkBox.setAttribute("onchange","checkedBoxes()"),函数在最下面。 HTML 真的不是特别重要,因为我几乎所有的东西都是通过 javascript 创建的,但如果你需要查看它以帮助我知道。

提前致谢

要回答您的问题,您必须在此处传递 this 关键字 checkBox.setAttribute("onchange", "checkedBoxes(this)")

this指的是当前元素。

Here is a working example

script.js

$(document).ready(function() {

    //Constructor for ToDo Object
    function ToDo(name) {
        this.name = name || "";
    }

    ToDo.prototype.addItem = function(string) {
        var list = document.querySelector("#list");
        var listItem = document.createElement("li");
        var listItemPar = document.createElement("p");
        var listItemText = document.createTextNode(string);
        var checkBox = document.createElement("input")
        checkBox.setAttribute('type', 'checkbox');
        checkBox.className = "checkBoxes"
        checkBox.setAttribute("onchange", "checkedBoxes(this)")
        var removeButton = document.createElement("button")
        removeButton.setAttribute('type', 'button');
        removeButton.className = "removeButtons"
        list.appendChild(listItem);
        listItem.appendChild(listItemPar);
        listItemPar.appendChild(listItemText);
        listItem.appendChild(checkBox);
        listItem.appendChild(removeButton);
        $(".removeButtons").hide();
        document.querySelector("input").value = "";
    };

    ToDo.prototype.removeItem = function() {
        console.log("remove item");
    }
    $("#remove").click(function(e) {
        var item = new ToDo();
        item.removeItem();
        window.alert("hi");
    });

    $("#adder").click(function(e) {
        console.log("add clicked");
        var item = new ToDo("dd");
        item.addItem(document.querySelector("input").value);
    });

    $("#list").css("border", "3px solid red");


});

function checkedBoxes(thisCheckbox) {
    //function I am referring to
    console.log(thisCheckbox);
}

HTML

<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@2.0.1" data-semver="2.0.1" src="http://code.jquery.com/jquery-2.0.1.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet" data-semver="3.3.6" data-require="bootstrap-css@*" />
    <script src="script.js"></script>
  </head>

  <body class="container">
    <input type="text" name="userinput" />
    <button type="button" id="adder">Add</button>
    <button type="button" id="remove">Remove</button>
    <hr />
    <ul id="list" data-hello="world"></ul>
  </body>

</html>