最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript attaching events - Stack Overflow

programmeradmin1浏览0评论

I've seen that you can attach events like this

<button type="button" id="myButton" onclick="myFunction()">

can you do the same without the "onclick=", like:

document.getElementById('myButton'). //and here attach the event on click to myFunction

I'm trying to keep JavaScript and HTML separate.

I've seen that you can attach events like this

<button type="button" id="myButton" onclick="myFunction()">

can you do the same without the "onclick=", like:

document.getElementById('myButton'). //and here attach the event on click to myFunction

I'm trying to keep JavaScript and HTML separate.

Share Improve this question edited May 14, 2014 at 21:59 Joeytje50 19.1k15 gold badges67 silver badges99 bronze badges asked Apr 26, 2012 at 14:18 user983124user983124 3473 gold badges5 silver badges8 bronze badges
Add a comment  | 

6 Answers 6

Reset to default 8

It's similar to the onclick approach, and in fact uses the same event-handler, but is removed from the HTML:

document.getElementById('myButton').onclick = function(){
    // do stuff
    myFunction();
}

If you don't have an id on the element you could also use:

var inputs = document.getElementsByTagName('input');

for (var i=0, len=inputs.length; i<len; i++){
    if (inputs[i].type == 'text'){
        // assuming you want to affect text-inputs in this case
        inputs[i].onclick = function(){
            // do stuff. In here 'this' refers to inputs[i] element
            myFunction();
        };
    }
}

An alternative approach, using Array.prototype.forEach(), with an array of elements created using Array.prototype.slice() and document.querySelectorAll():

[].forEach.call(document.querySelector('input[type="text"]', yourFunctionName);

This will execute the yourFunctionName() function for each <input /> element, of type="text", returned by document.querySelectorAll() passing that <input /> element into the function as this.

You could also use addEventListener() in this case:

document.getElementById('myButton').addEventListener('click', myFunction, false);

And also in this situation, using document.querySelector() (as opposed to document.querySelectorAll()), which returns the first element that matches the passed-in selector, using CSS notation:

// gets the element with an 'id' of 'myButton', binding the 'click' event-handler:
document.querySelector('#myButton').addEventListener('click', myFunction, false);

Or:

// gets the first of the <input> elements, binding the 'click' event-handler:
document.querySelector('input').addEventListener('click', myFunction, false);

References:

  • Array.prototype.forEach().
  • Array.prototype.slice().
  • document.querySelector().
  • document.querySelectorAll().
  • EventTarget.addEventListener().

Yes, you can (and should!).

document.getElementById('myButton').onclick = myFunction;

Sure, you only need to select your item and call it's correspondant callback function. p.e:

document.getElementById('myButton').onclick = function(e) {
    // your code here
}

Or, without the inline function:

document.getElementById('myButton').onclick = myObject.myMethod;

https://developer.mozilla.org/en/DOM/element.onclick

Something like this:

  document.getElementById('myButton').onclick = function() {location.href='http://stackoverflow.com';return false;}
document.getElementById('myButton').onclick = function () {
        console.log('Inline event attach');
    };

    document.getElementById('myButton').addEventListener('click', function () {
        console.log('Using native addEventListener');
    }, false);
document.getElementById('myButton').onclick = function() { myFunction(); }
发布评论

评论列表(0)

  1. 暂无评论