Короче, я посмотрел существующие решения, не удовлетворился ими и сделал проще и надёжнее: медианный фильтр плюс таймаут:
this.wheelTimeStamp = 0;
this.prevDelta = 0;
this.filterBuf = [];
this.wheel = function(e) {
e.preventDefault();
if(Math.abs(e.originalEvent.deltaY) <= Math.abs(e.originalEvent.deltaX)) return;
var delta = e.originalEvent.deltaY;
if(this.filterBuf.length == 15) {
this.filterBuf.shift();
}
this.filterBuf.push(Math.abs(delta) - Math.abs(this.prevDelta));
var tmpBuf = this.filterBuf.slice();
tmpBuf.sort();
var dd = tmpBuf[Math.floor(this.filterBuf.length / 2)];
this.prevDelta = delta;
if(dd > 0) {
if(e.timeStamp - this.wheelTimeStamp > Phy.WheelTimeDelta) {
this.filterBuf = [];
this.wheelTimeStamp = e.timeStamp;
this.scroll(delta < 0 ? "up" : "down");
}
}
};