Front end case: my memo (supports the addition, deletion and modification of events, and the code is complete)

This case does not use any framework. It is implemented using js native and DOM operation. The code is complete and can be copied and used immediately.

catalogue

1, Case effect

2, Key points involved

1. Event monitoring

2. DOM node operation

(1) Common node acquisition methods

(2) Common node information acquisition methods

(3) Common node attribute acquisition method

(4) DOM modification

(5) DOM add

(6) DOM deletion

3. DOM controls CSS Style

(1) Control the style through the style attribute

(2) Control style through classList:

3, Full code + detailed comments

1, Case effect

As shown in the figure below, the memo can add new events, edit events, delete existing events, and mark completed events.

2, Key points involved

1. Event monitoring

The corresponding event can be triggered only after the event source is bound to the event. There are three ways of event binding: in-line event attribute assignment, event attribute assignment, and event listening.

This case uses the event listening method for event binding. The difference between this case and the other two methods is that if the event attribute is assigned multiple times, only the last event handler will be executed; Event listener can add multiple listeners and execute multiple event handlers.

The event listening format is:

addEventListener(type, listener, useCapture)

//Type: event type
//Listener: listener (handler)
//useCapture: the default is false. When set to true, the listener will not be triggered due to bubbling

//eg: 
const btn = document.querySelector('button');
btn.addEventListener('click', function() {
  alert('event listeners ')
})

2. DOM node operation

(1) Common node acquisition methods

namedescribe
getElementById()Gets the node with the specified id
getElementsByTagName()Gets the collection of nodes with the specified tag name
querySelector()Gets the first node that matches the specified selector or selector group
querySelectorAll()Gets a collection of all nodes that match the specified selector or selector group

(2) Common node information acquisition methods

namedescribe
innerHTMLReturns all HTML content (text and tags) contained in an element of type string
parentNodeReturns the parent node of the specified node
childrenReturns the collection of child element nodes of the specified element
firstElementChildReturns the first child element node of the specified element
lastElementChildReturns the last child element node of the specified element

(3) Common node attribute acquisition method

namedescribe
getAttribute()Returns a specified attribute value of an element
Get directly using the attribute nameApplicable to some attributes (e.g. title, value, href)

(4) DOM modification

namedescribe
innerHTMLinnerHTML can not only obtain the element content, but also modify the content in the element through assignment. If the modified content contains html, the string will be parsed into html elements
setAttribute(name,value)Sets an attribute value on the specified element. If the attribute already exists, update the value; Otherwise, add a new attribute with the specified name and value
Change properties by property nameReassign the element attribute to change the corresponding attribute value

(5) DOM add

namedescribe
createElement(tagName)Create an HTML element specified by the tag name tagName
appendChild(node)Inserts a node at the end of the child node list of the specified parent node
insertAdjacentHTML(position, text)

Parse the specified text into an HTML string and insert it into the specified location (IE unfriendly)

Position (position of the content relative to the current element):

  • 'before begin': before the element itself

  • 'after begin': before inserting the first child node inside the element

  • 'before end': after inserting the last child node inside the element

  • 'after end': after the element itself

(6) DOM deletion

namedescribe
removeChild(child)To delete the selected child node, you need to specify its parent element
remove()Delete selected node (IE unfriendly)

3. DOM controls CSS Style

(1) Control the style through the style attribute

box.style.color = "#fff "; / / set the text in the element to white 
box.style.marginLeft = "100px"; //Set the left outer margin of the element to 100px 

(2) Control style through classList:

namedescribe
add(class1, class2, ...)Add one or more class names
remove(class1, class2, ...)Remove one or more class names
replace(oldClass, newClass)Replace class name
contains(class)Determines whether the class name exists and returns a Boolean value

toggle(class, true|false)

If the class name exists, it will be removed, otherwise it will be added. The second parameter means that the class name will be forcibly added (true) or deleted (false) regardless of whether it exists or not

3, Full code + detailed comments

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My memo</title>
  <style>
    button {
      cursor: pointer;
    }

    input {
      outline: none;
      background-color: antiquewhite;
      border: none;
      border-radius: 3px;
      width: 250px;
      height: 30px;
      margin: 15px;
    }

    input::-webkit-input-placeholder {
      color: #999;
    }

    /* Solve the problem that li previous points still occupy space after deletion */
    ul {
      padding: 0;
      margin: 0;
    }

    ul>li {
      list-style: none;
    }

    .border {
      width: 500px;
      background-color: #999;
      border-radius: 20px;
      margin: auto;
      padding-bottom: 20px;
    }

    .border .title {
      font-size: 24px;
      color: aliceblue;
      line-height: 50px;
      text-align: center;
    }

    .form {
      width: 80%;
      margin: 15px auto;
    }

    .form #add {
      width: 100px;
      height: 30px;
      border-radius: 5px;
      border: 0;
      font-weight: 600;
      font-size: 16px;
      color: #999;
      letter-spacing: 6px;
    }

    /* Each li represents each event */
    .item {
      display: flex;
      justify-content: space-between;
      line-height: 30px;
      font-size: 14px;
      color: rgb(75, 73, 73);
      padding: 5px 0;
      border-bottom: 1px solid white;
    }

    .item .info {
      margin-left: 10px;
    }

    .list .item .edit,
    .fin,
    .del {
      width: 50px;
      height: 30px;
      border: 0;
      border-radius: 5px;
      color: white;
    }

    .edit {
      background-color: #337ab7;
    }

    .fin {
      background-color: #20c248;
    }

    .del {
      background-color: #d9534f;
    }

    .btn {
      display: inline-block;
      width: 180px;
      margin-right: 0;
    }

    /* Click the finish button to add the new class name finished */
    .finished {
      color: rgb(112, 110, 110);
      background-color: rgb(197, 190, 190);
      border-radius: 3px
    }

    .finished>.info {
      /* Add strikeouts to text */
      text-decoration: line-through;
    }
  </style>
</head>

<body>
  <!-- Memo outer border -->
  <div class="border">
    <!-- title -->
    <div class="title">My memo</div>
    <hr>
    <!-- Input boxes and buttons -->
    <div class="form">
      <input type="text" name="text" placeholder="Please fill in your event">
      <button id="add">add to</button>
    </div>

    <!-- Memo event list -->
    <div
      style="width: 94%;margin: auto;border-radius: 3px;box-shadow: 2px 2px rgb(119, 115, 115);background-color: rgb(214, 219, 219);">
      <ul class="list">
        <li class="item">
          <!-- Event area -->
          <span class="info">Event 1</span>
          <!-- Button area -->
          <div class="btn">
            <button class="edit">edit</button>
            <button class="fin">complete</button>
            <button class="del">delete</button>
          </div>
        </li>
        <li class="item">
          <!-- Event area -->
          <span class="info">Event 2</span>
          <!-- Button area -->
          <div class="btn">
            <button class="edit">edit</button>
            <button class="fin">complete</button>
            <button class="del">delete</button>
          </div>
        </li>
      </ul>
    </div>
  </div>
</body>

<script>
  var input = document.querySelector('.form input'); //Get event input box
  var addBtn = document.querySelector('#add'); // Get add button
  var list = document.querySelector('.list'); //Get event list ul

  //Click the Add button
  addBtn.addEventListener('click', function () { //Using the listener addEventListener
    //Use DOM to add insertAdjacentHTML. The first parameter: the location of the addition; Second parameter: added content
    //Each added li is added before the first li in the ul (after begin)
    list.insertAdjacentHTML('afterbegin', `
    <li class="item">
          <!-- Event area -->
          <span class="info">${input.value}</span>
          <!-- Button area -->
          <div class="btn">
            <button class="edit">edit</button>
            <button class="fin">complete</button>
            <button class="del">delete</button>
          </div>
        </li>
    `);

    //Due to the previous settings, after clicking the Add button, the new element item will be added before the first child node inside the inserted element
    //Therefore, we should operate on the first child element node of the list, otherwise the new event cannot be deleted, modified and completed
    //delete
    list.firstElementChild.querySelector('.del').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.remove()
    })
    //complete
    list.firstElementChild.querySelector('.fin').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.classList.add('finished')
    })
    //modify
    list.firstElementChild.querySelector('.edit').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.querySelector('.info').innerText = prompt('Please modify your event:')
    })
  })

  var delBtns = document.querySelectorAll('.del'); //Get delete button
  var finBtns = document.querySelectorAll('.fin'); //Get Finish button
  var editBtns = document.querySelectorAll('.edit'); //Get Edit button

  //Traversal, several delete buttons are equivalent to several events (li)
  for (var idx = 0; idx < delBtns.length; idx++) {
    //Click the delete button
    delBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode //Delete the parent of the button parent, that is, the li with the class name item (the row where the button is located), and a li is an event row
      item.remove(); //Click the delete button to delete this item li
    })

    //Click the finish button
    finBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode; //Get the event line
      //The classList attribute can return a collection of element class attributes
      item.classList.add('finished'); //After clicking the finish button, add a new class name finished for this line to implement the new style
    })

    //Click the Edit button
    editBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode; //Get the event line
      item.querySelector('.info').innerText = prompt('Please modify your event:'); //Click Edit to insert the content into span with the class name info and a system prompt box will pop up
    })
  }
</script>

</html>

Keywords: Javascript Front-end html css DOM

Added by Brokenhope on Wed, 19 Jan 2022 10:09:59 +0200