JavaScript - onClick, щоб отримати ідентифікатор натиснутої кнопки


295

Як знайти ідентифікатор кнопки, на яку натискають?

<button id="1" onClick="reply_click()"></button>
<button id="2" onClick="reply_click()"></button>
<button id="3" onClick="reply_click()"></button>

function reply_click()
{
}

17
@ Робін ван Бален: Ідентифікаційні дані не повинні бути числовими за умовами , але вони можуть бути.
williambq

Відповіді:


596

Ідентифікатор потрібно надіслати як параметри функції. Зробіть так:

<button id="1" onClick="reply_click(this.id)">B1</button>
<button id="2" onClick="reply_click(this.id)">B2</button>
<button id="3" onClick="reply_click(this.id)">B3</button>
    
<script type="text/javascript">
  function reply_click(clicked_id)
  {
      alert(clicked_id);
  }
</script>

Це надішле ідентифікатор this.id, clicked_idякий ви можете використовувати у своїй функції. Дивіться це в дії тут.


2
Я просто хотів зазначити, що для тих, хто отримує нульове посилання на виключення за допомогою JQuery event.target.id(для мене, як Firefox, так і IE кидали), це чудове рішення, яке працює у всіх трьох основних браузерах.
X3074861X

2
Брат, ти єдина людина в Інтернеті, якій вдалося інтерпретувати мене так, як це працює. Використання змінної у назві функції та використання іншої у фактичному сценарії функції для мене абсолютно не мали сенсу! В одному короткому реченні ви мені пояснили, що змінна, яку ми ставимо у функціональні дужки () та та, яку ми використовуємо у оголошенні функції, - це одне і те саме, щойно передане на AS! Це геніально! Дякую, мій пане, за мудрість, яку ти мені подарував
Деніслав Карагіозов

Ви дійсно не хочете, щоб у вашому HTML-коді не було жодного коду, наприклад <кнопка onClick = "">
Дейв Джейкобі

61

Взагалі, справи простіше організувати, якщо ви розділите код і розмітку. Визначте всі свої елементи, а потім у розділі JavaScript визначте різні дії, які слід виконати над цими елементами.

Коли викликається обробник подій, він викликається в контексті елемента, на який було натиснуто. Таким чином, ідентифікатор цього буде посилатися на елемент DOM , який ви клацнули. Потім ви можете отримати доступ до атрибутів елемента через цей ідентифікатор.

Наприклад:

<button id="1">Button 1</button>
<button id="2">Button 2</button>
<button id="3">Button 3</button>

<script type="text/javascript">
var reply_click = function()
{
    alert("Button clicked, id "+this.id+", text"+this.innerHTML);
}
document.getElementById('1').onclick = reply_click;
document.getElementById('2').onclick = reply_click;
document.getElementById('3').onclick = reply_click;
</script>

1
що робити, якщо кнопки знаходяться в ретрансляторі і тому створюються динамічно, тож ви не знаєте, скільки кнопок у вас буде?
Amc_rtty

4
Існує ряд способів впоратися з цим. Наприклад, динамічно генеруйте javascript. Або додайте один і той же клас до всіх кнопок, а потім повторіть усі кнопки з цим ім'ям класу та приєднайте обробник таким чином.
Джейсон ЛеБрун

@JasonLeBrun Я не знаю, який ідентифікатор елемента, який я збираюся натиснути. Це те, що я шукаю. Код малює елемент SVG, і коли натискаю на нього, я повинен знати, що це атрибут "id". Якщо і як можна використовувати цей код?
Аріхант

46

ВИКОРИСТАННЯ ЧИСТОГО JAVASCRIPT: Я знаю, що пізно, але це може бути для майбутніх людей, які можуть допомогти:

У частині HTML:

<button id="1" onClick="reply_click()"></button>
<button id="2" onClick="reply_click()"></button>
<button id="3" onClick="reply_click()"></button>

У контролері Javascipt:

function reply_click()
{
    alert(event.srcElement.id);
}

Таким чином, нам не потрібно прив’язувати "id" Елемента під час виклику функції javascript.


1
Мені подобається ця ідея за динамічну функціональність. Я працюю над додаванням функцій до динамічної БД за допомогою PHP / MySQL та JS; це добре працює для додавання певної функції до певних динамічних класів. Дякую!
ejbytes

@codeling Ви можете поділитися деталями браузера та оточення?
Prateek

@Prateek Firefox, найновіші. Мені потрібне було лише джерело, тому я працював навколо нього зараз, передаючи thisпараметр в onClick(насправді, не використовуючи onClick, але onChange, це, можливо, проблема?). Я також трохи перевірив, і, здається, існує велика плутанина щодо цієї eventзмінної - чи це "неявний" параметр чи він повинен бути явно вказаний як аргумент (тобто function reply_click(event), що я також бачив у деякі місця)? Це доступно лише при призначенні слухача події через addEventListener...? Я грав, але не міг змусити його працювати.
кодування

3
FYI: Об'єкт глобальної події доступний у хромі, а не firefox.
DaveEdelstein

40

(Я думаю, що idатрибут потрібно починати з літери. Може бути неправильним.)

Ви можете поїхати на делегацію подій ...

<div onClick="reply_click()">
    <button id="1"></button>
    <button id="2"></button>
    <button id="3"></button>
</div>

function reply_click(e) {
    e = e || window.event;
    e = e.target || e.srcElement;
    if (e.nodeName === 'BUTTON') {
        alert(e.id);
    }
}

... але це вимагає, щоб ви були відносно комфортні з дурною моделлю подій.


1
Це не спрацює. Ви вказали код в атрибуті onclick, який викликає reply_click без аргументів. Отже, жоден аргумент події не передається функції.
Джейсон Лебрун

1
А значенням атрибута "id" може бути будь-який рядок. Це не обов’язково починати з листа.
Джейсон Лебрун

@Jason Власне, у всіх хороших сучасних браузерах eаргумент генерується автоматично. Якщо це не так, ми маємо мати справу з IE6-8, який натомість забезпечує цей корисний об'єкт через window.event.
sdleihssirhc


6
@sdleihssirhc Насправді ви зарозумілі так собі, що все змінюється за допомогою HTML5 .
sdleihssirhc

28
<button id="1" onClick="reply_click(this)"></button>
<button id="2" onClick="reply_click(this)"></button>
<button id="3" onClick="reply_click(this)"></button>

function reply_click(obj)
{
var id = obj.id;
}

18
<button id="1" class="clickMe"></button>
<button id="2" class="clickMe"></button>
<button id="3" class="clickMe"></button>

<script>
$('.clickMe').click(function(){
    alert(this.id);
});
</script>

14

Як це зробити без вбудованого JavaScript

зазвичай рекомендується уникати вбудованого JavaScript, але рідко є приклад того, як це зробити.
Ось мій спосіб приєднання подій до кнопок.
Я не зовсім задоволений тим, наскільки довше порівняно рекомендований метод з простимonClick атрибутом.

Лише браузери 2014 року

<button class="btn">Button</button>
<script>
let OnEvent = (doc) => {
    return {
        on: (event, className, callback) => {
            doc.addEventListener('click', (event)=>{
                if(!event.target.classList.contains(className)) return;
                callback.call(event.target, event);
            }, false);
        }
    }
};


OnEvent(document).on('click', 'btn', function (e) {
    window.console.log(this, e);
});

</script>

2013 лише для браузерів

<!DOCTYPE html>
<html>
<head>
<script>
(function(doc){
    var hasClass = function(el,className) {
        return el.classList.contains(className);
    }
    doc.addEventListener('click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault();
          doSomething.call(e.target, e);
      }
    });
})(document);

function insertHTML(str){
  var s = document.getElementsByTagName('script'), lastScript = s[s.length-1];
  lastScript.insertAdjacentHTML("beforebegin", str);
}

function doSomething(event){
  console.log(this.id); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--Best if you inject the button element with javascript if you plan to support users with javascript disabled-->
<script>
insertHTML('<button class="click-me" id="btn1">Button 1</button>');
</script>

<!--Use this when you don't care about broken buttons when javascript is disabled.-->
<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me" id="btn2">Button 2</button>
<input class="click-me" type="button" value="Button 3" id="btn3">

<!--Use this when you want to lead the user somewhere when javascript is disabled-->
<a class="click-me" href="/path/to/non-js/action" id="btn4">Button 4</a>

</body>
</html>

Крос-браузер

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(doc){
    var cb_addEventListener = function(obj, evt, fnc) {
        // W3C model
        if (obj.addEventListener) {
            obj.addEventListener(evt, fnc, false);
            return true;
        } 
        // Microsoft model
        else if (obj.attachEvent) {
            return obj.attachEvent('on' + evt, fnc);
        }
        // Browser don't support W3C or MSFT model, go on with traditional
        else {
            evt = 'on'+evt;
            if(typeof obj[evt] === 'function'){
                // Object already has a function on traditional
                // Let's wrap it with our own function inside another function
                fnc = (function(f1,f2){
                    return function(){
                        f1.apply(this,arguments);
                        f2.apply(this,arguments);
                    }
                })(obj[evt], fnc);
            }
            obj[evt] = fnc;
            return true;
        }
        return false;
    };
    var hasClass = function(el,className) {
        return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1;
    }

    cb_addEventListener(doc, 'click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault ? e.preventDefault() : e.returnValue = false;
          doSomething.call(e.target, e);
      }
    });
})(document);

function insertHTML(str){
  var s = document.getElementsByTagName('script'), lastScript = s[s.length-1];
  lastScript.insertAdjacentHTML("beforebegin", str);
}

function doSomething(event){
  console.log(this.id); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--Best if you inject the button element with javascript if you plan to support users with javascript disabled-->
<script type="text/javascript">
insertHTML('<button class="click-me" id="btn1">Button 1</button>');
</script>

<!--Use this when you don't care about broken buttons when javascript is disabled.-->
<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me" id="btn2">Button 2</button>
<input class="click-me" type="button" value="Button 3" id="btn3">

<!--Use this when you want to lead the user somewhere when javascript is disabled-->
<a class="click-me" href="/path/to/non-js/action" id="btn4">Button 4</a>

</body>
</html>

Крос-браузер з jQuery

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function($){
    $(document).on('click', '.click-me', function(e){
      doSomething.call(this, e);
    });
})(jQuery);

