Свойство which/button

В старых IE8- не поддерживалось свойство which, а вместо него использовалось свойство button, которое является 3-х битным числом, в котором каждому биту соответствует кнопка мыши. Бит установлен в 1, только если соответствующая кнопка нажата.

Чтобы его расшифровать – нужна побитовая операция & («битовое И»):

·!!(button& 1) == true (1-й бит установлен), если нажата левая кнопка,

·!!(button& 2) == true (2-й бит установлен), если нажата правая кнопка,

·!!(button& 4) == true (3-й бит установлен), если нажата средняя кнопка.

Что интересно, при этом мы можем узнать, были ли две кнопки нажаты одновременно, в то время как стандартный which такой возможности не даёт. Так что, в некотором смысле, свойство button – более мощное.

Можно легко сделать функцию, которая будет ставить свойство which из button, если его нет:

functionfixWhich(e){

if(!e.which&&e.button){// если which нет, ноесть button... (IE8-)

if(e.button&1)e.which=1;// леваякнопка

elseif(e.button&4)e.which=2;// средняякнопка

elseif(e.button&2)e.which=3;// праваякнопка

}

}

Свойства pageX/pageY

В IE до версии 9 не поддерживаются свойства pageX/pageY, но их можно получить, прибавив к clientX/clientY величину прокрутки страницы.

Более подробно о её вычислении вы можете прочитать в разделе прокрутка страницы.

Мы же здесь приведем готовый вариант, который позволяет нам получить pageX/pageY для старых и совсем старых IE:

functionfixPageXY(e){

if(e.pageX==null&&e.clientX!=null){// если нет pageX..

var html =document.documentElement;

var body =document.body;

 

e.pageX=e.clientX+(html.scrollLeft|| body &&body.scrollLeft||0);

e.pageX-=html.clientLeft||0;

 

e.pageY=e.clientY+(html.scrollTop|| body &&body.scrollTop||0);

e.pageY-=html.clientTop||0;

}

}

Итого

События мыши имеют следующие свойства:

· Кнопка мыши: which (для IE8-: нужно ставить из button)

· Элемент, вызвавший событие: target

· Координаты, относительно окна: clientX/clientY

· Координаты, относительно документа: pageX/pageY (для IE8-: нужно ставить по clientX/Y и прокрутке)

· Если зажата спец. клавиша, то стоит соответствующее свойство: altKey, ctrlKey, shiftKey или metaKey (Mac).

· Для поддержки Ctrl+click не забываем проверить if (e.metaKey || e.ctrlKey), чтобы пользователи Mac тоже были довольны.

Задачи

Список с выделением

важность: 5

Эта задача состоит из трёх частей.

1. Сделайте список, элементы которого можно выделять кликом.

2. Добавьте мульти-выделение. Если клик с нажатым Ctrl (Cmd под Mac), то элемент добавляется-удаляется из выделенных.

3. Добавьте выделение промежутков. Если происходит клик с нажатым Shift, то к выделению добавляется промежуток элементов от предыдущего кликнутого до этого. При этом не важно, какое именно действие делал предыдущий клик. Это похоже на то, как работает файловый менеджер в ряде ОС, но чуть проще, так как конкретная реализация выделений различается у разных ОС, и её точное воспроизведение не входит в эту задачу.

Демо:

P.S. В этой задаче можно считать, что в элементах списка может быть только текст, без вложенных тегов.
P.P.S. Обработка одновременного нажатия Ctrl(Cmd) и Shift может быть любой.

Открыть песочницу для задачи.

решение

Дерево: проверка клика на заголовке

важность: 3

Есть кликабельноеJavaScript-дерево UL/LI (см. задачу Раскрывающееся дерево).

<ul>

<li>Млекопитающие

<ul>

<li>Коровы</li>

<li>Ослы</li>

<li>Собаки</li>

<li>Тигры</li>

</ul>

</li>

</ul>

 

Nput Events

onblur - When a user leaves an input field
onchange - When a user changes the content of an input field
onchange - When a user selects a dropdown value
onfocus - When an input field gets focus
onselect - When input text is selected
onsubmit - When a user clicks the submit button
onreset - When a user clicks the reset button
onkeydown - When a user is pressing/holding down a key
onkeypress - When a user is pressing/holding down a key
onkeyup - When the user releases a key
onkeyup - When the user releases a key
onkeydownvsonkeyup - Both

Mouse Events

onmouseover/onmouseout - When the mouse passes over an element
onmousedown/onmouseup - When pressing/releasing a mouse button
onmousedown - When mouse is clicked: Alert which element
onmousedown - When mouse is clicked: Alert which button
onmousemove/onmouseout - When moving the mouse pointer over/out of an image
onmouseover/onmouseout - When moving the mouse over/out of an image
onmouseover an image map

Click Events

Acting to the onclick event
onclick - When button is clicked
ondblclick - When a text is double-clicked

LoadEvents

onload - When the page has been loaded
onload - When an image has been loaded
onerror - When an error occurs when loading an image
onunload - When the browser closes the document
onresize - When the browser window is resized


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: