找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2626|回复: 10

[求助] 为什么鼠标滚轮事件不能注销掉

[复制链接]
发表于 2014-6-23 15:00:18 | 显示全部楼层 |阅读模式
50体力
本帖最后由 chocho 于 2014-6-24 00:49 编辑

在做一个小插件

遇到了鼠标滚轮事件不能注销的问题

我把代码精简了一下  

请大家帮我看看问题出在哪里

谢谢了

 提示:您可以先修改部分代码再运行

最佳答案

查看完整内容

javascript没有私有方法,你如果想这么做的话可以这样我一般自己写代码的时候不会去考虑私有这个概念,一般如果不想让别人访问,方法前面加_,表示“伪私有”
发表于 2014-6-23 15:00:19 | 显示全部楼层
chocho 发表于 2014-6-24 15:02
你说的我理解了  就是没次运行一次函数的时候 他内部的子函数 会重新声明

这应该就是问题的根源  但是 ...


javascript没有私有方法,你如果想这么做的话可以这样
  1. var obj=(function(){

  2.         function onClick(){
  3.                 document.onclick=clickHandler;
  4.         }

  5.         function clickHandler(){
  6.                 alert(1);
  7.         }

  8.         return {
  9.                 click:onClick
  10.         }

  11. })();

  12. obj.click();  
复制代码
我一般自己写代码的时候不会去考虑私有这个概念,一般如果不想让别人访问,方法前面加_,表示“伪私有”
  1. (function(window){
  2.        
  3.         window.SUI=window.SUI||{};

  4.         /*
  5.          * @desc 鼠标滚轮
  6.          * @param
  7.          */
  8.        
  9.          SUI.MouseWheel=function(obj,result){

  10.                  this.obj=obj;
  11.                  this.result=result||function(){};
  12.          }

  13.          SUI.MouseWheel.prototype={

  14.                  init:function(){
  15.                          this.bindEvent(this.obj,'mousewheel',this.bind(this,this._mouseWheel));
  16.                          this.bindEvent(this.obj,'DOMMouseScroll',this.bind(this,this._mouseWheel));
  17.                  },

  18.                  _mouseWheel:function(event){
  19.                          var data=this._getWheelData(event);

  20.                         this.result&&this.result(data);

  21.                         if(event.preventDefault){
  22.                                 event.preventDefault();
  23.                         }else{
  24.                                 window.event.returnValue=false;
  25.                         }
  26.                  },

  27.                  _getWheelData:function(event){
  28.                          var e=event||window.event;
  29.                         return e.wheelDelta?e.wheelDelta:-e.detail*40;
  30.                  },

  31.                  bindEvent:function(node,type,handler){
  32.                          if(node.addEventListener){
  33.                                 node.addEventListener(type,handler,false);
  34.                         }else if(node.attachEvent){
  35.                                 node.attachEvent('on'+type,handler);
  36.                         }else{
  37.                                 node['on'+type]=handler;
  38.                         }
  39.                  },

  40.                  bind:function(obj,handler){
  41.                         return function(){
  42.                                 return handler.apply(obj,arguments);
  43.                         }
  44.                 }
  45.          }

  46. })(window);
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-23 19:44:40 | 显示全部楼层
求解决啊  同志们  今天弄了一天了
回复

使用道具 举报

发表于 2014-6-24 01:31:07 | 显示全部楼层
  1. //滚轮事件
  2.                 function handleMouseWheel(e){
  3.                  text.innerHTML=text.innerHTML+' w'
  4.                 }
复制代码
把它变成全局的函数,原因我个人认为是这个函数声明了两次的关系

正在看球,暂时不深入研究了,你可以自己研究一下
回复

使用道具 举报

 楼主| 发表于 2014-6-24 14:28:39 | 显示全部楼层
DreamJser 发表于 2014-6-24 01:31
把它变成全局的函数,原因我个人认为是这个函数声明了两次的关系

正在看球,暂时不深入研究了,你可以自 ...

不是注册了两个啊  是掉用了两个而已 有一次是无效的  
                    EventUtil.addHandler(document,'mousewheel',handleMouseWheel); //ie
                    EventUtil.addHandler(document,'DOMMouseScroll',handleMouseWheel); //ff
