русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Преобразование координат указателя мыши


Дата добавления: 2015-07-09; просмотров: 885; Нарушение авторских прав


 

Когда возникает событие мыши, свойства clientX и clientY объекта события хра_ нят координаты указателя мыши. Эти координаты являются координатами в ок_ не, т. е. измеряются относительно верхнего левого угла клиентской области окна броузера и не учитывают прокрутку документа. Зачастую возникает необходи_ мость преобразовать эти значения в координаты документа, например, чтобы ото_ бразить всплывающую подсказку рядом с указателем мыши, а для определения координат всплывающего окна необходимо иметь координаты указателя в доку_ менте. Пример 17.3 продолжает пример 16.4. В примере 16.4 просто выводилось окно с всплывающей подсказкой в заданных координатах документа. Данный пример расширяет возможности прошлого примера за счет добавления метода Tooltip.schedule(), который отображает всплывающую подсказку с учетом коор_ динат, полученных от объекта события мыши. Поскольку событие мыши по_ ставляет оконные координаты, метод schedule() преобразует их в координаты до_ кумента с помощью методов модуля Geometry, приводившегося в примере 14.2.

 

Пример 17.3. Позиционирование всплывающих подсказок по событиям мыши

// Следующие значения используются методом schedule(), определенным далее.

// Они используются как константы, но доступны для записи, поэтому вы можете

// переопределить эти значения, предлагаемые по умолчанию.

Tooltip.X_OFFSET = 25; // пикселов вправо от указателя мыши

Tooltip.Y_OFFSET = 15; // пикселов вниз от указателя мыши

Tooltip.DELAY = 500; // миллисекунд после события mouseover

 

/**

* Данный метод планирует появление всплывающей подсказки над указанным

* элементом через Tooltip.DELAY миллисекунд от момента события.

* Аргумент “e” должен быть объектом события mouseover. Данный метод извлекает

* координаты мыши из объекта события, преобразует их из оконных координат



* в координаты документа и добавляет вышеуказанные смещения.


 

436 Глава 17. События и обработка событий

* Определяет текст подсказки, обращаясь к атрибуту "tooltip" заданного

* элемента. Данный метод автоматически регистрирует обработчик события

* onmouseout и отменяет его регистрацию. Этот обработчик выполняет скрытие

* подсказки или отменяет ее запланированное появление.

*/

Tooltip.prototype.schedule = function(target, e) {

 

// Получить текст для отображения. Если текст отсутствует _ ничего не делать. var text = target.getAttribute("tooltip");

 

if (!text) return;

 

// Объект события хранит оконные координаты указателя мыши.

 

// Поэтому они преобразуются в координаты документа с помощью модуля Geometry. var x = e.clientX + Geometry.getHorizontalScroll();

 

var y = e.clientY + Geometry.getVerticalScroll();

 

// Добавить смещения, чтобы подсказка появилась правее и ниже указателя мыши. x += Tooltip.X_OFFSET;

 

y += Tooltip.Y_OFFSET;

 

// Запланировать появление подсказки.

var self = this; // Это необходимо для вложенных функций

 

var timer = window.setTimeout(function() { self.show(text, x, y); }, Tooltip.DELAY);

 

// Зарегистрировать обработчик onmouseout, чтобы скрыть подсказку

// или отменить появление запланированной подсказки.

 

if (target.addEventListener) target.addEventListener("mouseout", mouseout, false);

 

else if (target.attachEvent) target.attachEvent("onmouseout", mouseout); else target.onmouseout = mouseout;

 

// Реализация слушателя события приводится далее function mouseout() {

 

self.hide(); // Скрыть подсказку, если она уже на экране, window.clearTimeout(timer); // отменить все запланированные подсказки // и удалить себя, т.к. обработчик запускается единожды

 

if (target.removeEventListener) target.removeEventListener("mouseout", mouseout, false);

 

else if (target.detachEvent) target.detachEvent("onmouseout",mouseout);

else target.onmouseout = null;

}

}

 

// Определить единственный глобальный объект Tooltip для общего пользования Tooltip.tooltip = new Tooltip();

 

/*

* Следующая статическая версия метода schedule() использует

* глобальный объект tooltip

* Используется метод следующим образом:

 

*

* <a href="www.davidflanagan.com" tooltip="good Java/JavaScript blog"

* onmouseover="Tooltip.schedule(this, event)">David Flanagan's blog</a>

*/


