Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript append to onClick event

I have the following Code which I know doesn't work correctly. Yes I know how to do this in jQuery but in this case I cannot use jQuery. Please no jQuery answers.

<form>
  <input type="text" name="input1" onclick="alert('hello')">
  <input type="text" name="input2">
  <input type="text" name="input3">
</form>


<script type="text\javascript">
  window.onload = function () {
    var currentOnClick;
    for (var i = 0; i < document.forms[0].elements.length; i++) {
      currentOnClick = document.forms[0].elements[i].onclick;
      document.forms[0].elements[i].onclick = function () {
        if (currentOnClick) {
          currentOnClick();
        }
        alert("hello2");
      }
    }
  }
</script>

What I'm trying to do is iterate through the form's elements and add to the onclick function. But due to the fact that in my last iteration currentOnClick is null this does not run as expected. I want to preserve each of the elements onclick methods and play them back in the new function I'm creating.

What I want:

  • When input1 is clicked, alert "hello" then alert "hello2"

  • When Input2 is clicked, alert "hello2"

  • When Input3 is clicked, alert "hello2"

like image 807
John Hartsock Avatar asked May 07 '10 17:05

John Hartsock


People also ask

Which is the correct attribute to attach a click event to an element?

The onclick attribute is part of the Event Attributes, and can be used on any HTML elements.

Can we add onClick to div tag?

We can bind a JavaScript function to a div using the onclick event handler in the HTML or attaching the event handler in JavaScript. Let us refer to the following code in which we attach the event handler to a div element. The div element does not accept any click events by default.

Can we use onClick in anchor tag?

Using onclick Event: The onclick event attribute works when the user click on the button. When mouse clicked on the button then the button acts like a link and redirect page into the given location. Using button tag inside <a> tag: This method create a button inside anchor tag.


2 Answers

This helps:

window.onload = function () {
    for (var i = 0, element; element = document.forms[0].elements[i]; i++) {
        element.onclick = (function (onclick) {
            return function(oEvent) {
                // reference to event to pass argument properly
                oEvent  = oEvent || event;
                if (onclick)
                    onclick(oEvent);
                // new code "injection"
                alert("hello2");
            }
        })(element.onclick);
    }
}

Or this:

window.onload = function () {
    for (var i = 0, element; element = document.forms[0].elements[i]; i++) {
        element.exonclick = element.onclick;
        element.onclick = function (oEvent) {
            if (this.exonclick) {
                this.exonclick(oEvent);
            }
            //
            alert("hello2");
        }
    }
}

Please be warned, the technique will not work if event handlers were added with DOM-Events API.

like image 66
Sergey Ilinsky Avatar answered Sep 18 '22 00:09

Sergey Ilinsky


the way you have it, your elements all refer to the same instance of currentOnClick. each time you assign currentOnClick to the current element's existing onclick function, it loses the reference to the previous function. you need to create the new event handler function in a separate scope for each element.

function addClickProxy(element) {
    var currentOnClick = element.onclick;
    element.onclick = function() {
        if (currentOnClick) {
            currentOnClick();
        }
        alert("hello2");
    }
}

window.onload = function() {
    for (var i = 0; i < document.forms[0].elements.length; i++) {
        addClickProxy(document.forms[0].elements[i]);
    }
}

this way, there are 3 different instances of currentOnClick floating around, each sealed from the others by the function scope.

like image 6
lincolnk Avatar answered Sep 22 '22 00:09

lincolnk