Вызов одного и того же javascript с несколькими кнопками

Я действительно новичок в Javascript, и мне удалось заставить этот код работать для моего проекта. https://codepen.io/kevinpowell/pen/EMdjOV

Мне просто нужно, чтобы он работал на другую кнопку. Так что в основном другая кнопка, но способная работать, вызывая тот же js.

Как видите, текущая главная кнопка <button id = "dark-mode-toggle" class = "dark-mode-toggle">

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

Могу ли я каким-то образом создать еще одну кнопку с другим классом, например .dark-mode-toggle-two, и использовать ее в js?

Поведение ключевого слова "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
1
156
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

function myAction() {
  // Do something
}

button1.addEventListener('click', myAction);
button2.addEventListener('click', myAction);
Ответ принят как подходящий

Вам нужно делегировать и не использовать идентификаторы

https://codepen.io/mplungjan/pen/abmmxBd

document.addEventListener("click", function(e) {
  let tgt = e.target;
  const possibleParent = tgt.closest("button");
  tgt = possibleParent ? possibleParent : tgt; // clicking button or SVG
  if (tgt.classList.contains("dark-mode-toggle")) { // class='dark-mode-toggle'
    // get their darkMode setting
    darkMode = localStorage.getItem('darkMode');
    // if it not current enabled, enable it
    if (darkMode !== 'enabled') {
      enableDarkMode();
      // if it has been enabled, turn it off  
    } else {
      disableDarkMode();
    }
  }
})

Обратите внимание, что в codepen мне приходилось различать переключатели темного режима в разделе и в других местах, потому что у вас есть абсолютная позиция.

Это действительно работает! Хотя с вашим кодом нажатия кнопок не работают при нажатии непосредственно на svg.

Hanz Corpuz 10.12.2020 10:00

Простите меня, если я вас неправильно понимаю, но я буквально нажимаю на вашу кодовую ручку, и мне приходится нажимать на границу кнопки. Щелчок прямо по центру svg ничего не делает. Я что-то пропустил?

Hanz Corpuz 10.12.2020 10:05

Я обновил код.

mplungjan 10.12.2020 10:10

Принял! Это мой первый пост, и я очень ценю помощь! @mplungjan

Hanz Corpuz 10.12.2020 10:33

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

mplungjan 10.12.2020 10:47

В этом есть смысл. Я запомню это. @mplungjan

Hanz Corpuz 10.12.2020 18:18

@mplungjan Как вы думаете, этот код имеет хорошую производительность? (Я имею в виду document.addEventListener...)

Hossein Shourabi 10.12.2020 23:10

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

mplungjan 11.12.2020 06:19

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

JS-файл

function toogleMode(event) {
//your logic
}

На вашей html-кнопке вы можете иметь что-то вроде:

<button onclick = "toogleMode('$event')">CHange color</button>

Пожалуйста, не используйте встроенные обработчики событий

mplungjan 10.12.2020 09:44

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