Попытка добавить новые объекты в алфавитный список «div»

#javascript #html

#javascript #HTML

Вопрос:

итак, у меня есть пустой массив, как пользователь, вы можете добавлять новые объекты в массив. В html-файле у меня есть список div, отсортированных в алфавитном порядке. Я хочу, чтобы каждый новый объект, созданный пользователем, добавлялся в div с помощью innerHTML, который равен первой букве свойства «name» в новом объекте, созданном пользователем. Я не могу найти алгоритм для этого, может кто-нибудь помочь сделать эту работу?

Существует HTML

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script async src="music.app.js"></script>
    <link rel="stylesheet" href="music.app.css">
    <title>music app</title>
</head>
<body>
    <nav>
        <div>Songs</div>
        <div>Playing</div>
        <div>Playlist</div>
    </nav>
 <div class="add-sort-continer">   
    <div class="sort-nav">=
     <ul>
        <li>Name</li>
        <li>Artist</li>
        <li>Alboms</li>
     </ul>
    </div>
    <button class="add-song"> </button>
 </div>
 <div class="sort-continer">
<div class="sort-name-continer">A</div>
<div class="sort-name-continer">B</div>
<div class="sort-name-continer">C</div>
<div class="sort-name-continer">D</div>
<div class="sort-name-continer">E</div>
<div class="sort-name-continer">F</div>
<div class="sort-name-continer">G</div>
<div class="sort-name-continer">H</div>
<div class="sort-name-continer">I</div>
<div class="sort-name-continer">J</div>
<div class="sort-name-continer">K</div>
<div class="sort-name-continer">L</div>
<div class="sort-name-continer">M</div>
<div class="sort-name-continer">N</div>
<div class="sort-name-continer">O</div>
<div class="sort-name-continer">P</div>
<div class="sort-name-continer">Q</div>
<div class="sort-name-continer">R</div>
<div class="sort-name-continer">S</div>
<div class="sort-name-continer">T</div>
<div class="sort-name-continer">U</div>
<div class="sort-name-continer">V</div>
<div class="sort-name-continer">W</div>
<div class="sort-name-continer">X</div>
<div class="sort-name-continer">Y</div>
<div class="sort-name-continer">Z</div>
<div class="sort-name-continer">@</div>
</div>

<div class="add-song-continer" id="add-song-continer">
    <form id="add-song-form">
      <button class="close-btn" id="close-add-song">X</button>
      <h1 class="h1-add-Song" >Add your song baby</h1>
      <br>
      <input type="text" class="song-name-add" placeholder="Song Name" value=""><br>
      <br>
      <input type="text" class="artist-name-add" placeholder="Artist Name"><br>
      <br>
      <input type="text" class="albom-name-add" placeholder="Albom Name"><br>
      <br>
      <input type="text" class="mp3-file-add" placeholder="Song File"><br>
      <br>
      <input type="text" class="img-add" placeholder="Image"><br>
      <button class="add-song-btn" id = "add-song-btn"> Add Song</button>
    </form>
  </div>

</body>
</html> 

и это JavaScript
Я должен предупредить вас, что файл js плохо организован.
Кроме того, я попытался взять другие свойства из нового объекта, созданного пользователем, и вставить их в новый div как innerHTML, но вы можете игнорировать это, если хотите.

 let songs = [];

const AddSongFunction = (ev) => {
  ev.preventDefault();

   let song = { 
      name: document.querySelector(".song-name-add").value, 
      artist: document.querySelector(".artist-name-add").value,
      albom: document.querySelector(".albom-name-add").value,
      fill: document.querySelector(".mp3-file-add").value,
      img: document.querySelector(".img-add").value
      };
      
  songs.push(song);
  document.querySelector("form").reset();

    console.log(songs);
    }
   

  document.addEventListener("DOMContentLoaded", () => {
    document.getElementById("add-song-btn").addEventListener("click", AddSongFunction )
    
  });

