首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • FireFox下的滚动条事件捕捉问题 [已结贴,结贴人:chen_hh2]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 20:22:46 楼主
    在IE下绑定鼠标滚动事件,采用如下方式:
    Event.observe($("content"),"mousewheel",this.doMouseScrollWheel.bindAsEventListener(this),false);
    在FF下绑定鼠标滚动事件,采用如下方式:
    Event.observe($("content"),"DOMMouseScroll",this.doMouseScrollWheel.bindAsEventListener(this),false);
    上面都没有任何问题,IE和FF下正常使用;

    问题是:
    我想在使用我自己滚动条的时候,把浏览器自己的滚动条事件捕捉禁用,
    //在IE下采用setCapture()方式即可实现,如下:
    if(this.scrollObject.setCapture){
      this.scrollObject.setCapture();
    }
    //而在FF下则只能通过captureEvents来实现,如下
    else
    if(window.captureEvents){
      window.captureEvents(Event.DOMMouseScroll);//这里是我写的代码;
    }
    按照我上面的方式,在IE下正常使用,但是FF下则无法捕捉到它的mouseWheel事件,也就是上面红色标记的事件;

    我的疑问:由于FF下没有MouseWheel事件,而是DOMMouseScroll,那么我上面的写法是不是存在问题;至少我现在
    按照上面的写无法捕捉到浏览器本身的滚动条事件,

    请问:如何实现我上面说的,捕捉FF的mousewheel事件

    请高手指教,共同学习,谢谢!!!
    150  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 20:27:101楼 得分:0
    补充:window.captureEvents(Event.MOUSEMOVE ¦Event.MOUSEUP);确实是FF下捕捉事件的方法;
    至于有没有Event.DOMMouseScroll类型,或者如何捕捉MouseWheel事件我就不知道了,请教大家!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 22:03:332楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 11:15:363楼 得分:0
    加分请教!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 11:19:294楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 12:20:595楼 得分:0
    你想捕捉鼠标滚轮?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 13:41:206楼 得分:0
    我实现了一个自定义的滚动条,所以当我自定义滚动条和浏览器本身的滚动条都出现时,
    先滚动了浏览器的,然后滚动的是我自定义的

    而我需要的正好相反,所以我需要先捕捉到Firefox的鼠标滚轮事件,并禁用它
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-13 16:20:017楼 得分:0
    JScript code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>怎么没有?</title> <style type="text/css"> html, body { margin:0; padding:0; height:2000px; } </style> <script type="text/javascript"> window.onload = function () { var cs = document.getElementById('cs'); if (cs.attachEvent) cs.attachEvent('onmousewheel', scrollMove); else if (cs.addEventListener) { cs.addEventListener('DOMMouseScroll', scrollMove, true); } cs = null; }; var scrollMove = function (e) { e = window.event || e; e.stopPropagation && (e.preventDefault(), e.stopPropagation()) || (e.cancelBubble = true, e.returnValue = false); //取消默认滚动 }; </script> </head> <body> <div id="cs" style="margin-top:50px;width:500px;height:200px; overflow:hidden; border:#000000 1px solid;"> <script type="text/javascript"> !function () { for (var i = 0, a = [] ; i < 201 ; i ++) a[i] = i; document.write(a.join('<br \/>')); }(); </script> </div> <div style="position:absolute;left:481px;top:50px; width:20px; height:10px;font-size:10px; background-color:#000000;">&nbsp;</div> </body> </html>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-13 16:22:148楼 得分:0
    刚写了个禁止默认行为的方法,可供lz参考。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-13 18:09:179楼 得分:0
    JScript code
    if(window.captureEvents){ window.captureEvents(Event.DOMMouseScroll);//这里是我写的代码; } 这个东西,我接触DOM到现在从来没用过它. 貌似它已经被废弃了吧. 在DOM2里... 反正没它也能捕获.. 貌似 FF默认就是setCaputre FF右键貌似没有captrue(JK前辈所说,测试的确如此) 而IE默认不是capture 所以需要 .setCaputre来捕获下... 写过拖拽应该会主要到这个差别. 因为FF,按住鼠标左键从元素上,然后滑到浏览器外在松开...也会触发mouseup 而IE有些情况下不会. 但是 IE:设置了 setCapture则也会捕获到mouseup
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-13 18:12:3710楼 得分:0
    以下代码,稍微做了下wheel同步,没有做drag...
    好啦...回家啃饭...
    JScript code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>scroll</title> <style type="text/css"> html, body { margin:0; padding:0; height:2000px; } </style> <script type="text/javascript"> window.onload = function () { var cs = document.getElementById('cs'), pf = document.getElementById('pf'); if (cs.attachEvent) cs.attachEvent('onmousewheel', scrollMove); else if (cs.addEventListener) { cs.addEventListener('DOMMouseScroll', scrollMove, true); } cs.scrollTop = 0; pf.style.height = Math.max(cs.clientHeight / cs.scrollHeight * cs.clientHeight, 6) + 'px'; cs = pf = null; //非必要 }; var scrollMove = function (e) { var e = window.event || e, o = e.srcElement || e.target, d = -e.wheelDelta || e.detail; o.scrollTop = o.scrollTop + d / Math.abs(d) * Math.floor(o.clientHeight * 0.15); document.getElementById('pf').style.top = 51 + Math.round(o.scrollTop / o.scrollHeight * o.clientHeight) + 'px'; e.stopPropagation && (e.preventDefault(), e.stopPropagation()) || (e.cancelBubble = true, e.returnValue = false); //取消默认滚动 }; </script> </head> <body> <div id="cs" style="margin-top:50px;width:500px;height:200px; overflow:hidden; border:#000000 1px solid;"> <script type="text/javascript"> !function () { for (var i = 0, a = [] ; i < 201 ; i ++) a[i] = i; document.write(a.join('<br \/>')); }(); </script> </div> <div id="pf" style="position:absolute;left:481px;top:50px; width:20px; height:10px;font-size:10px; background-color:#6699CC; border:#CCCCCC 1px solid;">&nbsp;</div> </body> </html>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 20:35:0711楼 得分:0
    muxrwc提供的方法是可行的,非常感谢!

    那么对于这类如何释放上面的捕捉呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-13 21:01:2912楼 得分:0
    释放,我已经写上了,只有IE才涉及释放的问题..就是o.releaseCapture
    FF不需要释放:D
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 22:04:4813楼 得分:0
    楼主:您的答案已经解决我的问题,等结贴一定给分,现在还有一个相关的,想请教你

    虽然FF下鼠标移出事件监听的对象范围后可以移动流浪其本身的滚动条;

    而我则需要的是在自己定义的滚动条滚动到最底部时再滚动浏览器本身的滚动条;

    在IE下我使用releaseCapture即可,而在FF下如果不采用类似releaseEvents的话则当鼠标还未移出

    监听事件对象的时候无法滚动浏览器的滚动条,就像你上面写的示例代码,当滚动到最下面的时候,

    如果鼠标不移出那个DIV则无法滚动外面的,而我想当滚动在最下面的时候(自己代码判断)即使鼠标还在DIV防伪

    内也可以滚动浏览器的,

    有什么方式吗?比如类似window.releaseEvents(Event.MOUSEMOVE ¦Event.MOUSEUP ¦Event.STARTSELECT);?


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 22:05:3814楼 得分:0
    楼主:您的答案已经解决我的问题,等结贴一定给分,现在还有一个相关的,想请教你

    虽然FF下鼠标移出事件监听的对象范围后可以移动流浪其本身的滚动条;

    而我则需要的是在自己定义的滚动条滚动到最底部时再滚动浏览器本身的滚动条;

    在IE下我使用releaseCapture即可,而在FF下如果不采用类似releaseEvents的话则当鼠标还未移出

    监听事件对象的时候无法滚动浏览器的滚动条,就像你上面写的示例代码,当滚动到最下面的时候,

    如果鼠标不移出那个DIV则无法滚动外面的,而我想当滚动在最下面的时候(自己代码判断)即使鼠标还在DIV防伪

    内也可以滚动浏览器的,

    有什么方式吗?比如类似window.releaseEvents(Event.MOUSEMOVE ¦Event.MOUSEUP ¦Event.STARTSELECT);?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 22:07:3015楼 得分:0
    楼主:您的答案已经解决我的问题,等结贴一定给分,现在还有一个相关的,想请教你

    虽然FF下鼠标移出事件监听的对象范围后可以移动流浪其本身的滚动条;

    而我则需要的是在自己定义的滚动条滚动到最底部时再滚动浏览器本身的滚动条;

    在IE下我使用releaseCapture即可,而在FF下如果不采用类似releaseEvents的话则当鼠标还未移出

    监听事件对象的时候无法滚动浏览器的滚动条,就像你上面写的示例代码,当滚动到最下面的时候,

    如果鼠标不移出那个DIV则无法滚动外面的,而我想当滚动在最下面的时候(自己代码判断)即使鼠标还在DIV防伪

    内也可以滚动浏览器的,

    有什么方式吗?比如类似window.releaseEvents(Event.MOUSEMOVE ¦Event.MOUSEUP ¦Event.STARTSELECT);?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-14 01:03:0016楼 得分:150
    这个和捕获有什么关系?
    因为阻止了默认的事件,才会阻止默认的滚动事件..如果达到条件了,就不阻止默认事件就好了...
    可以参考下面的例子.
    JScript code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>scroll</title> <style type="text/css"> html, body { margin:0; padding:0; height:2000px; } </style> <script type="text/javascript"> window.onload = function () { var cs = document.getElementById('cs'), pf = document.getElementById('pf'); if (cs.attachEvent) cs.attachEvent('onmousewheel', scrollMove); else if (cs.addEventListener) { cs.addEventListener('DOMMouseScroll', scrollMove, true); } cs.scrollTop = 0; pf.style.height = Math.max(cs.clientHeight / cs.scrollHeight * cs.clientHeight, 6) + 'px'; cs = pf = null; //非必要 }; var scrollMove = function (e) { var e = window.event || e, o = e.srcElement || e.target, d = -e.wheelDelta || e.detail; o.scrollTop = o.scrollTop + d / Math.abs(d) * Math.floor(o.clientHeight * 0.15); document.getElementById('pf').style.top = 51 + Math.round(o.scrollTop / o.scrollHeight * o.clientHeight) + 'px'; ((o.scrollTop + o.clientHeight) != o.scrollHeight) //没有问题的话取消默认滚动 && (e.preventDefault && e.preventDefault() || (e.returnValue = false)); }; </script> </head> <body> <div id="cs" style="margin-top:50px;width:500px;height:200px; overflow:hidden; border:#000000 1px solid;"> <script type="text/javascript"> !function () { for (var i = 0, a = [] ; i < 201 ; i ++) a[i] = i; document.write(a.join('<br \/>')); }(); </script> </div> <div id="pf" style="position:absolute;left:481px;top:50px; width:20px; height:10px;font-size:10px; background-color:#6699CC; border:#CCCCCC 1px solid;">&nbsp;</div> </body> </html>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 19:18:0017楼 得分:0
    恩,我弄明白了,问题也完美解决的,非常感谢!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • muxrwc
    • 等级:
    发表于:2008-05-16 11:50:2018楼 得分:0
    抱歉写错了..忘记考虑返回值了,不过那个不影响...

    但是还是改一下....

    JScript code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>scroll</title> <style type="text/css"> html, body { margin:0; padding:0; height:2000px; } </style> <script type="text/javascript"> window.onload = function () { var cs = document.getElementById('cs'), pf = document.getElementById('pf'); if (cs.attachEvent) cs.attachEvent('onmousewheel', scrollMove); else if (cs.addEventListener) { cs.addEventListener('DOMMouseScroll', scrollMove, true); } cs.scrollTop = 0; pf.style.height = Math.max(cs.clientHeight / cs.scrollHeight * cs.clientHeight, 6) + 'px'; cs = pf = null; //非必要 }; var scrollMove = function (e) { var e = window.event || e, o = e.srcElement || e.target, d = -e.wheelDelta || e.detail; o.scrollTop = o.scrollTop + d / Math.abs(d) * Math.floor(o.clientHeight * 0.15); document.getElementById('pf').style.top = 51 + Math.round(o.scrollTop / o.scrollHeight * o.clientHeight) + 'px'; ((o.scrollTop + o.clientHeight) != o.scrollHeight) //没有问题的话取消默认滚动 && (e.preventDefault && (e.preventDefault(), 1) || (e.returnValue = false)); }; </script> </head> <body> <div id="cs" style="margin-top:50px;width:500px;height:200px; overflow:hidden; border:#000000 1px solid;"> <script type="text/javascript"> !function () { for (var i = 0, a = [] ; i < 201 ; i ++) a[i] = i; document.write(a.join('<br \/>')); }(); </script> </div> <div id="pf" style="position:absolute;left:481px;top:50px; width:20px; height:10px;font-size:10px; background-color:#6699CC; border:#CCCCCC 1px solid;">&nbsp;</div> </body> </html>
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved