Вызов всех элементов массива [0,1,2,3] ПОМИМО указанного элемента [например. 3] с использованием индекса

Мне нужно удалить все кнопки, кроме той, на которую нажали (возможно, с помощью e.target.id?) — по ее индексу (с помощью for цикла.

Я попытался создать переменную и объявил ее let buttonsX = buttons[i], чтобы позже в операторе if ссылаться на нее как на !buttonsX, а затем она вызывала все кнопки массива, ЗА ИСКЛЮЧЕНИЕМ кнопки с текущим индексом (вызванной событием mousedown).

Но ничего не произошло.

Я читал, что есть функции pull() и splice(), но они просто потребуют ненужных строк кода, которые можно было бы предотвратить с помощью меньшего кода.

Кроме них - я не нашел в Интернете ресурсов о такой функции.

Кроме того, это должен быть чистый JavaScript,

Большое спасибо.

Можете ли вы добавить весь соответствующий HTML-код и код JS, который вы написали, в вопрос, чтобы мы могли видеть контекст, в котором вы работаете?

Rory McCrossan 29.07.2024 11:56

Внутри прослушивателя кликов вы можете получить ссылку на «кнопку, по которой только что нажали» по ключевому слову this или свойству event.target. Вы можете проверить свой массив кнопок, чтобы увидеть, равны ли они this, а если нет, скрыть их.

James 29.07.2024 12:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете просто использовать .filter() и проверить, отличаются ли элементы от тех, которые вас не интересуют:

let myArray = [...document.querySelectorAll(".container > button")];
console.info(myArray);

let filteredArray = myArray.filter(item => (item !== document.getElementById("btn-5")));

for (let element of filteredArray) {
    element.style.backgroundColor = "green";
}
<div class = "container">
    <button id = "btn-1">1</button>
    <button id = "btn-2">2</button>
    <button id = "btn-3">3</button>
    <button id = "btn-4">4</button>
    <button id = "btn-5">5</button>
    <button id = "btn-6">6</button>
    <button id = "btn-7">7</button>
    <button id = "btn-8">8</button>
    <button id = "btn-9">9</button>
    <button id = "btn-10">10</button>
    <button id = "btn-11">11</button>
</div>

Большое спасибо!! Он работает отлично!!

Stuck Overflow 29.07.2024 13:55

@StuckOverflow рад помочь

Lajos Arpad 29.07.2024 15:06

Чтобы выполнить эту задачу на чистом JS, вы можете использовать метод forEach для перебора всех кнопок и удаления тех, которые не были нажаты. Вы можете использовать e.target, чтобы получить кнопку, на которую нажали, а затем сравнить ее с каждой кнопкой в ​​цикле.

document.addEventListener('DOMContentLoaded', () => {
      const buttons = document.querySelectorAll('button');
            buttons.forEach((button, index) => {
                button.addEventListener('mousedown', (e) => {
                    buttons.forEach((btn, i) => {
                        if (i !== index) {
                            btn.remove();
                        }
                    });
                });
            });
        });
<!DOCTYPE HTML>
    <html lang = "en">
    <head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Remove Buttons Example</title>
    </head>
    <body>
        <button id = "btn1">Button 1</button>
        <button id = "btn2">Button 2</button>
        <button id = "btn3">Button 3</button>
        <button id = "btn4">Button 4</button>
    </body>
    </html>

Надеюсь, это поможет.

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

for (const buttonContainer of document.querySelectorAll(".button-container")) {
  buttonContainer.addEventListener("click", function (event) {
    const path = getPath(this, event.target);
    const clickedButton = path.find(elm => elm.matches(".button-container .removable-button"));
    
    if (!clickedButton) return;
    
    for (const removableButton of this.querySelectorAll(".removable-button")) {
      if (removableButton === clickedButton) continue;
      removableButton.remove();
    }
  });
}

/**
 * Returns an array containing the element path
 * to get from ancestor to target. Both ancestor
 * and target are included within the array.
 * If target is not present within ancestor
 * undefined is returned instead.
 */
function getPath(ancestor, target) {
  if (!ancestor || !target) return;
  const currentPath = [];
  
  while (target) {
    currentPath.push(target);
    if (target === ancestor) {
      currentPath.reverse();
      return currentPath;
    }
    target = target.parentElement;
  }
}
<div class = "button-container">
  <button class = "removable-button">A</button>
  <button class = "removable-button">B</button>
  <button class = "removable-button">C</button>
</div>

<div class = "button-container">
  <button class = "removable-button">D</button>
  <button class = "removable-button">E</button>
  <button class = "removable-button">F</button>
</div>
const path = getPath(this, event.target);
const clickedButton = path.find(elm => elm.matches(".button-container .removable-button"));

Вышеупомянутое не является обязательным в текущем фрагменте и может быть заменено следующим:

const clickedButton = event.target;

Однако если вы планируете вложить в кнопку другие элементы, например <img>, <span>. Упрощенная версия больше не работает, поскольку event.target настроен на самый глубокий элемент, по которому щелкнули. Итак, если я нажму «текст» в <button><span>text</span></button>, то event.target будет элементом <span>, а не кнопкой.

Обратите внимание, что этот в обработчике событий — это элемент, к которому прикреплено событие. В данном случае контейнер кнопки <div> аналогичен event.currentTarget.

Другие вопросы по теме