JavaScript. Подробное руководство, 6-е издание
Шрифт:
// Необходимо решить некоторые проблемы совместимости броузеров
var isMacWebkit = (navigator.userAgent.index0f("Macintosh") !== -1 &&
navigator.userAgent.index0f("WebKit") !== -1);
var isFirefox = (navigator.userAgent.index0f("Gecko") !== -1);
// Зарегистрировать обработчики событий mousewheel.
frame.onwheel = wheelHandler; //
Для будущих броузеров
frame.onmousewheel = wheelHandler; // Для большинства текущих броузеров
if (isFirefox) // Только Firefox
frame.addEventListener("DOMMouseScroll", wheelHandler, false);
function wheelHandler(event) {
var e = event || window.event; // Объект события, стандартный или IE
// Получить величину прокрутки из объекта события, проверив свойства объекта
// события wheel, mousewheel (в обоих, 2-мерном и 1-мерном вариантах)
// и DOMMouseScroll в Firefox.Масштабировать значение так, чтобы один «щелчок»
// колесика соответствовал 30 пикселам. Если какой-либо из броузеров в будущем
// будет возбуждать оба типа событий, "wheel" и "mousewheel", одно и то же
// событие будет обрабатываться дважды. Но будем надеяться, что отмена
// события wheel будет предотвращать возбуждение события mousewheel.
var deltaX = e.deltaX*-30 || // событие wheel
e.wheelDeltaX/4 || //mousewheel
0; // свойство не определено
var deltaY = e.deltaY*-30 || // событие wheel
e.wheelDeltaY/4 || // событие mousewheel в Webkit
(e.wheelDeltaY===undefined && // Если нет 2-мерного свойства,
e.wheelDelta/4) || // использовать 1-мерное свойство
e.detail*-10 || // событие DOMMouseScroll в Firefox
0; // свойство не определено
// Большинство броузеров генерируют одно событие со значением 120
// на один щелчок колесика. Однако похоже, что мыши компании Apple
// более чувствительные, и значения свойств delta часто оказываются
// в несколько раз больше 120, по крайней мере, для Apple Mouse.
//
Использовать прием проверки типа броузера, чтобы решить эту проблему,
if (isMacWebkit) {
deltaX /= ЗО;
deltaY /= 30;
}
// Если мы когда-нибудь будем получать событие mousewheel или wheel в (будущих
// версиях) Firefox, можно отказаться от обработки события DOMMouseScroll.
if (isFirefox && e.type !== '‘DOMMouseScroll")
frame.removeEventListener("DOMMouseScroll", wheelHandler, false);
// Получить текущие размеры элемента содержимого
var contentbox = content.getBoundingClientRectO;
var contentwidth = contentbox.right - contentbox.left;
var contentheight = contentbox.bottom - contentbox.top;
// Если удерживается нажатой клавиша Alt, изменить размеры фрейма
if (e.altKey) {
if (deltaX) {
framewidth -= deltaX; // Новая ширина фрейма, но не больше,
framewidth = Math.min(framwidth, contentwidth); // чем ширина
framewidth = Math.max(framewidth,50); // содержимого
frame.style.width = framewidth + "px"; // и не меньше 50
}
if (deltaY) {
frameheight -= deltaY; // To же для высоты фрейма
frameheight = Math.min(frameheight, contentheight);
frameheight = Math.max(frameheight-deltaY, 50);
frame.style.height = frameheight + "px";
}
}
else { // Клавиша Alt не нажата, прокрутить содержимое в фрейме
if (deltaX) {
// Прокручивать не больше, чем
var minoffset = Math.min(framewidth-contentwidth, 0);
// Сумма deltaX и contentX, но не меньше, чем minoffset
Поделиться с друзьями: