我写了一段测试代码,目的是按下“添加事件”按钮后在红色的div区域绑定一个onclick事件,即鼠标点击div区域时触发test3方法,按下“取消事件”按钮取消div区域绑定的onclick事件爱你,即鼠标点击div区域时什么都不做,代码如下,但我发现了个问题,点击“取消事件”按钮并没有取消onclick事件,而且多次点击“添加事件”按钮会多次绑定onclick事件,即test3方法被触发了多次,不知是何原因,望高手给予解答,代码中Function.prototype.bindAsEventListener方法来自prototype,window.CEvent方法来自一个开源的地图程序。
<script>
Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}//自定义事件处理
window.CEvent = {
  addListener: function(obj, target, act) {
    if (obj.attachEvent) obj.attachEvent('on' + target, act);
    if (obj.addEventListener) obj.addEventListener(target, act, false);
  },
  removeListener: function(obj, target, act) {
    if (obj.detachEvent) obj.detachEvent('on' + target, act);
    if (obj.removeEventListener) obj.removeEventListener(target, act, false);
  }
}function test1() {
  var divobj = document.getElementById('mydiv');
  CEvent.addListener(divobj, 'click', test3.bindAsEventListener(divobj));
}function test2() {
  var divobj = document.getElementById('mydiv');
  CEvent.removeListener(divobj, 'click', test3.bindAsEventListener(divobj));
}function test3(evt) {
  alert('div的onclick事件被触发!');
}
</script><div style="width:300;height:200;background-color:#FF0000" id="mydiv"></div>
<input type="button" value="添加事件" onclick="test1()" />
<input type="button" value="取消事件" onclick="test2()" />

解决方案 »

  1.   

    我觉的两个test3.bindAsEventListener(divobj));指向的不是同一个函数。不应该做两次闭包<script>
    Function.prototype.bindAsEventListener = function(object) {
      var __method = this;
      return function(event) {
        return __method.call(object, event || window.event);
      }
    }//自定义事件处理
    window.CEvent = {
      addListener: function(obj, target, act) {
        if (obj.attachEvent) obj.attachEvent('on' + target, act);
        if (obj.addEventListener) obj.addEventListener(target, act, false);
      },
      removeListener: function(obj, target, act) {
        if (obj.detachEvent) obj.detachEvent('on' + target, act);
        if (obj.removeEventListener) obj.removeEventListener(target, act, false);
      }
    }
    var linten=null;
    function test1() {
      var divobj = document.getElementById('mydiv');
      linten=test3.bindAsEventListener(divobj)
      CEvent.addListener(divobj, 'click', linten);
    }function test2() {
      var divobj = document.getElementById('mydiv');
      CEvent.removeListener(divobj, 'click', linten);
    }function test3(evt) {
      alert('div的onclick事件被触发!');
    }
    </script><div style="width:300;height:200;background-color:#FF0000" id="mydiv"></div>
    <input type="button" value="添加事件" onclick="test1()" />
    <input type="button" value="取消事件" onclick="test2()" />
      

  2.   

    红色区域这个取消点击事件没起作用呗或是他的作用域的问题?因为默认情况下onclick是可用的。
    再就是你说的点击添加多次多次调用test3方法,这是可定的,点一次添加就执行一次方法啊,若你想点一次后就不调用test3,你可以加个自增数,点一下加一,若是这个数大于1曾不执行test3方法呗。