Mohamed Mahmoud Zaki Mohamed Mahmoud Zaki - 17 days ago 7
Javascript Question

adding event listener cross browser

my problem here:why doesn't this code work ????? ... the message doesn't appear

i'm trying to add event listener to element x on event click

function test()
{
alert("test");
}

var EventsCrossBrowsers =
{
addEvents:(function(element,event,func)
{
if(element.addEventListener)
{
return elemenet.addEventListener(event,func,false);
}
else if(elemenet.attachEvent)
{
return elemenet.attachEvent("on"+event,func);
}
}());
}

var x =document.getElementById("test");

EventsCrossBrowsers.addEvents(x,"click",test);


thanks alot jfriend00....
the most smiple way i think :-

function test()
{
alert("test");
}

function addEventsCrossBrowsers(elemenet,event,func)
{
if(elemenet.addEventListener)
{
elemenet.addEventListener(event,func,false);
}
else if(elemenet.attachEvent)
{
elemenet.attachEvent("on"+event,func);
}
}
var x =document.getElementById("test");
addEventsCrossBrowsers(x,"click",test);


your second way is almost the same except i don't understand the return ...
thank you again...

Answer

In your function, I see you are using both elemenet and element where they should be the same spelling. That would be at least part of the problem.

I also see that your addEvents function is a self executing function which doesn't make sense in this regard. It seems like it should just be a normal function.

Here's my cross browser event function. In addition to make one function for adding event handlers, it also normalizes the this pointer and the events object so they can be treated the same in any browser too.

// add event cross browser
function addEvent(elem, event, fn) {
    // avoid memory overhead of new anonymous functions for every event handler that's installed
    // by using local functions
    function listenHandler(e) {
        var ret = fn.apply(this, arguments);
        if (ret === false) {
            e.stopPropagation();
            e.preventDefault();
        }
        return(ret);
    }

    function attachHandler() {
        // set the this pointer same as addEventListener when fn is called
        // and make sure the event is passed to the fn also so that works the same too
        var ret = fn.call(elem, window.event);   
        if (ret === false) {
            window.event.returnValue = false;
            window.event.cancelBubble = true;
        }
        return(ret);
    }

    if (elem.addEventListener) {
        elem.addEventListener(event, listenHandler, false);
        return {elem: elem, handler: listenHandler, event: event};
    } else {
        elem.attachEvent("on" + event, attachHandler);
        return {elem: elem, handler: attachHandler, event: event};
    }
}

function removeEvent(token) {
    if (token.elem.removeEventListener) {
        token.elem.removeEventListener(token.event, token.handler);
    } else {
        token.elem.detachEvent("on" + token.event, token.handler);
    }
}

If you want a simpler version without the propagation and default prevention options but with this and event normalization, that would be this:

// add event cross browser
function addEvent(elem, event, fn) {
    if (elem.addEventListener) {
        elem.addEventListener(event, fn, false);
    } else {
        elem.attachEvent("on" + event, function() {
            // set the this pointer same as addEventListener when fn is called
            return(fn.call(elem, window.event));   
        });
    }
}