Почему мой код javascript дублирует код li? - PullRequest
1 голос
/ 29 марта 2020

Я Javascript новичок (это моя первая javascript программа), и у меня есть несколько проблем с моим мини-приложением ...

Я пытаюсь создать страницу, которая позволяет вам выберите, кто был в вашей команде, работающей с вами сегодня. Пользователь должен иметь возможность создать свой собственный список из списка имен.

Когда пользователь нажимает «Добавить в команду», он должен удалить соответствующий <li> и добавить его в выбранный список ниже. ,

Кнопка должна измениться с Добавить в команду на Удалить

Я изо всех сил пытаюсь изменить текстовое содержимое кнопки, если пользователь решит добавить, затем удалить, а затем добавить то же самое <li> ...

Я много чего пробовал, это моя последняя попытка:

'script type="text/javascript"';

    var selected = document.querySelector('#selected-list ul');
    var team = document.querySelector('#team-list ul');
    var searchBar = document.forms['search-employees'].querySelector('input');

//add to the selected team
 team.addEventListener("click", function(e){
	if(e.target.className == 'add'){
        
        const li = document.createElement('li');
        const employeename = document.createElement('span');
        const deleteBtn = document.createElement('span');
    
        //add content
        deleteBtn.textContent = 'add';
        employeename.textContent = e.target.parentElement.firstElementChild.textContent;
        
        //add classes
        employeename.classList.add("name");
        deleteBtn.classList.add('delete');
    
        // append to document
        li.appendChild(employeename);
        li.appendChild(deleteBtn);
        selected.appendChild(li);  
        console.log(deleteBtn);
    }
})
	
//delete teammate from selected team
selected.addEventListener('click', function(e){    

    if(e.target.className == 'delete'){
        const li = document.createElement('li');
        const employeename = document.createElement('span');
        const addBtn = document.createElement('span');
    
        //add content
        addBtn.textContent = 'delete';
        employeename.textContent = e.target.parentElement.firstElementChild.textContent;
	
        //add classes
        employeename.classList.add("name");
        addBtn.classList.add('add');
    
        // append to document
        li.appendChild(employeename);
        li.appendChild(addBtn);
        team.appendChild(li);  
        //delete from selected
        console.log(addBtn);
    }				
})
//add a new employee - listen to submit event from form
var addForm = document.forms['add-employee'];

addForm.addEventListener('submit', function(e){
	e.preventDefault(); //prevent default behavior
	const value = addForm.querySelector('input[type="text"]').value;
    console.log(value);
		
	//create elements
	const li = document.createElement('li');
	const employeename = document.createElement('span');
	const deleteBtn = document.createElement('span');
    
	//add content
	deleteBtn.textContent = 'delete';
	employeename.textContent = value;
	
    //add classes
    employeename.classList.add("name");
    deleteBtn.classList.add('delete');
    
	// append to document
	li.appendChild(employeename);
	li.appendChild(deleteBtn);
	selected.appendChild(li);  
    
    //apply style
    
})


//filter names
//grab a reference to the form

searchBar.addEventListener('keyup', function(e){
    //term the user is searching
    const term = e.target.value.toLowerCase();
    //names to compare
    const names = team.getElementsByTagName('li');

    Array.from(names).forEach(function(name){
        const fullname = team.firstElementChild.textContent;
        //check if name exists
        if(fullname.toLowerCase().indexOf(term) != -1){
            name.style.display = 'block';
        } else {
            name.style.display = 'none';
        }
    
    })
                           
})

Это дает мне следующий результат: Каждый раз, когда я нажимаю кнопку, он дает мне дубликат (то же самое для входного сигнала Товарищ по команде не найден) Более того, я все еще не могу После удаления вернитесь к "Добавить в команду" ...

Надеюсь, вы, ребята, сможете меня просветить, возможно, я потратил на это слишком много времени, но не могу сейчас выяснить ...

Это несколько подписей о том, что он делает: введите описание изображения здесь

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

Спасибо HTML:

