Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

JavaScript Interactive Web Pages with JavaScript Traversing and Manipulating the DOM with JavaScript Perform: Modifying Elements

Jonas Troyer
Jonas Troyer
10,912 Points

Can't get text from the add button to add text to the to do list.

When I go to add something to the to do list in the app, it comes up with no text. Everything else is working.

//Problem: User interaction doesn't provide user interaction desired.
//Solution: Add interactivity so the user can manage daily tasks.
var taskInput = document.getElementById("new-task"); //new-task
var addButton = document.getElementsByTagName("button")[0]; //first button
var incompleteTasksHolder = document.getElementById("incomplete-tasks"); //incomplete-task
var completeTasksHolder = document.getElementById("completed-tasks"); //completed-tasks

//Each element needs modifying



//New Task List Item
var createNewTaskElement = function(taskString){
  //Create List item
  var listItem = document.createElement("li");
    //input checkbox
  var checkBox = document.createElement("input");
    //label
  var label = document.createElement("label");
    //input (text)
  var editInput = document.createElement("input");
    //button.edit
  var editButton = document.createElement("button");
    //button.delete
  var deleteButton = document.createElement("button");

    //Each element, needs to be modifying

checkBox.type = "checkbox";
editInput.type = "text";

editButton.innerText = "Edit";
editButton.className = "edit";
deleteButton.innertext = "Delete";
deleteButton.className = "delete";
label.innterText = taskString;

    //Each Element needs appendeding
  listItem.appendChild(checkBox);
  listItem.appendChild(label);
  listItem.appendChild(editInput);
  listItem.appendChild(editButton);
  listItem.appendChild(deleteButton);



  return listItem;
}

//Add a new task
var addTask = function() {
  console.log("Add task...");
  //When button is pressed
  //Create new list item with the text from the new task
  var listItem = createNewTaskElement(taskInput.value);

  //append listItem to incompleteTaskHolders
  incompleteTasksHolder.appendChild(listItem);
  bindTaskEvents(listItem, taskCompleted);

}
//Edit an existing task
var editTask = function() {
  console.log("edit task...");
  //When the edit button is pressed
    //if the class of the parent has the class edit mode
      //Switch from .editMode
      //Label text become the input
     //else
      //Switch to editMode
      //Input value becomes the labels text
    //toggle .editMode on the parent
}

//Delete an existing task
var deleteTask = function () {
  console.log("Delete Task...");
  //When the delete button is pressed
    //Remove the parent list item
  var listItem = this.parentNode;
  var ul = listItem.parentNode;
  ul.removeChild(listItem);
}
//Mark a task as complete
var taskCompleted = function() {
    console.log("Task complete");
  //When the checkbox is checked
  var listItem = this.parentNode;
  completeTasksHolder.appendChild(listItem);
  bindTaskEvents(listItem, taskIncomplete);
    //append the task list item 
}
//Mark a task as incomplete
var taskIncomplete = function() {
  console.log("Task incomplete");
  //When the checkbox is unchecked append this to imcomplete tasks
   var listItem = this.parentNode;
  incompleteTasksHolder.appendChild(listItem);
  bindTaskEvents(listItem, taskCompleted);
}

var bindTaskEvents = function(taskListItem, checkBoxEventHandler) {
  console.log("Bind Events to an Item");
  //select taskListItem's children
  var checkBox = taskListItem.querySelector("input[type=checkbox]");
  var editButton = taskListItem.querySelector("button.edit");
  var deleteButton = taskListItem.querySelector("button.delete");

    //bind editTask to edit button
  editButton.onclick = editTask;
    //bind deleteTask to delete button
  deleteButton.onclick = deleteTask;
    //bind taskCompleted to the checkbox
  checkBox.onchange = checkBoxEventHandler;

}

//Set the click handler to the addTask function
addButton.onclick = addTask;

//cycle over incompleteTaskHolder ul list items
for(var i=0; i<incompleteTasksHolder.children.length; i++) {
  //for each list item
    //bind events to list item's children
  bindTaskEvents(incompleteTasksHolder.children[i], taskCompleted);
}

//cycle over completeTaskHolder ul list items
for(var i=0; i<completeTasksHolder.children.length; i++) {
  //for each list item
    //bind events to list item's children
  bindTaskEvents(completeTasksHolder.children[i], taskIncomplete);
}

1 Answer

Juan Segura
Juan Segura
5,736 Points

Hi Jonas, there is a mistake just above the comment:

//Each Element needs appendeding

You have:

label.innterText = taskString;

And it is:

label.innerText = taskString;