JavaScript - onClick para obter o ID do botão clicado


295

Como encontrar o ID do botão que está sendo clicado?

<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
@Robin van Baalen: os IDs não devem ser numéricos por convenção, mas podem ser.
williambq

Respostas:


596

Você precisa enviar o ID como os parâmetros de função. Faça isso deste modo:

<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>

Isso enviará o ID this.idcomo o clicked_idqual você pode usar em sua função. Veja em ação aqui.


2
Eu só queria observar que, para quem obtém uma exceção de referência nula usando o JQuery event.target.id(para mim, o Firefox e o IE estavam lançando), essa é uma ótima solução que funciona nos três principais navegadores.
X3074861X 08/08

2
Irmão, você é a única pessoa na internet que conseguiu interpretar para mim o modo como isso funciona. Usar uma variável no nome da função e usar outra no script da função real não fazia absolutamente nenhum sentido para mim! Em uma frase curta, você me explicou que a variável que colocamos entre parênteses da função () e a que usamos na declaração da função é a mesma coisa, apenas repassada ao AS! Isto é brilhante ! Obrigado meu senhor para a sabedoria que me outorgou
Denislav Karagiozov

Você realmente não quer nenhum código no seu html, como <button onClick = "">
Dave Jacoby

61

Em geral, é mais fácil manter as coisas organizadas se você separar seu código e sua marcação. Defina todos os seus elementos e, na seção JavaScript, defina as várias ações que devem ser executadas nesses elementos.

Quando um manipulador de eventos é chamado, ele é chamado no contexto do elemento em que foi clicado. Então, o identificador esta fará referência ao elemento DOM que você clicou. Você pode acessar os atributos do elemento através desse identificador.

Por exemplo:

<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
e se os botões estiverem em um repetidor e, portanto, gerados dinamicamente, para que você não saiba quantos botões terá?
Amc_rtty 26/10/12

4
Existem várias maneiras de lidar com isso. Por exemplo, gere o javascript dinamicamente. Ou adicione a mesma classe a todos os botões e percorra todos os botões com esse nome de classe e anexe o manipulador dessa maneira.
26612 Jason LeBrun

@JasonLeBrun Não sei qual é o ID do elemento no qual vou clicar. É isso que estou procurando. Um código desenha um elemento SVG e quando clico nele, preciso saber o seu atributo "id". Se e como esse código pode ser usado?
Arihant

46

USANDO O JAVASCRIPT PURO: Eu sei que é tarde, mas pode ser para as pessoas futuras que ele pode ajudar:

Na parte HTML:

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

No Javascipt Controller:

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

Dessa forma, não precisamos vincular o 'id' do elemento no momento da chamada da função javascript.


1
Eu gosto dessa idéia para funcionalidade dinâmica. Estou trabalhando para adicionar funções a um banco de dados dinâmico usando PHP / MySQL e JS; isso funciona bem para adicionar uma função específica a classes dinâmicas específicas. Obrigado!
ejbytes

@codeling você pode compartilhar os detalhes do navegador e do ambiente?
Prateek

@Prateek Firefox, mais recente. Eu só precisava da fonte, então trabalhei em torno dela agora, passando thiscomo parâmetro onClick( na verdade, não usando onClick, mas onChange, esse talvez seja o problema?). Eu também verifiquei um pouco e parece haver muita confusão sobre essa eventvariável - é um parâmetro "implícito" ou deve ser declarado explicitamente como argumento (ou seja function reply_click(event), que também vi em alguns locais)? Está disponível apenas ao atribuir o ouvinte de eventos via addEventListener...? Eu brinquei, mas não consegui fazê-lo funcionar.
codeling

3
FYI: O objeto de evento global está disponível no chrome, não no firefox.
DaveEdelstein

40

(Acho que o idatributo precisa começar com uma letra. Pode estar errado.)

Você poderia ir para a delegação do evento ...

<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);
    }
}

... mas isso exige que você esteja relativamente confortável com o modelo de evento maluco.


1
Isso não vai funcionar. Você especificou o código no atributo onclick que chama reply_click sem argumentos. Portanto, nenhum argumento de evento será passado para a função
Jason LeBrun

1
E o valor do atributo "id" pode ser qualquer sequência. Não precisa começar com uma carta.
Jason LeBrun

@ Jason Na verdade, em todos os bons navegadores modernos, o eargumento é gerado automaticamente. Caso contrário, devemos lidar com o IE6-8, que fornece esse objeto útil via window.event.
sdleihssirhc


6
@sdleihssirhc Na verdade, você é arrogante, tudo isso muda com o HTML5 .
precisa saber é o seguinte

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

Como fazer isso sem JavaScript embutido

geralmente é recomendável evitar o JavaScript embutido, mas raramente existe um exemplo de como fazê-lo.
Aqui está a minha maneira de anexar eventos aos botões.
Não estou totalmente satisfeito com quanto tempo o método recomendado é comparado a um onClickatributo simples .

Apenas navegadores 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>

Apenas navegadores 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>

Cross-browser

<!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>

Navegador cruzado com 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>

Você pode executar isso antes que o documento esteja pronto. Clicar nos botões funcionará porque anexamos o evento ao documento.

Aqui está um jsfiddle
Por algum motivo estranho, a insertHTMLfunção não funciona nela, mesmo que funcione em todos os meus navegadores.

Você sempre pode substituir insertHTMLpor document.writese não se importa com as desvantagens

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

Fontes:


Sempre me pergunto como os eventos podem ser tão eficientes (em termos de desempenho) quanto os onclicks embutidos. Eu acho que eles devem ser mais difíceis de acompanhar?
gabn88

depende de sua convenção de nomenclatura de classe, se a convenção é significativo, então ele vai ser tão fácil de encontrar como onclicks
Timo Huovinen

11

Se você não deseja passar nenhum argumento para a função onclick, use event.targetpara obter o elemento clicado:

<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

Com o javascript puro, você pode fazer o seguinte:

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);
    };
}​

verificá-lo em JsFiddle


1
Seu código diz: TypeError não capturado: Não é possível definir a propriedade 'onclick' de undefined
alex351

1
isso é porque você não tem botões no seu html
vidstige

6

Você pode simplesmente fazê-lo desta maneira:

<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);
   }


Você poderia cortar o var id=obj;e apenas sealert(obj);
Doge

Acho que essa deve ser a resposta aceita e "(this.id)" funcionou para mim agora no FF, IE e Chrome.
Jon Coombs

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

Botão 1 Botão 2 Botão 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

Desculpe, é uma resposta tardia, mas é muito rápida se você fizer isso: -

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

Isso obtém o ID de qualquer botão clicado.

Se você deseja obter apenas o valor do botão clicado em um determinado local, basta colocá-lo em um recipiente como

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

e altere o código para: -

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

Eu espero que isso ajude


1
Eu acho que myButtons é um id e você está usando-o como um seletor de classe no jquery com um ponto (.). Acho que isso deve começar com #.
Shashi verma

0

Isso registrará o ID do elemento que foi clicado: addFields.

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

<script>

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

</script>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.