search
HomeWeb Front-endJS TutorialUnderstanding JS wheel events (mousewheel/DOMMouseScroll)

Understanding JS wheel events (mousewheel/DOMMouseScroll)

JS wheel event (mousewheel/DOMMouseScroll) understanding

1. There is no end to learning, review the past and learn the new

//zxx: This paragraph has nothing to do with technology. Some very personal complaints can be skipped.
I no longer have the photographic memory I had when I was a primary school student. I have made many things and come into contact with myself in just one year. I don’t remember it at all after that. For example, I can’t remember the method of getting the distance between an element and the page (getBoundingClientRect), or I can’t remember the method of triggering a DOM custom event (dispatchEvent) in modern browsers. Obviously, you need to review properly, read the previous things, or have some free time. It is still necessary to take time to deal with related things. In fact, if you think about it carefully, it is your own fault that you can't remember things. You didn't find ways to remember them when you were fiddling with them (rather than remembering them through repeated use). For example, getBoundingClientRect means "get the bounds of the client rectangle", or use evil notation to remember "cut (g) force (b) fuck (c) soft (r)". The dispatchEvent method uses "3 steps", "create (createEvent) - initial (init*Event) - dispatch (dispatchEvent)".

The pace of learning cannot stop. Those "perverts" who stand to the end also have things they don't know. Obviously, we juniors, especially our younger selves, don't know even more. Who hasn't been more or less confused when they were young, asking themselves "where is the road?" and "which direction should I go?" No matter what you choose, the pace of learning cannot stop. If you persevere, the path will become clear and you will know where to go next. Just be timid and muddle along, youth is your capital, move forward without hesitation.

I am on the current path based on interest. It is purely interest learning (I like these things and I want to learn them), not professional learning (I will learn whatever is needed to do front-end work). During these years of work, my self-immersion in technology and products has unknowingly limited my vision. Fortunately, realizing the existence of the problem has actually solved half of the problem. The reason why I say this here is to remind myself that I must not overdo it. Learning about technology and products is still important. I just need to look up more and look at the world outside the office (not the superficial understanding gained by browsing Weibo).

I came across the "wheel event" by chance yesterday. I used the mouse wheel event when I was tossing about "custom scroll bars" before. However, this is based on the mousewheel event that MooTools is already compatible with. If you want to tell me, The implementation mechanism, browser compatibility differences, etc., I was dumbfounded. There is no end to learning, so check it out, practice it, and sort it out.

2. Complete list of compatibility differences

The compatibility differences of scroll wheel events are somewhat eclectic. It is not the previous IE8-sect and other factions, but the FireFox faction and other factions.

Browsers including IE6 use onmousewheel, while FireFox browser uses DOMMouseScroll. After my own testing, even under FireFox 19, onmousewheel is not recognized.

One of the simplest usage differences (the body scroll bar is supported by an internal div of a certain height):

document.body.onmousewheel = function(event) {
event = event || window.event;
console.dir(event);
};

##document.body.addEventListener("DOMMouseScroll", function(event ) {

console.dir(event);
});

The above output differences are shown below (IE7, IE10, Chrome, and FireFox, scroll down, win7) (You can click this page to view the table content separately):

3. Compatible wheel event methods

Know yourself and the enemy and you will be victorious. If you know the differences, you will know how to deal with them. After all, we are not writing a JS library. We only deal with the difference in scrolling direction here.

Integrate our usual event adding methods, so there is (the code below is addEvent.js):

/**
 * 简易的事件添加方法
 */
 define(function(require, exports, module) {
    exports.addEvent = (function(window, undefined) {        
        var _eventCompat = function(event) {
            var type = event.type;            if (type == 'DOMMouseScroll' || type == 'mousewheel') {
                event.delta = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
            }
            //alert(event.delta);
            if (event.srcElement && !event.target) {
                event.target = event.srcElement;    
            }
            if (!event.preventDefault && event.returnValue !== undefined) {
                event.preventDefault = function() {
                    event.returnValue = false;
                };
            }            /* 
               ......其他一些兼容性处理 */
            return event;
        };
        if (window.addEventListener) {
            return function(el, type, fn, capture) {                if (type === "mousewheel" && document.mozHidden !== undefined) {
                    type = "DOMMouseScroll";
                }
                el.addEventListener(type, function(event) {
                    fn.call(this, _eventCompat(event));
                }, capture || false);
            }
        } else if (window.attachEvent) {
            return function(el, type, fn, capture) {
                el.attachEvent("on" + type, function(event) {
                    event = event || window.event;
                    fn.call(el, _eventCompat(event));    
                });
            }
        }
        return function() {};    
    })(window);        
});

So, we can use the mousewheel event easily. For example:

addEvent(dom, "mousewheel", function(event) {
    if (event.delta < 0) { alert("鼠标向上滚了!"); }
});

The relevant code is implemented as follows. The following shows the core codes for smooth movement (codenamed slide.js):

/**
 * 简易的列表左右滑动切换效果
 * 鼠标事件是关键,因此,一些数值写死在方法中,纯测试用
 */
 define(function(require, exports, module) {    var Event = require("/study/201304/addEvent.js");
    var _move = function(ele, to, from) {        // 动画实现
        // ...
    };
    return {
        index: 0,
        visible: 4,
        init: function(box) {            // box指滚动的列表容器
            var self = this
              , length = box.getElementsByTagName("li").length;            Event.addEvent(box.parentNode, "mousewheel", function(event) {
                 if (event.delta > 0 && self.index > 0) {                    // 往上滚
                    self.index--;
                 } else if (event.delta < 0 && self.index < length - self.visible) {                     // 往下
                     self.index++;                     
                 } else {
                    return; 
                 }
                 _move(box, -1 * self.index * 140);    
              
                 event.preventDefault();
            });
        }
    };
});

The principle is very simple, the scroll wheel changes, the index changes, That is, the final position of the list changes and the animation reaches the target position.

Then, the demo page can be simply called using seajs!

var $ = function(id) {
    return document.getElementById(id);
};
seajs.use("/study/201304/slide.js", function(slide) {
    slide.init($("slideBox"));
});

That’s it. For some specific details, such as the HTML part or the implementation of animation, you can go to the demo to view the code display.

However, judging from the effect, the scrolling under IE6 and IE7 browsers does not have the scroll bar of the hold page. The same is true for many other attempts. I hope that colleagues with relevant experience can give guidance and optimize the scrolling under IE7/IE7 browsers. Experience the effect.

Originally, I wanted to add a demo of a custom scroll bar. When I looked at the time, I checked and saw that it was already 1:11:11. What an unlucky number. I checked the Programmer’s Fortune Perpetual Calendar. , today is not a good time to write a demo. So, epilogue to sleep.

Recommended tutorial: "JS Basic Tutorial"

The above is the detailed content of Understanding JS wheel events (mousewheel/DOMMouseScroll). For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:liqingbo. If there is any infringement, please contact admin@php.cn delete
JavaScript Engines: Comparing ImplementationsJavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Beyond the Browser: JavaScript in the Real WorldBeyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AM

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.

Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration)How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AM

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base

JavaScript: Exploring the Versatility of a Web LanguageJavaScript: Exploring the Versatility of a Web LanguageApr 11, 2025 am 12:01 AM

JavaScript is the core language of modern web development and is widely used for its diversity and flexibility. 1) Front-end development: build dynamic web pages and single-page applications through DOM operations and modern frameworks (such as React, Vue.js, Angular). 2) Server-side development: Node.js uses a non-blocking I/O model to handle high concurrency and real-time applications. 3) Mobile and desktop application development: cross-platform development is realized through ReactNative and Electron to improve development efficiency.

The Evolution of JavaScript: Current Trends and Future ProspectsThe Evolution of JavaScript: Current Trends and Future ProspectsApr 10, 2025 am 09:33 AM

The latest trends in JavaScript include the rise of TypeScript, the popularity of modern frameworks and libraries, and the application of WebAssembly. Future prospects cover more powerful type systems, the development of server-side JavaScript, the expansion of artificial intelligence and machine learning, and the potential of IoT and edge computing.

Demystifying JavaScript: What It Does and Why It MattersDemystifying JavaScript: What It Does and Why It MattersApr 09, 2025 am 12:07 AM

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

Is Python or JavaScript better?Is Python or JavaScript better?Apr 06, 2025 am 12:14 AM

Python is more suitable for data science and machine learning, while JavaScript is more suitable for front-end and full-stack development. 1. Python is known for its concise syntax and rich library ecosystem, and is suitable for data analysis and web development. 2. JavaScript is the core of front-end development. Node.js supports server-side programming and is suitable for full-stack development.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.