Функция вызова Js с аргументами

Я создал 4 кнопки и каждую кнопку со своим идентификатором, и у меня есть функция, которая отображает идентификатор данного элемента. поэтому я хочу применить его ко всем этим 4 кнопкам. что я сделал не так?

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>

<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>

<script type = "text/javascript">
    
function show_id(element){
    alert(element.id)
}

for(i=0; i!=document.getElementsByTagName('button');i++){

    target = document.getElementsByTagName('button')[i]
    target.onclick = show_id(target)

}

</script>
</body>
</html>

Я думаю, что было бы лучше использовать class вместо id.

Edmund 24.12.2020 10:41

будет ли это отличаться?

badr 24.12.2020 10:42

Вы, вероятно, имели в виду i!=document.getElementsByTagName('button').length. В нынешнем виде вы сравниваете число с HTMLCollection, потенциально создавая бесконечный цикл, который останавливается только из-за ошибки, которую он создает внутри цикла.

connexo 24.12.2020 10:42

Я изменил его, теперь все они предупреждают о последнем идентификаторе кнопки!

badr 24.12.2020 10:44

Иди с for(let i=0

connexo 24.12.2020 10:44

все те же результаты

badr 24.12.2020 10:47

подождите, так вы хотели бы, чтобы кнопка, которая была нажата, делала предупреждение?

Aalexander 24.12.2020 10:50

да, каждая кнопка, на которую нажимают, показывает свой идентификатор

badr 24.12.2020 10:54
Поведение ключевого слова "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
8
113
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете получить длину элементов кнопки и перебирать кнопки.

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

Вот как вы можете это сделать.

    <!DOCTYPE html>
    <html>
    <head>
    <title></title>
    </head>
    <body>

    <button id='b1' class = "btnWithID">Click</button>
    <button id='b2' class = "btnWithID">Click</button>
    <button id='b3' class = "btnWithID">Click</button>
    <button id='b4' class = "btnWithID">Click</button>

    <script type = "text/javascript">
        
    function show_id(){
        alert(this.id)
    }


    let btns = document.querySelectorAll('.btnWithID');
    for(i=0; i < btns.length ;i++){

        btns[i].onclick = show_id;

    }


    </script>



    </body>
    </html>

когда я запускаю его, он предупреждает все классы, но ничего не показывает, когда я нажимаю на них

badr 24.12.2020 10:48

Извините за аргументацию, которая будет применяться ко всем 4 кнопкам, я немного запутался. Я обновил свой ответ сейчас

Aalexander 24.12.2020 11:01

кто-то уже написал тот же ответ, но все равно спасибо.

badr 24.12.2020 11:03

и я думаю, что нет необходимости в классе, вы можете просто querySelectorAll('button') или getElementByTagName('button')

badr 24.12.2020 11:05

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

Aalexander 24.12.2020 12:30
Ответ принят как подходящий

Сделайте это, как показано ниже -

function show_id() {
  alert(this.id)
}

var buttons = document.querySelectorAll("button");

for (var i = 0; i < buttons.length; i++) {
  buttons[i].onclick = show_id;
}
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>

Передача аргументов в событие onclick -

Использование HTML -

function show(element, value) {
  console.info(element.id);
  console.info(value);
}
<button id='b1' onclick='show(this, "a")'>Click</button>

Использование JS -

function show(value, event) {
 console.info(value);
 console.info(event.target.id);
}

var button = document.getElementById("b1");

button.onclick = show.bind(this, "a");
<button id='b1'>Click</button>

Но, как упоминал @connexo, используйте addEventListener для привязки событий DOM.

нужно ли писать (элемент) после функции?

badr 24.12.2020 10:52

@badr, нет, не требуется. Я удалил его.

Nikhil Patil 24.12.2020 10:53

я хочу знать, как использовать функцию с аргументами в атрибуте onclick

badr 24.12.2020 10:57

@badr Ответ: нет. Это почти 100% доказательство действительно плохого подхода к дизайну, если вам это нужно.

connexo 24.12.2020 11:00

так что я просто использую this.something?

badr 24.12.2020 11:01

Я настоятельно рекомендую вам прекратить использовать циклы на основе индексов, ключевое слово var (если вы точно не знаете, почему вы используете его вместо const или let), а также element.onevent-свойства. Используйте DOM API, который предлагает element.addEventListener(eventName, handlerFunction).

connexo 24.12.2020 11:07

@connexo, согласен! Я попытался придерживаться исходного кода, опубликованного автором, ради проблемы, с которой столкнулся.

Nikhil Patil 24.12.2020 11:20

Вот как вы могли бы сделать это в современном JS:

for (const button of document.querySelectorAll('button'))
  button.addEventListener('click', function() { console.info(this.id) })
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>

Объяснение:

Когда вы регистрируете обычный function() в качестве прослушивателя событий и он выполняется, потому что событие происходит, ключевое слово this внутри функции будет указывать на элемент, на котором был зарегистрирован прослушиватель.

Кстати, за последние 3 года я не использовал ни одного цикла for на основе индекса, и я ежедневно занимаюсь веб-разработкой как профессионал. Я рекомендую вам углубиться в петли forEach и for...of.

connexo 24.12.2020 10:58

я так и сделаю, спасибо за помощь

badr 24.12.2020 11:00

Хорошо, обновите код для использования с querySelectorAll и forEach, это может помочь вам понять.

document.querySelectorAll('button').forEach((button)=>{
  button.addEventListener('click', function(){
   console.info(this.id);
  });
});
<button id='b1'>Click</button>
<button id='b2'>Click</button>
<button id='b3'>Click</button>
<button id='b4'>Click</button>

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

connexo 24.12.2020 10:57

я хочу использовать функцию с аргументами в «onclick», вот что я хочу знать, как

badr 24.12.2020 10:59

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