How to detach event in IE 6 7 8 9 using JavaScript

2019-04-09 01:01发布

This is a partial code, not the full version.

I have a highlighter that highlights a specific html element when the mouse hovers.

I also have a click event and listener.

My problem is : the highlighter event/listener does not detach when using Internet Explorer v6 v7 v8 v9

What am i doing wrong?

this is how i attach the event and start the event listener:

if (document.body.addEventListener) {
                        //alert(11);
                        document.body.addEventListener('mousemove', handler, false);
                    } else if (document.body.attachEvent) {
                        //alert(12);
                        var ff=function(e) {
                            return handler(e || window.event);
                        };
                        //alert(ff);
                        document.body.attachEvent('onmousemove', ff);
                    } else {
                        //alert(13);
                        document.body.onmousemove = handler;
                    }

this is how i stop the onmousemove/mouse event/listener :

if (document.body.removeEventListener) {
                    document.body.removeEventListener('mousemove', handler, false);
                } else if (document.body.detachEvent) {
                    document.body.detachEvent('onmousemove', function(e) {
                        return handler(e || window.event);
                    });
                } else {
                    document.body.removeAttribute("onmousemove");
                }

this is how i stop the onclick/click event/listener:

if (document.body.removeEventListener) {
                    document.body.removeEventListener('click', ClosetAffairHighlighter.highlightClick, false);
                } else if (document.body.detachEvent) {
                    document.body.detachEvent('onclick', ClosetAffairHighlighter.highlightClick);
                } else {
                    document.body.removeAttribute("onclick");
                }

2条回答
Anthone
2楼-- · 2019-04-09 01:26

base on this article, a cross-browser event handler can be :

var EventUtil = {
    addHandler: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },
    removeHandler: function(element, type, handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent) {
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;
        }
    }
};
查看更多
放我归山
3楼-- · 2019-04-09 01:27

You need to pass to detachEvent the function you added with attachEvent. In your code you're passing a new one (they have the same toString() and would do the same thing but they're not the same).

You should make ff global with

var ff;
if (document.body.addEventListener) {
    document.body.addEventListener('mousemove', handler, false);
} else if (document.body.attachEvent) {
     ff=function(e) {
          return handler(e || window.event);
     };

and then call

else if (document.body.detachEvent) {
     document.body.detachEvent('onmousemove', ff);
} 

to remove the listener in old IE.

Note : I'm really doubtful about the document.body.removeAttribute("onclick"); : is there really a case in which this would be useful ?

查看更多
登录 后发表回答