4


how can i add more behaviour to existing onclick events e.g. if the existing object looks like

<a href="http://abc" onclick="sayHello()">link</a>
<script>
function sayHello(){
    alert('hello');
}

function sayGoodMorning(){
    alert('Good Morning');
}
</script>

how can i add more behavior to the onclick that would do also the following

alert("say hello again");
sayGoodMorning()

Best Regards, Keshav

5 Answers 5

10

Here's the dirtiest way :)

<a href=".." onclick='sayHello();alert("say hello again");sayGoodMorning()'>.</a>

Here's a somewhat saner version. Wrap everything into a function:

<a href=".." onclick="sayItAll()">..</a>

JavaScript:

function sayItAll() {
    sayHello();
    alert("say hello again");
    sayGoodMorning();
}

And here's the proper way to do it. Use the event registration model instead of relying on the onclick attribute or property.

<a id="linkId" href="...">some link</a>

JavaScript:

var link = document.getElementById("linkId");
addEvent(link, "click", sayHello);
addEvent(link, "click", function() {
    alert("say hello again");
});
addEvent(link, "click", sayGoodMorning);

A cross-browser implementation of the addEvent function is given below (from scottandrew.com):

function addEvent(obj, evType, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, false);
        return true;
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on" + evType, fn);
        return r;
    } else {
        alert("Handler could not be attached");
    }
}

Note that if all 3 actions must be run sequentially, then you should still go ahead and wrap them in a single function. But this approach still tops the second approach, although it seems a little verbose.

var link = document.getElementById("linkId");
addEvent(link, "click", function() {
    sayHello();
    alert("say hello again");
    sayGoodMorning();
});
Sign up to request clarification or add additional context in comments.

7 Comments

+1 - the only thing I would change would be to remove the useCapture from the addEvent implementation to keep consistency across all browsers
Hi Anurag, i wanted to add the new behavior with javascript i.e. to get the existing script for onclick event and attach more behavior to it. i could have added multiple onclick listeners but IE only has attachEvent and it does not support addEvent or addEventListeners which could have been used to add multiple event listeners
@keshav - the addEvent function in the answer is cross-browser and should take care of IE/other browsers.
@Anurag - yes but the attachEvent overwrites my existing script for onclick what i want to do is really to extend or to say add more event handlers for same event type. russ has proposed a solution below to achieve it using anonymous functions.
@keshav - are you sure attachEvent overwrites the onclick that is added inline in html?
|
6

Another way not mentioned is to capture the function currently assigned to the element.onclick attribute, then assign a new function that wraps the old one. A simple implementation to demonstrate would be something like

function addEvent(element, type, fn) {
    var old = element['on' + type] || function() {};
    element['on' + type] = function () { old(); fn(); };
}

var a = document.getElementById('a');

function sayHello(){
    alert('hello');
}

function sayGoodMorning(){
    alert('Good Morning');
}

addEvent(a, 'click', sayHello);
addEvent(a, 'click', sayGoodMorning);

Working Demo here

1 Comment

thanks, this was what i needed(to extend the existing behaviour with javascript, the addevent method above does it very well) also very thanks for introducing me to jsfiddle looks like a great debugging and sharing tool
0

One way would be to write a third function:

<a href="http://abc" onclick="foo()">link</a>
<script>
function sayHello(){
    alert('hello');
}

function sayGoodMorning(){
    alert('Good Morning');
}

function foo() {
    alert("say hello again");
    sayGoodMorning();
}
</script>

Comments

0

<a href="http://abc" onclick="sayHello(),sayX(),sayY(),sayZ()">link</a>

would also work

Comments

0

Assuming a slight change to your code:

<a href="http://abc" id="a1" onclick="sayHello()">link</a>

In plain ol' JavaScript, you'd do something like this.

var a = document.getElementById('a1');
a.onclick = function () { alert('say hello again'); a.onclick(); }

It's worth noting that jQuery makes this a bit easier. See the documentation on the click, bind, and one, for example, and in general the section on event handler attachment.

1 Comment

Be careful ! You'll fall in an infinite loop : you call a.onclick() that calls a.onclick() itself ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.