<?php 
	require_once 'core/init.php';	
	include 'includes/checkedboxes.php';
	include 'includes/headerfront.php';
	//include_once 'includes/dbh.inc.php';
	if(Session::exists('Success')){	
		echo Session::flash('Success');
	}
?>
<html>

<head>
  <link rel="stylesheet" href="styleChief.css">

</head>

<body>
  <section class="team">
    <div id="wrapper">
      <div id="container-left">
        <div id="search">
          <h2 class="title">Who was in your team today?</h1>
            <form id="search-employees">
              <input type="text" name="search" placeholder="Search a name..">
            </form>
        </div>

        <div id="team-list">
          <h3 class="title">Team list</h3>
          <p>Select today's teammates</p>
          <ul>
            <li>
              <span class="name">name</span>
              <span class="add">Add to the team</span>
            </li>
            <li>
              <span class="name">name 1</span>
              <span class="add">Add to the team</span>
            </li>
            <li>
              <span class="name">name 2</span>
              <span class="add">Add to the team</span>
            </li>
            <li>
              <span class="name">name 3</span>
              <span class="add">Add to the team</span>
            </li>
          </ul>
        </div>

        <div id=newmember class="newmember">
          <h4>
            <a class="not-found" href="#"><img class="img" src="img/not-found.png" width="20" height="20" alt="not-found">
            </a>Teammate not found?</h4>
          <form id="add-employee">

            <h3 class="title">Add a new member:</h3>
            <input type="text" placeholder="New teammate name">
            <button>Add</button>

          </form>
        </div>
      </div>

      <div id="container-right">
        <h2>Selected</h2>
        <div id="selected-list">
          <h3 class="title">You have selected the following teammates for today: </h3>
          <ul>

          </ul>
        </div>
      </div>
    </div>
  </section>

  <section class="part">

    <h2>Which part(s) have you been working on today?</h2>
    <input type="checkbox" name="checklist-part" value="Decoratives"><label>Decoratives</label>
    <input type="checkbox" name="checklist-part" value="Windows"><label>Windows</label>
    <input type="checkbox" name="checklist-part" value="Signage Gibela"><label>Signage Gibela</label>
    <input type="checkbox" name="checklist-part" value="Signage Prasa"><label>Signage Prasa</label>
    <input type="checkbox" name="checklist-part" value="Stripes"><label>Stripes</label>
    <input type="checkbox" name="checklist-part" value="Other"><label>Other</label><br/>
    <input type="submit" name="submit" value="Continue" /><br/>

    </form>

  </section>
  <?php
			$sql="SELECT * FROM dttechnames;";
			$result=mysqli_query($conn,$sql);

		?>

    <script src="app/app.js"></script>
    <script src="app/app.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</body>

</html>

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Я попытался исправить несколько проблем с вашим фрагментом (например, отсутствовал тег <form>). По сути, вы слишком усердно работали над сценарием. Если вы хотите переместить <li> с одного <ul> на другой, то проще всего просто .appendChild() его достичь до цели <ul>. Это автоматически удалит его из исходного родителя <ul>. Поскольку операция «перемещение» является универсальной для всех членов команды - <li> s - независимо от того, являются ли они частью «команды» или «выбранной» группы - мы можем использовать один прослушиватель событий «щелчок» для всех из них , Я добавил его во внешний #wrapper div.

Следующий фрагмент охватывает только часть выбора участника команды (для ясности я удалил все остальные компоненты сценария), но он должен продемонстрировать основные c баллы:

var grps=['#selected','#team'].map(s=>document.querySelector(s+'-list ul')),
    btn=['Add to the team','Remove from the team'];    
[...grps[1].querySelectorAll('.move')].forEach(sp=>sp.textContent=btn[0])