for(let i = 0; i > songs.length;   i){
  appendNewSongToList = () => {
    let newSongDiv = document.createElement('div');
    newSongDiv.className.add("song-continer");
    newSongDiv.innerHTML = `<img class='songImg' url=${this.img}>
    <div class="song-info"> ${this.name}  ${this.artist}  ${this.albom}</div>`;

    if (document.querySelector(".sort-name-continer").innerHTML == this.name.index){
      let sortByName;
      sortByName = document.querySelector(".sort-name-continer");  
  }else{
    defaultSortName = document.querySelector(".sort-name-continer").innerHTML('@');
    sortByName = defaultSortName
  };
  sortByName.appendChild(newSongDiv);
  }; 
  appendNewSongToList();
}; 

В любом случае я очень открыт для новых предложений по улучшению в целом, и я также открыт для критики, заранее большое вам спасибо 😊

Комментарии:

1. Пожалуйста, проверьте мой ответ

Ответ №1:

Если вы можете найти способ добавить дополнительные данные в свои метки DIV сортировки (например, a data-attribute ), это будет легко сделать с помощью следующего решения.

Пожалуйста, подумайте, как я изменил HTML-часть кода. Я добавил data-attr вызываемый sortletter и передаваемый в точности букву, которую вы используете в содержимом div. Вот так:

 <div class="sort-name-continer" data-sortletter="A">A</div>
 

и позже я использовал этот атрибут для выбора правильного элемента:

 document.querySelector(`[data-sortletter="A"]`)
 

Пожалуйста, ознакомьтесь с примером ниже:

 function handleAddSongBtn(){
  const songObj = {
    name: .value, 
    artist: document.querySelector(".artist-name-add").value,
    album: document.querySelector(".album-name-add").value,
    fill: document.querySelector(".mp3-file-add").value,
    img: document.querySelector(".img-add").value
  }
  
  /** 
  * Here is where you select the proper sort label DIV by
  * using `data-sortletter` attribute on the DIVs
  * and first letter of new song's name property
  */
  const sortLabelBox = document.querySelector(`[data-sortletter="${songObj.name.charAt(0)}"]`)
  
  // If any sort label with the given letter exists
  if(sortLabelBox){
    // Then add a new DIV after the sort label DIV
    
    const newSongDiv = document.createElement('div')
    // You can add proper data from song object to this new DIV
    
    // Then do as follow to add this div after the sort label
    sortLabelBox.parentNode.insertAfter(newSongDiv, sortLabelBox)
  }
}

document.addEventListener('click', handleAddSongBtn) 
 <div class="sort-continer">
  <div class="sort-name-continer" data-sortletter="A">A</div>
  <div class="sort-name-continer" data-sortletter="B">B</div>
  <div class="sort-name-continer" data-sortletter="C">C</div>
  <div class="sort-name-continer" data-sortletter="D">D</div>
</div>
  
<button class="add-song-btn" id = "add-song-btn">Add Song</button> 

Альтернативное решение:
в случае, если вы не можете изменить свой HTML-код, чтобы добавить data-attributes

Если вы не можете получить эти data-attribute объекты, вам может потребоваться выполнить цикл, чтобы найти правильную метку DIV. В вашем коде JavaScript вместо запроса, выбирающего DIV data-attr , выполните следующие действия:

 const sortLabelBoxes = document.querySelectorAll('.sort-name-continer')
let properSortLabelBox;

for(let i = 0; i < sortLabelBoxes.length; i  ){
    // if innerHTML equals first letter of the new song
    if(sortLabelBoxes[i].innerHTML === songObj.name.charAt(0)){
       properSortLabelBox = sortLabelBoxes[i]
    }
}
 

Комментарии:

1. Привет, сначала спасибо за ваше время, это код, который я написал code const sortLabelBoxes = document . querySelectorAll(‘.sort-name-continer’) пусть properSortLabelBox; for(пусть i = 0; i < Сортировочные метки. длина; i ){ // если innerHTML равен первой букве новой песни, если (sortLabelBoxes[i].innerHTML === songObj.name.charAt(0)){ properSortLabelBox = sortLabelBoxes[i] } } если у меня есть какие-либо ошибки, я буду рад узнать, кроме тогокуда мне поместить код в моем исходном коде? потому что я не смог заставить код работать на меня.