Tooltip.schedule = function(target, e) {Tooltip.tooltip.schedule(target, e); }


 

17.4. События мыши
   

 

Пример: перетаскивание элементов документа

 

Итак, мы обсудили вопросы распространения событий, регистрации обработчи_ ков и различных интерфейсов объектов событий для моделей DOM Level 2 и IE, и можем, наконец, на практическом примере показать, как это все работает. В примере 19.4 представлена JavaScript_функция drag(), которая, будучи вызва_ на из обработчика события mousedown, позволяет пользователю перетащить эле_ мент документа. Функция drag() может работать как в модели DOM, так и в мо_ дели IE.

 

Функция drag() принимает два аргумента. Первый – перетаскиваемый элемент. Это может быть элемент, в котором произошло событие mousedown, или содержа_ щий его элемент (например, можно разрешить пользователю, перетаскивая за_ головок окна, переместить все окно). Однако в обоих случаях он должен ссы_ латься на элемент документа, абсолютно позиционируемый с помощью CSS_ат_ рибута position. Второй аргумент – это объект события, связанный с вызывае_ мым событием mousedown.

Функция drag() записывает позицию, в которой произошло событие mousedown,

 

и затем регистрирует обработчики для событий mousemove и mouseup, следующих за событием mousedown. Обработчик события mousemove отвечает за перемещение элемента документа, а обработчик события mouseup – за отмену регистрации себя

 

и обработчика mousemove. Важно отметить, что обработчики mousemove и mouseup за_ регистрированы как перехватывающие, т. к. пользователь может двигать мышь быстрее, чем элемент документа будет успевать за ней следовать, и некоторые из этих событий могут происходить вне исходного элемента документа. Кроме то_ го, обратите внимание, что функции moveHandler() и upHandler(), регистрируемые для обработки этих событий, определены как вложенные внутри функции drag()

 

и поэтому могут использовать ее аргументы и локальные переменные, что зна_ чительно упрощает их реализацию.

 

Пример 17.4. Перетаскивание элементов документа

/**

* Drag.js: перетаскивание абсолютно позиционируемых HTML_элементов.

 

*

* Данный модуль определяет единственную функцию drag(),

* которая предназначена для вызова из обработчика события onmousedown.

* Последующие события mousemove будут вызывать перемещение заданного элемента.

* Событие mouseup завершит операцию перетаскивания.

* Если элемент перемещается за пределы экрана, окно прокручиваться не будет.

* Данная реализация работает в обеих моделях: DOM уровня 2 и IE.

*

* Аргументы:

 

*

* elementToDrag: элемент, получивший событие mousedown или содержащий

* его контейнерный элемент. Он должен позиционироваться в абсолютных

* координатах. Значения его свойств style.left и style.top будут

* изменяться по мере перетаскивания элемента пользователем.

*

 

* event: объект Event события mousedown. **/