在ff下 我把第一句注释掉也没用

你有时间的话 帮我看看啊  我昨天弄了一下午  现在再去谷歌一下看看
回复

使用道具 举报

发表于 2014-6-24 14:38:31 | 显示全部楼层
chocho 发表于 2014-6-24 14:28
不是注册了两个啊  是掉用了两个而已 有一次是无效的  
                    EventUtil.addHandler(document,'m ...

 提示:您可以先修改部分代码再运行

回复

使用道具 举报

发表于 2014-6-24 14:50:37 | 显示全部楼层
chocho 发表于 2014-6-24 14:28
不是注册了两个啊  是掉用了两个而已 有一次是无效的  
                    EventUtil.addHandler(document,'m ...

我的意思是你在调用triggerFun方法的时候,会声明一次handleMouseWheel函数,
你一开始的时候先调用了一次triggerFun,也就是声明了一次handleMouseWheel函数,然后绑定了事件
当点击按钮时,你又调用了一次,这时会再次声明一遍handleMouseWheel函数,然后解除了绑定

这应该是导致无法解除绑定的原因,我也不太好解释这个东西,我的理解是先后两次声明的事件处理函数不是“相同”的函数,因为它声明的时间点不一样(纯属个人理解哈,请勿当真)
  1. triggerFun : function(b){
  2.                     var thisWin=this
  3.             if(b == false){
  4.                     EventUtil.removeHandler(document,'mousewheel',handleMouseWheel);//ie
  5.                     EventUtil.removeHandler(document,'DOMMouseScroll',handleMouseWheel);//ff
  6.             }else{
  7.                     EventUtil.addHandler(document,'mousewheel',handleMouseWheel);//ie
  8.                     EventUtil.addHandler(document,'DOMMouseScroll',handleMouseWheel);//ff
  9.             }
  10.                 //滚轮事件
  11.                 function handleMouseWheel(e){
  12.                  text.innerHTML=text.innerHTML+' w'
  13.                 }
  14.     }
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-24 15:02:06 | 显示全部楼层
DreamJser 发表于 2014-6-24 14:50
我的意思是你在调用triggerFun方法的时候,会声明一次handleMouseWheel函数,
你一开始的时候先调用了一 ...

你说的我理解了  就是没次运行一次函数的时候 他内部的子函数 会重新声明

这应该就是问题的根源  但是我是在写一个滚动条插件  我想封装一下

如果把事件函数handleMouseWheel放到原型上 做一个方法应该可以解决(我还没试   一会试试)

但是那样的话每个实例都能掉用这个handleMouseWheel方法  是不是不好啊

首先实例没必要有这个方法  外部不需要调用

其次从封装的角度来说这样是不是不合适呢?  有没有更好的办法啊  

谢谢啦
回复

使用道具 举报

 楼主| 发表于 2014-6-24 15:05:39 | 显示全部楼层
DreamJser 发表于 2014-6-24 14:50
我的意思是你在调用triggerFun方法的时候,会声明一次handleMouseWheel函数,
你一开始的时候先调用了一 ...

而且插件有很多事件 要是都添加到原型方法上的话 那要加很多方法了
回复

使用道具 举报

 楼主| 发表于 2014-6-24 15:30:52 | 显示全部楼层
DreamJser 发表于 2014-6-24 15:22
javascript没有私有方法,你如果想这么做的话可以这样我一般自己写代码的时候不会去考虑私有这个概念, ...

谢谢
呵呵  我刚好找到了这篇文章 http://www.cnblogs.com/sitemanager/p/3535904.html  和你说的很像一个意思

我好好研究一下
回复

使用道具 举报

发表于 2014-6-24 15:34:41 | 显示全部楼层
chocho 发表于 2014-6-24 15:30
谢谢
呵呵  我刚好找到了这篇文章 http://www.cnblogs.com/sitemanager/p/3535904.html  和你说的很像 ...

不用客气,大家共同学习共同研究哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备19000417号-2 )

GMT+8, 2021-11-29 10:29 , Processed in 0.065767 second(s), 7 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表