can3p, постановка задачи (кроссбраузерные функции установки обрабочиков) исключает использование jquery.
B~Vladi,
Цитата:
|
Что мешает повесить и DOMMouseScroll и onmousewheel?!
|
Как раз не хочется извращаться. Нужно минимальным вмешательством в существующий код добавить поддержку onmousewheel.
Временно я опеделяю FF через Event.LOAD, но это очень криво, надо поменять на что-то. Или решить проблему иным способом.
/*
Установка обработчиков событий.
windows.addEH(node, type, handler) -- повесить обработчик
windows.delEH(node, type, handler) -- снять обработчик
В MSIE обработчик получает аргумент event дополненный следующими методами и свойствами:
event.preventDefault
event.stopPropagation
event.pageX
event.pageY
event.relatedTarget
event.which
Во всех браузерах:
метод stop объекта Event выполняет методы preventDefault и stopPropagation
свойство isWheelDown возвращает направление колеса мыши (true -- колесо на себя, false -- от себя)
*/
(function(){
//
// Установка обработчиков для MSIE основана на коде Dean Edwards.
//
var win = window,
doc = document,
huid = 0, // счетчик, используемый для создания уникальных ID
uniPropName = "$RNV601MCTCU",
W3C = !! win.addEventListener, // document.implementation.hasFeature("Events", "2.0")
// -------------------------------------------------------------------------------------
// ВОТ ЗДЕСЬ
// надо заменить Event.LOAD на внятную проверку поддержки события "DOMMouseScroll"
mousewheel = { mousewheel : win.Event && Event.LOAD ? "DOMMouseScroll" : null },
handle = function () {
var returnValue = true,
event = getFixedIEEvent(window.event || (this.ownerDocument || this).parentWindow.event),
handlers = this[uniPropName][event.type];
for (var i in handlers)
if (handlers[i].call(this, event) === false)
returnValue = false;
return returnValue;
},
getFixedIEEvent = function (event) {
// Добавление стандартных методов событий W3C
var d = doc.documentElement,
b = doc.body,
button = event.button,
target = event.target = event.srcElement || doc;
// pageX и pageY корректные для quirks и строгих режимов
event.pageX = event.clientX + (d.scrollLeft || b.scrollLeft || 0) - (d.clientLeft || 0);
event.pageY = event.clientY + (d.scrollTop || b.scrollTop || 0) - (d.clientTop || 0);
event.relatedTarget = event.fromElement == target ? event.toElement : event.fromElement;
// which -- Returns the numeric keyCode of the key pressed, or the character code (charCode) for an alphanumeric key pressed
// -------------------------------------------------------------------------
// | MSIE | Konqueror | Opera, FF, Safari Win
// -------------------------------------------------------------------------
// левая | event.which | undefined | 1 | 1
// кнопка | event.button | 1 | 1 | 0
// средняя | event.which | undefined | 2 | 2
// кнопка | event.button | 4 | 4 | 1
// правая | event.which | undefined | 3 | 3
// кнопка | event.button | 2 | 2 | 2
//
// Поскольку в W3C-совместимых движках мы обходимся без оберток, (и соответственно фиксим событие только в ие),
// то для определения нажатой кнопки мыши приходится использовать устаревший which (почему -- см. таблицу)
//
event.which = event.charCode || event.keyCode || (button < 2 ? 1 : button == 4 ? 2 : 3);
event.preventDefault = preventDefault;
event.stopPropagation = stopPropagation;
//event.detail = event.wheelDelta / -40;
event.stop = stop;
event.isWheelDown = event.wheelDelta < 0;
return event;
},
preventDefault = function() {
this.returnValue = false;
},
stopPropagation = function() {
this.cancelBubble = true;
},
stop = function () {
this.preventDefault();
this.stopPropagation();
};
if(win.Event) {
Event.prototype.stop = stop;
// В FF MouseScrollEvent не наследует у Event, поэтому добавляем "isWheelDown" соответствующему объекту
(win.MouseScrollEvent || Event).prototype.__defineGetter__("isWheelDown", function (){
// Особенности события mousewheel в браузерах: [url]http://generalized.ru/?p=133[/url]
return this.detail > 0 || this.wheelDelta < 0
})
};
win.addEH = W3C ?
function(node, type, handler) {
node.addEventListener(mousewheel[type] || type, handler, false);
} :
function(node, type, handler) {
type = mousewheel[type] || type;
var ontype = "on" + type,
events = node[uniPropName] || (node[uniPropName] = {}),
handlers = events[type];
handlers || (
handlers = events[type] = {},
node[ontype] &&
(handlers[0] = node[ontype])
);
handler[uniPropName] || (
handler[uniPropName] = huid++
);
handlers[huid] = handler;
node[ontype] = handle;
};
win.delEH = W3C ?
function(node, type, handler) {
node.removeEventListener(mousewheel[type] || type, handler, false);
} :
function(node, type, handler) {
type = mousewheel[type] || type;
if (node[uniPropName] && node[uniPropName][type])
delete node[uniPropName][type][handler[uniPropName]];
};
})()