function drag(elementToDrag, event) {


 

438 Глава 17. События и обработка событий

// Координаты мыши (в оконных координатах)

 

// в точке, откуда начинается перемещение элемента var startX = event.clientX, startY = event.clientY;

// Начальная позиция (в координатах документа) перетаскиваемого элемента.

// Поскольку elementToDrag позиционируется в абсолютных

// координатах, предполагается, что его свойство offsetParent

// ссылается на элемент body документа.

var origX = elementToDrag.offsetLeft, origY = elementToDrag.offsetTop;

// Несмотря на то, что координаты исчисляются в различных системах

// координат, мы можем вычислить разницу между ними и использовать

// ее в функции moveHandler(). Этот прием будет работать,

// потому что при перетаскивании документ не прокручивается.

var deltaX = startX _ origX, deltaY = startY _ origY;

// Зарегистрировать обработчики событий mousemove и mouseup,

// которые последуют вслед за событием mousedown.

 

if (document.addEventListener) { // Модель событий DOM уровня 2 // Зарегистрировать перехватывающие обработчики событий document.addEventListener("mousemove", moveHandler, true); document.addEventListener("mouseup", upHandler, true);

}

else if (document.attachEvent) { // Модель событий IE 5+

// В модели обработки событий IE перехват событий производится

 

// вызовом метода setCapture() элемента, выполняющего перехват. elementToDrag.setCapture(); elementToDrag.attachEvent("onmousemove", moveHandler); elementToDrag.attachEvent("onmouseup", upHandler);

 

// Интерпретировать событие потери перехвата как событие mouseup. elementToDrag.attachEvent("onlosecapture", upHandler);

}

else { // Модель событий IE 4

// В IE 4 мы не можем использовать attachEvent() или setCapture(),

// поэтому вставляем обработчики событий непосредственно в объект документа

// и уповаем на то, что требуемые события мыши всплывут

 

var oldmovehandler = document.onmousemove; // Используется в upHandler() var olduphandler = document.onmouseup;

 

document.onmousemove = moveHandler; document.onmouseup = upHandler;

}

 

// Событие обработано, необходимо прервать его дальнейшее распространение. if (event.stopPropagation) event.stopPropagation( ); // DOM уровня 2

else event.cancelBubble = true; // IE

// Теперь необходимо предотвратить выполнение действия по умолчанию.

 

if (event.preventDefault) event.preventDefault( ); // DOM уровня 2 else event.returnValue = false; // IE

 

/**

* Следующий обработчик перехватывает события mousemove в процессе

 

* перетаскивания элемента. Он отвечает за перемещение элемента. **/

function moveHandler(e) {

if (!e) e = window.event; // Модель событий IE


 

17.4. События мыши
   

 

// Переместить элемент в текущие координаты указателя мыши, при необходимости

 

// подстроить его позицию на смещение начального щелчка. elementToDrag.style.left = (e.clientX _ deltaX) + "px"; elementToDrag.style.top = (e.clientY _ deltaY) + "px";

 

// И прервать дальнейшее распространение события.

 

if (e.stopPropagation) e.stopPropagation( ); // DOM уровня 2 else e.cancelBubble = true; // IE

}

/**

* Этот обработчик перехватывает заключительное событие mouseup,

* которое возникает в конце операции перетаскивания.

**/

function upHandler(e) {

if (!e) e = window.event; // Модель событий IE

 

// Отменить регистрацию перехватывающих обработчиков событий. if (document.removeEventListener) { // Модель событий DOM

 

document.removeEventListener("mouseup", upHandler, true); document.removeEventListener("mousemove", moveHandler, true);

}

 

else if (document.detachEvent) { // Модель событий IE 5+ elementToDrag.detachEvent("onlosecapture", upHandler); elementToDrag.detachEvent("onmouseup", upHandler); elementToDrag.detachEvent("onmousemove", moveHandler); elementToDrag.releaseCapture();

 

}

else { // Модель событий IE 4

 

// Восстановить первоначальные обработчики, если они были document.onmouseup = olduphandler;

document.onmousemove = oldmovehandler;

}

// И прервать дальнейшее распространение события.

 

if (e.stopPropagation) e.stopPropagation( ); // DOM уровня 2 else e.cancelBubble = true; // IE

}

}

 

Следующий фрагмент демонстрирует, как можно использовать функцию drag() в HTML_документе (это упрощенная версия примера 16.3, куда была добавлена возможность перетаскивания элементов).

 

<script src="Drag.js"></script> <!__ Подключить сценарий Drag.js __> <!__ Определить перетаскиваемый элемент __>

 

<div style="position:absolute; left:100px; top:100px; width:250px; background_color: white; border: solid black;">

 

<!__ Добавить "рукоятку", за которую перетаскивается этот элемент. __> <!__ Обратите внимание на атрибут onmousedown. __>

 

<div style="background_color: gray; border_bottom: dotted black; padding: 3px; font_family: sans_serif; font_weight: bold;"

 

onmousedown="drag(this.parentNode, event);"> Перетащи меня <!__ Содержимое "заголовка" __> </div>

<!__ Содержимое перетаскиваемого элемента __>


 

440 Глава 17. События и обработка событий

<p>Это тест. Тестирование, тестирование и еще раз тестирование.

<p>Это тест.<p>Тест.

</div>

 

Ключевым здесь является атрибут onmousedown во вложенном элементе <div>. Не_ смотря на то что функция drag() использует модели обработки событий DOM и IE, регистрация ее для удобства производится с применением модели Level 0.

 

Вот другой простой пример использования функции drag(). В нем определяется изображение, которое можно перетащить, если при этом будет удерживаться клавиша Shift:

 

<script src="Drag.js"></script>

<img src="draggable.gif" width="20" height="20"

style="position:absolute; left:0px; top:0px;"

onmousedown="if (event.shiftKey) drag(this, event);">

 



<== предыдущая лекция | следующая лекция ==>
Обработчики событий и утечки памяти | Типы событий клавиатуры


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.712 сек.