// move members ...
document.querySelector('#wrapper').addEventListener("click", function(e){
  if(e.target.classList.contains('move')){
    var i=btn.indexOf(e.target.textContent); // i=0 (Adding)  or  i=1 (Removing) ?
    e.target.textContent=btn[1-i];           // exchange button caption
    grps[i].appendChild(e.target.parentNode) // move team member ...
  }
})
li {margin: 10px}
.move{
    float: right;
    background: #9361bf;
    padding:4px;
    border-radius: 3px;
}
<section class="team">
    <div id="wrapper">
      <div id="container-left">
        <div id="search">
          <h2 class="title">Who was in your team today?</h1>
            <form id="search-employees">
              <input type="text" name="search" placeholder="Search a name..">
            </form>
        </div>

        <div id="team-list">
          <h3 class="title">Team list</h3>
          <p>Select today's teammates</p>
          <ul>
            <li>
              <span class="name">Roman BARON</span>
              <span class="move"></span>
            </li>
            <li>
              <span class="name">Vincent Houdeville</span>
              <span class="move"></span>
            </li>
            <li>
              <span class="name">Jayson Abrams</span>
              <span class="move"></span>
            </li>
            <li>
              <span class="name">Bafana Hlongwane</span>
              <span class="move"></span>
            </li>
          </ul>
        </div>

        <div id=newmember class="newmember">
          <h4>
            <a class="not-found" href="#"><img class="img" src="img/not-found.png" width="20" height="20" alt="not-found">
            </a>Teammate not found?</h4>
          <form id="add-employee">

            <h3 class="title">Add a new member:</h3>
            <input type="text" placeholder="New teammate name">
            <button>Add</button>

          </form>
        </div>
      </div>

      <div id="container-right">
        <h2>Selected</h2>
        <div id="selected-list">
          <h3 class="title">You have selected the following teammates for today: </h3>
          <ul>

          </ul>
        </div>
      </div>
    </div>
  </section>

  <section class="part">

    <h2>Which part(s) have you been working on today?</h2>
    <form id="parts">
    <label><input type="checkbox" name="checklist-part" value="Decoratives">Decoratives</label>
    <label><input type="checkbox" name="checklist-part" value="Windows">Windows</label>
    <label><input type="checkbox" name="checklist-part" value="Signage Gibela">Signage Gibela</label>
    <label><input type="checkbox" name="checklist-part" value="Signage Prasa">Signage Prasa</label>
    <label><input type="checkbox" name="checklist-part" value="Stripes">Stripes</label>
    <label><input type="checkbox" name="checklist-part" value="Other">Other</label><br/>
    <input type="submit" name="submit" value="Continue" /><br/>

    </form>

  </section>

Похоже, это был первый вопрос, который вы разместили в StackOverflow, поэтому запоздало: "Добро пожаловать!"

Но Я хотел бы отметить, что ваш вопрос был излишне длинным и сложным. Вы должны попытаться сосредоточиться на одной точке на вопрос. Это сделало бы намного более доступным для других участников Stackoverflow возможность отвечать без необходимости сначала просматривать большие куски кода.

И еще одно последнее замечание: вы пометили свой вопрос с помощью jQuery, но поскольку вы не использовали в вашем скрипте я также удалил тег script src="...jquery..."></script> из своего фрагмента. Я бесконечно благодарен Джону Резигу за то, что он дал нам jQuery, но в современных браузерах вы теперь можете в основном обходиться без него.

0 голосов
/ 29 марта 2020

После попытки решения проблем с автомобилем у меня возникло несколько проблем.

1. Стиль css моего "Добавить в команду" исчез. Я, конечно, изменил свой код выше:

.add,.delete {
    float: right;
    background: #9361bf;
    padding:6px;
    border-radius: 4px;
}

на:

.move{
    float: right;
    background: #9361bf;
    padding:6px;
    border-radius: 4px;
}

, но не стилизовал класс. Может быть, move - это зарезервированное ключевое слово?

В любом случае, у меня есть другая проблема:

2. Это решение перемещает выбранный «li», но внутри того же <ul>.

Когда я делаю console.log(e.target.textContent) сразу после if(e.target.classList.contains('move')), я вижу, что оно содержит «Добавить в команду» и «Удалить из команды».

Я обнаружил, что он ведет себя так, как будто я нажал два раза, но я нажал только один раз.

Почему?

Спасибо, ребята за ваши ответы !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...