function insertHTML(str){
  var s = document.getElementsByTagName('script'), lastScript = s[s.length-1];
  lastScript.insertAdjacentHTML("beforebegin", str);
}

function doSomething(event){
  console.log(this.id); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--Best if you inject the button element with javascript if you plan to support users with javascript disabled-->
<script type="text/javascript">
insertHTML('<button class="click-me" id="btn1">Button 1</button>');
</script>

<!--Use this when you don't care about broken buttons when javascript is disabled.-->
<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me" id="btn2">Button 2</button>
<input class="click-me" type="button" value="Button 3" id="btn3">

<!--Use this when you want to lead the user somewhere when javascript is disabled-->
<a class="click-me" href="/path/to/non-js/action" id="btn4">Button 4</a>

</body>
</html>

Ви можете запустити це до того, як документ буде готовий, натискання кнопок спрацює, тому що ми приєднуємо подію до документа.

Ось jsfiddle
З якоїсь дивної причини insertHTMLфункція не працює в ній, хоча вона працює у всіх моїх браузерах.

Ви завжди можете замінити insertHTMLз , document.writeякщо ви не заперечуєте , це недоліки

<script>
document.write('<button class="click-me" id="btn1">Button 1</button>');
</script>

Джерела:


Мені завжди цікаво, наскільки події можуть бути настільки ж ефективними (як продуктивні), так і вбудованими. Я здогадуюсь, що їх треба важче відстежувати?
gabn88

залежить від вашого умовного іменування класу, якщо конвенція має сенс, то знайти його буде так само просто, як і onclicks
Timo Huovinen

11

Якщо ви не хочете передавати жодних аргументів функції onclick, просто скористайтеся event.targetдля отримання елемента, що натиснув:

<button id="1" onClick="reply_click()"></button>
<button id="2" onClick="reply_click()"></button>
<button id="3" onClick="reply_click()"></button>

function reply_click()
{
    // event.target is the element that is clicked (button in this case).
    console.log(event.target.id);
}

7

За допомогою чистого JavaScript ви можете зробити наступне:

var buttons = document.getElementsByTagName("button");
var buttonsCount = buttons.length;
for (var i = 0; i < buttonsCount; i += 1) {
    buttons[i].onclick = function(e) {
        alert(this.id);
    };
}​

перевірте це на JsFiddle


1
Ваш код говорить: Uncaught TypeError: Неможливо встановити властивість 'onclick' undefined
alex351

1
це тому, що у вас немає кнопок у вашому html
vidstige

6

Ви можете це зробити так:

<input type="button" id="1234" onclick="showId(this.id)" value="click me to show my id"/>
<script type="text/javascript">
   function showId(obj) {
        var id=obj;
        alert(id);
   }


Ви можете вирізати вар id=obj;і просто матиalert(obj);
Doge

Я думаю, що це має бути прийнятою відповіддю, і "(this.id)" працював для мене саме зараз у FF, IE та Chrome.
Джон Кумбс

6
<button id="1" onClick="reply_click()"></button>
<button id="2" onClick="reply_click()"></button>
<button id="3" onClick="reply_click()"></button>

function reply_click()
{
   console.log(window.event.target.id)
}

4
 <button id="1"class="clickMe"></button>

<button id="2" class="clickMe"></button>

<button id="3" class="clickMe"></button>



$('.clickMe').live('click',function(){

var clickedID = this.id;

});

3

Кнопка 1 Кнопка 2 Кнопка 3

var reply_click = function() { 
     alert("Button clicked, id "+this.id+", text"+this.innerHTML); 
} 
document.getElementById('1').onclick = reply_click; 
document.getElementById('2').onclick = reply_click; 
document.getElementById('3').onclick = reply_click;

2

Вибачте за пізню відповідь, але це дуже швидко, якщо ви це зробите: -

$(document).ready(function() {
  $('button').on('click', function() {
     alert (this.id);
  });
});

Це отримує ідентифікатор будь-якої натиснутої кнопки.

Якщо ви хочете просто отримати значення натиснутої кнопки в певному місці, просто покладіть їх у контейнер, як

<div id = "myButtons"> buttons here </div>

і змініть код на: -

 $(document).ready(function() {
      $('.myButtons button').on('click', function() {
         alert (this.id);
      });
    });

Я сподіваюся, що це допомагає


1
Я думаю, що myButtons - це ідентифікатор, і ви використовуєте його як селектор класів у jquery з крапкою (.) Я думаю, що це слід починати з #.
шаші верма

0

Це введе журнал ідентифікатора елемента, на який було натиснуто: addFields.

<button id="addFields" onclick="addFields()">+</button>

<script>

function addFields(){ 
    console.log(event.toElement.id)
}

</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.