滚轮事件是一个非常有用的事件,在翻页或放大时,通常都用到它。但它在各浏览器中实现兼容是相对比较困难的,号称最标准的 FF ,用了一个私有实现 DOMMous
javascript滚轮事件总结
滚轮事件是一个非常有用的事件,在翻页或放大时,通常都用到它。但它在各浏览器中实现兼容是相对比较困难的,号称最标准的FF,用了一个私有实现DOMMouseScroll,而使用mousewheel的其他浏览器或多或少有点bug。我们先看各浏览器对它的支持程度吧。
IE
firefox
safari
chrome
opera
window对象
false
true
true
true
true
文档对象
true
true
true
true
true
元素节点
true
true
true
true
true
接着我们看一下,如何在火狐中实现滚轮事件的事件分派:
window.addEventListener("DOMMouseScroll",function(event){
alert(event.type)
alert(event.clientY)
},false);
var event = document.createEvent("MouseEvent");
//为了证明分派成功,特意将其clientY设为90
event.initMouseEvent("DOMMouseScroll",true, null, window,0,0,0,0,90,false,false,false,false,0,null);
window.dispatchEvent(event)
<!doctype html>
<html lang="zh-ch">
<head>
<meta charset="utf-8" />
<meta content="IE=8" http-equiv="X-UA-Compatible"/>
<title>mousewheel的事件分派 by 司徒正美</title>
<script type="text/javascript">
window.onload = function(){
window.addEventListener("DOMMouseScroll",function(event){
alert(event.type)
alert(event.clientY)
},false);
var event = document.createEvent("MouseEvent");
//为了证明分派成功,特意将其clientY设为90
event.initMouseEvent("DOMMouseScroll",true, null, window,0,0,0,0,90,false,false,false,false,0,null);
window.dispatchEvent(event)
}
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
运行代码
我们可以看到虽然其他标准浏览器也支持这个名为DOMMouseScroll的事件发派,但当我们手动滚动鼠标滑轮时,也只有FF有反应,弹出两个alert。对于其他标准浏览器,我们改用mousewheel试试。
window.addEventListener("mousewheel",function(event){
alert(event.type)
alert(event.clientX)
},false);
var event = document.createEvent("MouseEvent");
//为了证明分派成功,特意将其clientX设为120
event.initMouseEvent("mousewheel",true, null, window,0,0,0,120,0,false,false,false,false,0,null);
window.dispatchEvent(event)
<!doctype html>
<html lang="zh-ch">
<head>
<meta charset="utf-8" />
<meta content="IE=8" http-equiv="X-UA-Compatible"/>
<title>mousewheel的事件分派 by 司徒正美</title>
<script type="text/javascript">
window.addEventListener("mousewheel",function(event){
alert(event.type)
alert(event.clientX)
},false);
var event = document.createEvent("MouseEvent");
//为了证明分派成功,特意将其clientX设为120
event.initMouseEvent("mousewheel",true, null, window,0,0,0,120,0,false,false,false,false,0,null);
window.dispatchEvent(event)
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
运行代码
这个在FF的以外的标准浏览器见效,FF只能实现事件分派,不能实现手动触发。可以说,如果非原浏览器原生支持的事件类型,addEventListener是一概不理会的。
对于IE就简单得多了,它没有初始化事件的步骤,你也无法设置其属性,因为那是只读的,但可以设置自定义属性。
window.onload = function(){
document.attachEvent("onmousewheel",function(){
var e = window.event;
alert(e)
alert(e.type)
alert(e.aa)
});
var event = document.createEventObject();
event.aa = "司徒正美"
document.fireEvent("onmousewheel",event)
}
<!doctype html>
<html lang="zh-ch">
<head>
<meta charset="utf-8" />
<meta content="IE=8" http-equiv="X-UA-Compatible"/>
<title>mousewheel的事件分派 by 司徒正美</title>
<script type="text/javascript">
window.onload = function(){
document.attachEvent("onmousewheel",function(){
var e = window.event;
alert(e)
alert(e.type)
alert(e.aa)
});
var event = document.createEventObject();
event.aa = "司徒正美"
document.fireEvent("onmousewheel",event)
}
</script>
<style type="text/css">
</style>
</head>
<body>
</body>
</html>
运行代码
转自:it民工网[http://www.itminggong.com]
原文链接:http://itminggong.com/a/jishuwenzhang/_net/2011/0304/6540.html
说完事件分派,就到事件绑定部分。虽然现在只有 FF 在用 DOMMouseScroll ,但考虑到未来 FF 改用的 mousewheel 的可能,我们还是写个程序来检测其需要的事件类型吧。最后我们还要在回调函
说完事件分派,就到事件绑定部分。虽然现在只有FF在用DOMMouseScroll,但考虑到未来FF改用的mousewheel的可能,我们还是写个程序来检测其需要的事件类型吧。最后我们还要在回调函数中修正其滚动属性:
· IE的属性名为detail,w3c那边为wheelDelta,现在统一为delta。
· IE等往上滚一圈为120,往下滚一圈为-120。w3c那边往上滚一圈为-3,往下滚一圈为3,但opera9x系列却实现错误,与IE滚动方向一致,不过10后又修复。
· safari早期版本,wheelDelta会出现浮点数的情况,我们需要自行取整。
var eventSupported = function( eventName,el ) {
el = el || document.createElement("div");
eventName = "on" + eventName;
var isSupported = (eventName in el);
if (el.setAttribute && !isSupported ) {
el.setAttribute(eventName, "return;");
isSupported = typeof el[eventName] === "function";
}
el = null;
return isSupported;
};
var addEvent = function(obj,type,callback){
if ( obj.addEventListener ) {
obj.addEventListener( type, callback, false );
} else if ( obj.attachEvent ) {
obj.attachEvent( "on" + type, callback );
}
}
var type = eventSupported("mousewheel") ? "mousewheel":"DOMMouseScroll";
//注意IE下window没有滚轮事件
var wheel = function(obj,callback){
addEvent(obj, type,function(event){
event = event || window.event;
var delta = 0;
if (event.wheelDelta) {
delta = event.wheelDelta/120;
//opera 9x系列的滚动方向与IE保持一致,10后修正
if(window.opera && window.opera.version() < 10)
delta = -delta;
} else if (event.detail) {
delta = -event.detail/3;
}
//由于事件对象的原有属性是只读,我们只能通过添加一个私有属性delta来解决兼容问题
event.delta = Math.round(delta); //修正safari的浮点 bug
callback.call(obj,event);
});
}
用法:
wheel(document,function(e){
alert(e.delta)
});
<!doctype html>
<html lang="zh-ch">
<head>
<meta charset="utf-8" />
<meta content="IE=8" http-equiv="X-UA-Compatible"/>
<title>mousewheel的事件绑定 by 司徒正美</title>
<script type="text/javascript">
window.onload = function(){
var eventSupported = function( eventName,el ) {
el = el || document.createElement("div");
eventName = "on" + eventName;
var isSupported = (eventName in el);
if (el.setAttribute && !isSupported ) {
el.setAttribute(eventName, "return;");
isSupported = typeof el[eventName] === "function";
}
el = null;
return isSupported;
};
var addEvent = function(obj,type,callback){
if ( obj.addEventListener ) {
obj.addEventListener( type, callback, false );
} else if ( obj.attachEvent ) {
obj.attachEvent( "on" + type, callback );
}
}
var type = eventSupported("mousewheel") ? "mousewheel":"DOMMouseScroll";
//注意IE下window没有滚轮事件
var wheel = function(obj,callback){
addEvent(obj, type,function(event){
event = event || window.event;
var delta = 0;
if (event.wheelDelta) {
delta = event.wheelDelta/120;
//opera 9x系列的滚动方向与IE保持一致,10后修正
if(window.opera && window.opera.version() < 10)
delta = -delta;
} else if (event.detail) {
delta = -event.detail/3;
}
//由于事件对象的原有属性是只读,我们只能通过添加一个私有属性delta来解决兼容问题
event.delta = Math.round(delta); //修正safari的浮点 bug
callback.call(obj,event);
});
}
var counterDelta = 0;
wheel(document.getElementById("delta"),function(e){
counterDelta += e.delta
this.innerHTML = counterDelta + ": " + ( e.delta < 0 ? '向下滚' : '向上滚' );
});
}
</script>
<style type="text/css">
body {
padding:20px 100px;
}
a{
color:#FFDEAD;
}
#delta {
padding:10px;
width: 100px;
height: 100px;
background:#4DC2F2;
color:#FF8C00;
font-weight:bolder;
}
</style>
</head>
<body>
<h1><a href="http://www.cnblogs.com/rubylouvre/">mousewheel的事件绑定</a></h1>
<div id="delta" >
by 司徒正美
</div>
</body>
</html>
运行代码
<script type="text/javascript"> if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 57731; var cb_entryId = 1725462; var cb_blogApp = "rubylouvre"; var cb_blogUserGuid = "2e47a4b1-de3e-de11-9510-001cf0cd104b"; var cb_entryCreatedDate = '2010/5/1 2:28:00';
转自:it民工网[http://www.itminggong.com]
原文链接:http://itminggong.com/a/jishuwenzhang/_net/2011/0304/6541.html