Вы на правильном пути!И почти там.
После разделения всех имен вам нужно будет сравнить, если одно из приведенных имен каким-то образом соответствует нужному элементу в вашем HTML.Вы можете сделать это несколькими способами, например, проверить innerText
, className
или id
одного из <li class="name name-x">
элементов.
Я изменил ваш HTML так, чтобы каждыйиз ваших <li>
элементов есть id
.Это делает их уникальными и легкими для выбора.Я также дал элементу <input>
значение id
по той же причине.
Для слушателя события прослушайте либо change
, либо input
.Любой из них срабатывает каждый раз, когда значение было изменено, что также означает, что пользователь вводит или вставляет в него строку.В качестве примера я выбрал input
, так как вы захотите, чтобы что-либо происходило только при изменении текста из <input>
.Прочитайте этот другой пост SO , чтобы узнать, в чем заключается разница между change
и input
.
Поскольку я не смог найти функцию jQuery, необходимую для построения на вашем примере, ярешил сделать это с ES6.В вашем примере я вижу, что вы используете цикл for... of
и функцию стрелки, поэтому я предположил, что использование современного JS разрешено.
Я попытался добавить как можно больше подсказок в приведенном ниже примере, объясняющем, чтокаждый кусок кода делает.Если у вас есть какие-либо вопросы относительно кода ниже, не стесняйтесь спрашивать.
Я надеюсь, что это поможет вам.
// Select the input.
const input = document.getElementById('name');
// Select the <li class="name"> elements.
const names = document.querySelectorAll('.name');
// Listen to the 'input' event. This will be triggered whenever the value
// of the input has been changed.
input.addEventListener('input', event => {
// Get the value of the input and split it.
const value = event.target.value;
const splitValues = value.split(' ');
// Get only the values that start with '@' and return the remaining values
// in lowercase, without the '@' symbol, to match with the id attribute later on.
const targetValues = splitValues
.filter(value => value.indexOf('@') === 0) // Only values starting with '@'
.map(value => value.substring(1).toLowerCase()); // '@Name' => 'name'
// Loop over each name element. If one of the values corresponds,
// partially or fully, with the id of the a <li class="name"> element
// add the display class, if not remove the display class.
names.forEach(name => {
if (targetValues.some(value => name.id.includes(value))) { // id === 'name' ?
name.classList.add('display');
} else {
name.classList.remove('display');
}
});
});
.name {
display: none;
}
.name.display {
display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="task-label">
<input id="name" type="text" name="name">
</div>
<ul class="name-list">
<li id="john" class="name name-john">@John</li>
<li id="jake" class="name name-jake">@Jake</li>
<li id="alex" class="name name-alex">@Alex</li>
<li id="allison" class="name name-allison">@Allison</li>
</ul>