JavaScript. Подробное руководство, 6-е издание
Шрифт:
Важно отметить, что обработчики событий «mousemove» и «mouseup» регистрируются как перехватывающие обработчики. Это обусловлено тем, что пользователь может перемещать мышь быстрее, чем сможет перемещаться элемент документа, в результате чего некоторые события «mousemove» могут возникать за пределами буксируемого элемента. В фазе всплытия эти события просто не будут передаваться нужным обработчикам. В отличие от стандартной модели модель событий, реализованная в IE, не поддерживает фазу перехвата, но она поддерживает специализированный метод
setCapture,
позволяющий перехватывать события мыши в подобных случаях. Пример наглядно демонстрирует, как действует этот метод. Наконец, обратите внимание, что функции
moveHandler
и upHandler
определены внутри функции drag.
Благодаря тому, что они определены во вложенной области видимости, эти функции могут пользоваться аргументами и локальными переменными функции drag,
что существенно упрощает их реализацию. Пример 17.2. Буксировка элементов документа
/**
* Drag.js: буксировка абсолютно позиционированных HTML-элементов.
*
* Этот модуль определяет единственную функцию drag, которая должна вызываться
* из обработчика события onmousedown. Последующие события mousemove будут вызывать
* перемещение указанного элемента. Событие mouseup будет завершать буксировку.
* Эта реализация действует в обеих моделях событий, стандартной и IE.
* Использует функцию getScrollOffsets, представленную выше в книге.
*
* Аргументы:
*
* elementToDrag: элемент, принявший событие mousedown или содержащий его элемент.
* Этот элемент должен иметь абсолютное позиционирование. Значения его свойств style.left
* и style.top будут изменяться при перемещении указателя мыши пользователем.
*
* event: объект Event, полученный обработчиком события mousedown.
**/
function drag(elementToDrag, event) {
// Преобразовать начальные координаты указателя мыши в координаты документа
var scroll = getScrollOffsets: // Вспомогательная функция, объявленная
// где-то в другом месте
var startX = event.clientX + scroll.x;
var startY = event.clientY + scroll.y;
// Первоначальные координаты (относительно начала документа) элемента, который
// будет перемещаться. Так как elementToDrag имеет абсолютное позиционирование,
// предполагается, что его свойство offsetParent ссылается на тело документа,
var origX = elementToDrag.offsetLeft;
var origY = elementToDrag.offsetTop;
// Найти расстояние между точкой события mousedown и верхним левым углом элемента.
// Это расстояние будет учитываться при перемещении указателя мыши,
var deltaX = startX - origX;
var deltaY = startY - origY;
// Зарегистрировать обработчики событий mousemove и mouseup,
// которые последуют за событием mousedown,
if (document.addEventListener) { // Стандартная модель событий
// Зарегистрировать перехватывающие обработчики в документе
document.addEventListener( "mousemove", moveHandler, true);
document.addEventListener("mouseup”, upHandler, true);
}
else
if (document.attachEvent) { // Модель событий IE для IE5-8
// В модели событий IE перехват событий осуществляется вызовом
// метода setCapture элемента.
elementToDrag.setCaptuге;
elementToDrag.attachEvent("onmousemove”, moveHandleг);
elementToDrag.attachEvent("onmouseup", upHandler);
// Интерпретировать потерю пер’ехвата событий мыши как событие
mouseup elementToDrag.attachEvent("onlosecapture", upHandler);
}
Поделиться:
Популярные книги
Диверсант
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Старый, но крепкий 5
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Чужак из ниоткуда
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сирийский рубеж 2
6. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Изгой Проклятого Клана
1. Изгой
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Двойник Короля
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Цикл "Отмороженный". Компиляция. Книги 1-14
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Газлайтер. Том 20
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Запасная дочь
Фантастика:
фэнтези
6.40
рейтинг книги
Газлайтер. Том 10
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Азеф
Проза:
историческая проза
6.00
рейтинг книги
Поход
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
За Горизонтом
8. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00