Чаще всего нужно узнать, на каком элементе сработало событие.
Например, мы поймали на внешнем div'е и хотим знать, на каком из внутренних элементов оно на самом деле произошло.
В Internet Explorer у объекта window.event для этого есть свойство srcElement, в остальных браузерах, работающих по рекомендациям W3C, для этого используется event.target.
Вот пример использования этого свойства. Обработчик стоит только на внешнем диве, но благодаря event.target выводит по клику класс исходного элемента.
Javascript-обработчик в примере висит только на внешнем диве d1 и выглядит примерно так:
function(event) {
// получить объект событие.
// вместо event лучше писать window.event
event = event || window.event
// кросс-браузерно получить target
var t = event.target || event.srcElement
alert(t.className)
}
При всплытии - событие по очереди вызвает обработчики на элементе-триггере и дальше, вверх по документу.
По мере всплытия, текущим элементом каждый раз становится новый. Иначе говоря. текущий элемент - это тот, к которому в данный момент "доплыло" событие.
Стандартный способ получить текущий элемент - использовать переменную this.
Например, при клике на внутренний div, код в этом примере последовательно отмечает элементы, на которых регистрируется всплывающее событие:
После получения события обычно интересно узнать, какая кнопка была нажата. Если, конечно, это не событие contextmenu, с которым все и так понятно
Для этого в объекте event есть два свойства: event.which и event.button, которые содержат числовые значения, соответствующие нажатой кнопке. К сожалению, тут есть некоторые несовместимости.
Internet Explorer
Firefox, Safari Win и Opera
Konqueror
ЛЕВАЯ КНОПКА
event.which
undefined
1
1
event.button
1
0
1
СРЕДНЯЯ КНОПКА
event.which
undefined
2
2
event.button
4
1
4
ПРАВАЯ КНОПКА
event.which
undefined
3
3
event.button
2
2
2
Свойство event.which было изначально изобретено Netscape, а event.button использовалось в Internet Explorer.
Через некоторое время браузеры стали использовать оба и все перепуталось.
Подход создателей браузера Internet Explorer, вообще говоря, более универсальный, так как button является 3-битовым числом, каждый бит которого отвечает за кнопку мыши.
Так, button & 1 (первый бит) установлен в 1, если нажата левая кнопка, button & 2 (второй бит) установлен в 1, если нажата правая кнопка, и button & 4 (третий бит) - если нажата средняя.
В результате мы не можем отловить, когда, например, нажаты левая и правая кнопки, а когда только левая или только правая. К сожалению, это можно сделать только в IE.
Вот универсальный тестовый стенд по определению клавиш. Выбирайте любую мышь и жмите кнопу из любого браузера - ниже появятся названия событий и значения which/button.
Координаты курсора мыши относительно окна находятся в стандартных свойствах clientX/clientY. Они одинаково поддерживается всеми браузерами.
Если у вас есть окно 500x500, и мышь находится в центре, то clientX и clientY будут оба равны 250. Если вы затем проскроллируете документ вниз, налево или вверх, не двигая курсор - значения clientX/clientY не изменятся, так как отсчитываются относительно окна, а не документа.
Как правило, при обработке события нужна позиция мыши относительно документа, учитывающая прокрутку. Стандарт W3C предоставляет для этого свойство pageX/pageY.
Если у вас есть окно 500x500, и мышь находится в центре, то pageX и pageY будут оба равны 250. Если вы затем проскроллируете на 250 пикселей вниз, pageY станет равным 750.
Таким образом pageX/pageY содержат координаты, на каком месте документа произошло событие, учитывая все прокрутки.
Свойства pageX/pageY поддерживаются всеми браузерами, кроме Internet Explorer.
В IE их можно получить из clientX/clientY, прибавив к ним scrollLeft/scrollTop.
Обычно оно находится в <body>: document.body.scrollLeft, но это не всегда так. Например, при выборе Strict DTD оно высчитывается для <html>: document.documentElement.scrollLeft. Кроме того, тэга <body> может просто не быть в документе.
Поэтому мы сначала возьмем html.scrollLeft (если есть), затем проверим body.scrollLeft. Если нет ни того, ни того, то 0.
var html = document.documentElement
var body = document.body
e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0)
Кроме того, document в IE может быть немного сдвинут с позиции 0,0. Значение сдвига находится в document.documentElement.clientLeft/clientTop, и его также необходимо учесть.
Этот код позволяет надежно получить pageX/pageY для IE, в котором его изначально нет:
if (e.pageX == null && e.clientX != null ) {
var html = document.documentElement
var body = document.body
e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
e.pageY = e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0)
}
Было бы полезно добавить полный код последнего примера (демо), всмысле хтмл для полей в которых выводятся координаты, не совсем понял как они в реальном времени работают.
Мне кажется, с отслеживанием координат мышки автор слегка лукавит. Не спроста вызов MouseShowHandler остался за кадром. Там встречаются неизвестные всякие JQuery и AJAX. Очевидно, так просто из скрипта MouseMove не перехватить
div класс="headwindow" онКлик="mouseShowHandler()" /div
в этой строчке mouseShowHandler() введен без параметра, а в демо который ты взял сверху этот параметр есть, обрати внимание на определение function mouseShowHandler(e)
во первых, что ты предлагаешь туда передать, а во вторых в функции обрабатывается передаваемое событие, и если оно не определено то определяется. здесь причина в кросбраузерности, т.к. в IE и Opera все работает норм, а в firefox - нет
хочу уточнить что в IE window.event является readonly объектом и по этому чтобы код работал корректно нужно клонировать window.event с помощью встроенной IE функции var e=document.createEventObject(window.event)
Если у вас есть окно 500x500, и мышь находится в центре, то pageX и pageY будут оба равны 250. Если вы затем проскроллируете на 250 пикселей вниз, pageY станет равным 750.
А есть ли возможность передать событие родительскому элементу?
Например, есть обработчик события для параграфа в диве (на моуздаун). И дивов таких два. Могу ли я из этого обработчика узнать в каком диве параграф, на который щелкнули?
relatedTarget в FF работает, toElement – нет.
Только нету у лисы event'а в глобальном пространстве имен. event передается первым аргументом функции-слушателю события.
document.getElementById('mBox').addEventListener('mouseover', function (event){
var objTo = (event||window.event).relatedTarget
alert(objTo);
}, false);
Или, если задавать в коде страницы (Хоть это и не очень хорошо)
...<td onmouseover="eventListener(event)">...
function eventListener(event){
var objTo = (event||window.event).relatedTarget
alert(objTo);
}
P.S. Не уверен, насчет поддержки ослом event'а через инлайновое задание ф-ии. Если будут проблемы, попробуйте приписать var event; перед вызовом ф-ии.
А может кто подскажет как скрипту определить что окно прокручено? Или хоть в какую сторону копать нужно?
Задача стоит такая:
Есть шапка с определённым размером и есть блок под шапокой, вот при вертикальной прокрутке нужно что бы блок сначала ехал за шапкой, а потом уже висел под верхом окна броузера. Я где то видел такое реализованное но ессно вспомнить нимагу(((
Здравствуйте у меня следующая проблемка.
Нужно организовать поиск по массиву так, как реализован поиск в яндексе.
Т.е есть некий массив $mas (этот массив формируется в php-коде);
На html-форме есть текстовое поле ввода
При начале ввода текста c клавиатуры в это поле, т.е. при срабатывании события onkeyup (насколько я понимаю), под текстовым полем ввода должна появляться текстовая область ввода
В которую должны выводиться элементы из массива $mas, начинающиеся с символов, введённых в текстовом поле Pole, причем элементы массива выводятся с новой строки.
Пользователь должен иметь возможность выбрать из предложенных элементов тот, что ему нужен. И по клику мышкой выбранный элемент должен появиться в поле Pole, а текстовая область TextOblast исчезнуть, т.е. стать невидимой.
PS это вообще реально сделать с помощью JavaScript?
document.getElementById('mouseX').value = e.pageX
document.getElementById('mouseY').value = e.pageY
}
на страницу. И странное дело: в ФФ и пр. код работает, а в ИЕ ругается на if (e.pageX == null && e.clientX != null ). Хотя на странице этого сайта этот код работает нормально. Естественно этот код поместил в функцию, а функцию присвоил собитию onckick элемента.
Чё может быть ?
Подскажите как лучше всего реализовать следующую штуку:
на документе только одна большая таблица, нужно реализовать "выделение" ячеек:
нажимаем кнопку мыши на первой, тащим вниз, отпускаем. При этом "выделенные" области как-нибудь выделяются (например фон у них становится темнее). Тут еще появляется одна проблема - стандартное выделение, которое делает браузер - возможо ли его как нибудь убрать или скрыть?
Сводится к геометрической задаче на определение того, перекрывает ли некий прямоугольник массив других прямоугольников. "Некий" прямоугольник определяется точкой, где произошло событие маусдаун, и точкой, где произошло событие маусап.
Подскажите пожалуйста,как узнать в какую сторону был прокручен документ,
т.е. какое событие сработало: scrollTop или scrollLeft и можно ли узнать на сколько пикселей был прокручен документ?
Подскажите в чем ошибка данного кода для FF (срабатывает через раз), для IE все нормально.
// определен обработчик для всего документа
document.onmouseover = setupEffect;
document.onmouseout = cleanupEffect;
// функции обработки, кроссплатформенные
function setupEffect(event) {
var event = event || window.event;
var relTag = event.relatedTarget || event.toElement;
selmenu(relTag) }
function cleanupEffect(event) {
var event = event || window.event;
var relTag = event.relatedTarget || event.fromElement;
selmenu(relTag)}
// базовый обработчик
function selmenu(src) {
while ("HTML" != src.tagName) {
< текст обработчики >
}
И вот тут то как раз в FF пишет что src не определен. Хотя если поводить мышью по странице иногда сюда поступает событие. Самое интересное если отключить одну из двух исходных функциф (cleanupEffect или setupEffect) то в selmenu всегда передается src без ошибок.
В чем тут глюк в FF?
p.s. вообще FF странно работает в отличие от IE (даже старых версий)
Ещё чего-то в памяти всплывает, что в FF event как особенно передаётся, типа:
document.onmouseover = setupEffect(event); // или setupEffect(), а event автоматом передаётся по значению в переменную "e", по экспериментируйте
document.onmouseout = cleanupEffect(event); // или cleanupEffect()
Была проблема с фоксом. В функции аналогичной mouseShowHandler() он упорно твердил что e=undefined. По моему автор не указал что 'e' объект временный !
И считать координаты надо не отходя от кассы.
var mCur;
window.onmousemove=function(e)
{
mCur = mousePageXY(e);
}
function mousePageXY(e)
{
var x = 0, y = 0;
if (!e) e = window.event;
if (e.pageX || e.pageY)
{
x = e.pageX;
y = e.pageY;
}
else if (e.clientX || e.clientY)
{
x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
}
return {"x":x, "y":y};
}
таким образом текущие координаты будут доступны из любого места кода в любое время, как свойсва объекта mCur: mCur.x , mCur.y
Вот рабочий вариант данного сценария: function mousePageXY(e)
{
var x = 0;
var y = 0;
if (!e) e = window.event;
if (e.pageX || e.pageY)
{
x = e.pageX;
y = e.pageY;
}
else if (e.clientX || e.clientY)
{
x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
}
return {"x":x, "y":y};
}
Как отследить событие изменения текстового поля при автоматическом заполнении из выпадающего списка ранее вводимых значений сохраненных браузером (FF3)?
onkeyup - при ручном вводе
onchange - только после смене фокуса с этого элемента
...
по ходу прочтения статьи навязался вопросик:
есть у меня таблица, в которой есть несколько ячеек.
какой обработчик надо повешать на таблицу, что бы при клике на один из элементов, которые она содержит, я мог получить id этого элемента?
Ребят, сколько ни ковыряю, что-то не могу разобрать. Можно ли самому создать такое событие, которое устанавливает значения ClientX/ClientY (pageX/pageY), а не просто получает их? Подскажите, для примера, функцию, автоматизирующую некоторое перетаскивание:
1. Устанавливаются заданные координаты Х,Y (150, 250)
2. Происходит нажатие левой кнопки мыши
3. Устанавливаются другие координаты (200,300)
4. Происходит отпускание кнопки
Это бы всё расставило на свои места, заранее благодарю.
Тип события можно получить, используя кроссбраузерное свойство type объекта событие.
1 function getEventType(e) {
2 if (!e) e = window.event;
3 alert(e.type);
4 } Данный код в действии (в примере обрабатываются события click и mouseout):
недопонял, как этот код обрабатывает событие, ведь так тоже обработка произойдет: / input value="определение" onmouseout="alert('mouseout');" onclick="alert('click');" type="button" /
Ваш последний пример, как я понял, перехватывает событие mousemove, по этому он становится не совсем наглядным для демонстрации PageX/PageY при скроллинге и недвижимой мышке.
А зачем дополнительно проверять на существование html в
e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);?
Ведь html всегда существует, а в случае отсутствие у него свойства scrollLeft и так будет выдаваться undefined, т.е. значение false?
Тем более, что дальше в этой же строчке вводим проверяем свойство html.clientLeft без проверки на существование html?
Здравствуйте!
Можете объяснить принцип работы переменной this
Как я понимаю это что-то на подобии event. Он будет вноситься в функцию первым аргументом или вторым если в аргументах есть event.
А далее можно будет не прописывать var X=document.getElementById...
а просто this.style.color... например для смены цвета объекта на котором сработал обработчик
function getEventType(e) {
if (!e) e = window.event;
alert(e.type);
}
Автор, пожалуйста, будь так добр пояснить сий "трюк". Что за чёртова буква "e"? Как это вообще работает? Почему в финальном демо при назначение функции обработчиком события она работает? Как? Откуда она берёт параметр e для своей работы, если эта функция нигде не вызывается и никто ей не передаёт параметров?
Если это особенность вызова функции без параметров, тогда как в её описание/определение аргументы всё же указаны, то следовало бы указать эту деталь.
Как я понял. А я ничерта не понял как это работает! Финальное демо обрабатывает событие. Когда функция назначается обработчиком события onmousemove, то она при исполнение получает вместо e - это самое событие onmousemove. Видимо, это особенность работы функций в JS. И как это понимать? Как всё это происходит??????? Где почитать?
У меня вообще сложилось впечатление, что в данной статье использовался кривой подход к объектному программированию. Вроде как об ООП речи не идёт, но в то же время используются принципы ООП.
Простите мне мою горячность, но статья без пояснения вышеописанной детали бред. Я прочитал всю статью. Рылся в интернете. И так за 2 дня не понял весь механизм работы демо в финале статьи!!! Я в ярости.
Читал. Но я там не нашёл нужной для понимания детали. До неё пришлось доходить самому. А в статье упоминается это лишь вскользь. Ключевым оказалось то, что event - не простая переменная/имя. При появление этого "слова" происходит передача объекта события в функцию. Так что не совсем точным оказалось определение о понятие объекта события и о том, как оно ловиться функцией.
Также, всё зависит ещё и от способа назначения обработчика.
P.S. До конца я ещё не понял весь механизм. Поэтому мои слова тут вполне могут быть ошибочными ещё.
"Координаты курсора мыши относительно окна находятся в стандартных свойствах clientX/clientY. Они одинаково поддерживается всеми браузерами."
"Как правило, при обработке события нужна позиция мыши относительно документа, учитывающая прокрутку. Стандарт W3C предоставляет для этого свойство pageX/pageY."
ииии??? и что же такое на самом деле pageX/clientX?? Что ещё за стандартные свойства? Сколько уже скриптов писал, ни разу в жизни не сталкивался с общим однозначным понятием для всех JS под названием "стандартный свойства". Ладно. Не буду негодовать.
Я хочу через alert узнать x координату своей мыши относительно окна. Например, используя СТАНДАРТНОЕ СВОЙСТВО clientX. К жопе чего мне нужно приписать .clientX????? alert(xxx.clientX)
Что должно стоять на месте "xxx", чтобы я в результате срабатывания alert получил искомую свою координату мыши?
Спасибо, что терпеливо прочитали мои возмущения. Пожалуйста. Обойдетесь без бессмысленных ответов. Я перечитал все комментарии к этой статье. Из низ 90% бессмысленны и не отвечают на поставленные вопросы полноценным образом.
Название страницы читали? Я Вам его даже напомню: "Свойства объекта событие". Путем нетрудных умозаключений получаем, что clientX - свойство объекта "событие". В первом же пункте показан пример работы с этим объектом.
и что же такое на самом деле pageX/clientX?
А Вы статью читали?
Координаты курсора мыши относительно окна находятся в стандартных свойствах clientX/clientY
Как правило, при обработке события нужна позиция мыши относительно документа, учитывающая прокрутку. Стандарт W3C предоставляет для этого свойство pageX/pageY.
Спасибо за гениальный ответ. Всегда восхищался людьми, которые отвечают на вопросы не отвечая на вопросы.
P.S. Всё я читал. Не волнуйтесь. Я трудолюбивый и очень дотошный.
Да, не читал, поскольку отвечаю на комментарии в порядке их вывода в блоке "Последние комментарии". И я как-то считаю, что если у человека есть вопросы, то он вполне может уместить их в одном комментарии, и поэтому не счел нужным читать предыдущие.
ID было не названием (сейчас ид (в ксс) материала у меня работает как просто название) а конкретным, уникальным номером задающим, свое, уникальное название-номер для таба.
Если не сложно конечно...
Для этого Вам нужно воспользоватся AJAX запросом, которым Вы передаете на серверную сторону координаты, и уже php на серверной стороне запишет их в нужный файл.
Не могу понять почему в Опере 12 нажатие на среднюю кнопку (колесико) не вызывает срабатывания onmousedown/ что за фича такая? И можно это поправить? Ответьте, уважаемые знатоки Java Script.
Друзья, с clientX и clientY не все так радужно, как описано в статье. Они одинаково поддерживается всеми браузерами.
Это не правда. Если быть точным, это не для всех событий правда.
Например, мне надо было отследить положение курсора во время скроллинга. Мне нужно только свойство clientX. Так вот у события onscroll этого свойства в FF не обнаружилось. И на планшетном (сенсорном) Chrome, хотя на виндузовом Chrome все работает.
Люди, помогите с такой проблемой. Есть графический объект, передвигающийся за курсором мыши. Но мне необходимо знать, куда мышь в данный момент передвигается: влево или вправо, чтобы менять этот графический объект в зависимости стороны передвижения мыши. Перекопал инет. Подобной задачи никто не решал.
в опере правую не отследить
Отследить можно. Просто в опере по-умолчанию запрещён перехват правой кнопки мыши.
Спасибо. спасибо. Я к вам попал с википедии. То, что надо.
Не могу понять, почему window.pageXOffset, или ..Y.. вечно ноль показывает. Вы не знаете?
pageXOffset - не очень поддерживаемое свойство..
При различных разрешениях экрана координаты объектов на странице различные.
Есть ли какое - то решение этого случая?
А почему так сложно? Почему нельзя просто
лол, ну всё, теперь тебе можно идти в web-разработчики без высшего и заработной платой не меньше $5000 в месяц, просто утер нос автору)
А статья действительно хорошая, спасибо.
У автора есть проверка у тебя её нет
Из-за разных браузеров, в мозилле объект события event прочтется только если передан в обработчик в качестве параметра
Было бы полезно добавить полный код последнего примера (демо), всмысле хтмл для полей в которых выводятся координаты, не совсем понял как они в реальном времени работают.
да вроде обработчик повешен на mousemove и он при движении мышки меняет значения в полях на коорд мышки автоматом.
Мне кажется, с отслеживанием координат мышки автор слегка лукавит. Не спроста вызов MouseShowHandler остался за кадром. Там встречаются неизвестные всякие JQuery и AJAX. Очевидно, так просто из скрипта MouseMove не перехватить
Не паникуем, а учим матчасть тщательнее. Все так, как написано.
Ололо нубик. JavaScript выполняется на стороне клиента.
ы) jQuery AJAX и все такое гы гы гы.
Почему в FireFox v3 "демо" для следующего хтмл кода не работает???:
.headwindow {
background-color: #03F;
height: 20px;
width: auto;
}
div класс="headwindow" онКлик="mouseShowHandler()" /div
форма
инпут id="mouseX" type="text"
инпут id="mouseY" type="text"
/форма
Проверял алертом, обработка скрипта слетает после:if (e.pageX == null && e.clientX != null )???подскажите плззз)))
div класс="headwindow" онКлик="mouseShowHandler()" /div
в этой строчке mouseShowHandler() введен без параметра, а в демо который ты взял сверху этот параметр есть, обрати внимание на определение function mouseShowHandler(e)
во первых, что ты предлагаешь туда передать, а во вторых в функции обрабатывается передаваемое событие, и если оно не определено то определяется. здесь причина в кросбраузерности, т.к. в IE и Opera все работает норм, а в firefox - нет
хочу уточнить что в IE window.event является readonly объектом и по этому чтобы код работал корректно нужно клонировать window.event с помощью встроенной IE функции var e=document.createEventObject(window.event)
А в него никто ничего и не пишет.
Если у вас есть окно 500x500, и мышь находится в центре, то pageX и pageY будут оба равны 250. Если вы затем проскроллируете на 250 пикселей вниз, pageY станет равным 750.
250+250 = 750?
pageY = 750 если курсор будет в самом низу окна.
а если по середине т.к. мы скролл крутим, то сдвинеться на 250 px итого 500px
учи математику...
В том то и дело что мы скролим колёсиком а не двигаем мышку автор просто ошибся. 500 там будет pageY
А есть ли возможность передать событие родительскому элементу?
Например, есть обработчик события для параграфа в диве (на моуздаун). И дивов таких два. Могу ли я из этого обработчика узнать в каком диве параграф, на который щелкнули?
В этом обработчике можно взять target (srcElement).parentNode.
Или навесить обработчики на сами дивы а не на параграфы.
Автору респект
Столкнулся с тем, что relatedTarget или toElement не хотят работать в FF. Есть функция, вызываемая по onMouseOut с ячейки
function menu_out_main (){
var objTo = window.event.toElement
alert(objTo);
}
В IE и Opera алерт появляется, в FF же - ноль реакции. Кто-нибудь знает, в чём дело?
relatedTarget в FF работает, toElement – нет.
Только нету у лисы event'а в глобальном пространстве имен. event передается первым аргументом функции-слушателю события.
Или, если задавать в коде страницы (Хоть это и не очень хорошо)
P.S. Не уверен, насчет поддержки ослом event'а через инлайновое задание ф-ии. Если будут проблемы, попробуйте приписать var event; перед вызовом ф-ии.
А может кто подскажет как скрипту определить что окно прокручено? Или хоть в какую сторону копать нужно?
Задача стоит такая:
Есть шапка с определённым размером и есть блок под шапокой, вот при вертикальной прокрутке нужно что бы блок сначала ехал за шапкой, а потом уже висел под верхом окна броузера. Я где то видел такое реализованное но ессно вспомнить нимагу(((
Функция возвращает значение, насколько прокручен документ.
Как я рад, это то что надо!!!
Здравствуйте у меня следующая проблемка.
Нужно организовать поиск по массиву так, как реализован поиск в яндексе.
Т.е есть некий массив $mas (этот массив формируется в php-коде);
На html-форме есть текстовое поле ввода
При начале ввода текста c клавиатуры в это поле, т.е. при срабатывании события onkeyup (насколько я понимаю), под текстовым полем ввода должна появляться текстовая область ввода
В которую должны выводиться элементы из массива $mas, начинающиеся с символов, введённых в текстовом поле Pole, причем элементы массива выводятся с новой строки.
Пользователь должен иметь возможность выбрать из предложенных элементов тот, что ему нужен. И по клику мышкой выбранный элемент должен появиться в поле Pole, а текстовая область TextOblast исчезнуть, т.е. стать невидимой.
PS это вообще реально сделать с помощью JavaScript?
Да
Кошка, открываем Ajax и внимательно читаем (если массив берется с сервера... про то что массив с сервера предполагаю по упоминанию PHP)
Вставил вот этот код
function mouseShowHandler(e){
e = e || window.event
if (e.pageX == null && e.clientX != null ) {
var html = document.documentElement
var body = document.body
e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
e.pageY = e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0)
}
document.getElementById('mouseX').value = e.pageX
document.getElementById('mouseY').value = e.pageY
}
на страницу. И странное дело: в ФФ и пр. код работает, а в ИЕ ругается на if (e.pageX == null && e.clientX != null ). Хотя на странице этого сайта этот код работает нормально. Естественно этот код поместил в функцию, а функцию присвоил собитию onckick элемента.
Чё может быть ?
При вызове функции передавался event? Не уверен, но причина может быть в этом...
Подскажите как лучше всего реализовать следующую штуку:
на документе только одна большая таблица, нужно реализовать "выделение" ячеек:
нажимаем кнопку мыши на первой, тащим вниз, отпускаем. При этом "выделенные" области как-нибудь выделяются (например фон у них становится темнее). Тут еще появляется одна проблема - стандартное выделение, которое делает браузер - возможо ли его как нибудь убрать или скрыть?
Сводится к геометрической задаче на определение того, перекрывает ли некий прямоугольник массив других прямоугольников. "Некий" прямоугольник определяется точкой, где произошло событие маусдаун, и точкой, где произошло событие маусап.
От выделения можно избавиться.
Подскажите пожалуйста,как узнать в какую сторону был прокручен документ,
т.е. какое событие сработало: scrollTop или scrollLeft и можно ли узнать на сколько пикселей был прокручен документ?
См. на 5 постов 1-го уровня выше.
Подскажите в чем ошибка данного кода для FF (срабатывает через раз), для IE все нормально.
// определен обработчик для всего документа
document.onmouseover = setupEffect;
document.onmouseout = cleanupEffect;
// функции обработки, кроссплатформенные
function setupEffect(event) {
var event = event || window.event;
var relTag = event.relatedTarget || event.toElement;
selmenu(relTag) }
function cleanupEffect(event) {
var event = event || window.event;
var relTag = event.relatedTarget || event.fromElement;
selmenu(relTag)}
// базовый обработчик
function selmenu(src) {
while ("HTML" != src.tagName) {
< текст обработчики >
}
И вот тут то как раз в FF пишет что src не определен. Хотя если поводить мышью по странице иногда сюда поступает событие. Самое интересное если отключить одну из двух исходных функциф (cleanupEffect или setupEffect) то в selmenu всегда передается src без ошибок.
В чем тут глюк в FF?
p.s. вообще FF странно работает в отличие от IE (даже старых версий)
Может быть:
document.onmouseover = setupEffect();
document.onmouseout = cleanupEffect();
или вообще:
document.onmouseover = function(){setupEffect()}
document.onmouseout = function(){cleanupEffect()}
Также можно попробовать перехватывать события не из document, а из document.body
Не надо так пробовать
Ещё чего-то в памяти всплывает, что в FF event как особенно передаётся, типа:
document.onmouseover = setupEffect(event); // или setupEffect(), а event автоматом передаётся по значению в переменную "e", по экспериментируйте
document.onmouseout = cleanupEffect(event); // или cleanupEffect()
function cleanupEffect(e) {
...
}
function setupEffect(e) {
...
}
Сделайте так, чтобы можно было копировать код, представленный на ваших страницах, без 01 02 03 04 и так далее.
Там есть кнопка для этого
Была проблема с фоксом. В функции аналогичной mouseShowHandler() он упорно твердил что e=undefined. По моему автор не указал что 'e' объект временный !
И считать координаты надо не отходя от кассы.
таким образом текущие координаты будут доступны из любого места кода в любое время, как свойсва объекта mCur: mCur.x , mCur.y
Вот рабочий вариант данного сценария:
function mousePageXY(e)
{
var x = 0;
var y = 0;
if (!e) e = window.event;
if (e.pageX || e.pageY)
{
x = e.pageX;
y = e.pageY;
}
else if (e.clientX || e.clientY)
{
x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
}
return {"x":x, "y":y};
}
document.onclick = function(e)
{
var MouseCoords = mousePageXY(e);
document.getElementById('CursorX').value = MouseCoords.x;
document.getElementById('CursorY').value = MouseCoords.y;
}
Как отследить событие изменения текстового поля при автоматическом заполнении из выпадающего списка ранее вводимых значений сохраненных браузером (FF3)?
onkeyup - при ручном вводе
onchange - только после смене фокуса с этого элемента
...
по ходу прочтения статьи навязался вопросик:
есть у меня таблица, в которой есть несколько ячеек.
какой обработчик надо повешать на таблицу, что бы при клике на один из элементов, которые она содержит, я мог получить id этого элемента?
Ребят, сколько ни ковыряю, что-то не могу разобрать. Можно ли самому создать такое событие, которое устанавливает значения ClientX/ClientY (pageX/pageY), а не просто получает их? Подскажите, для примера, функцию, автоматизирующую некоторое перетаскивание:
1. Устанавливаются заданные координаты Х,Y (150, 250)
2. Происходит нажатие левой кнопки мыши
3. Устанавливаются другие координаты (200,300)
4. Происходит отпускание кнопки
Это бы всё расставило на свои места, заранее благодарю.
Полезно было бы добавить, что в Safari в event.target может попадаться текстовая нода, поэтому надо делать проверку:
Умно!
А как программно подвинуть курсор мыши?
Второй вопрос как программно нажать кнопки на мыши?
можно какиенибудь не затейливые примерчики .
просто
invoke mouse_event, 7h, xMove, yMove, NULL, NULL
Но не в браузере и не в джаве)
А как в ИЕ получить значение позиции курсора мыши относительно элемента? В FF для этих целей используется свойство event.layerX, а в ИЕ?
Тип события можно получить, используя кроссбраузерное свойство type объекта событие.
1 function getEventType(e) {
2 if (!e) e = window.event;
3 alert(e.type);
4 }
Данный код в действии (в примере обрабатываются события click и mouseout):
недопонял, как этот код обрабатывает событие, ведь так тоже обработка произойдет:
/ input value="определение" onmouseout="alert('mouseout');" onclick="alert('click');" type="button" /
Ваш последний пример, как я понял, перехватывает событие mousemove, по этому он становится не совсем наглядным для демонстрации PageX/PageY при скроллинге и недвижимой мышке.
Автор забыть указать Важный момент, что он использовал метод вызова на jq
Если кому интересно без jq, то делается это следующим образом в body прописывается функция onmousemove.
забыл*
Необходимо уточнение: для Firefox в обязательно прописать
На FireFox 4 на сдешней странице всё нормально, а отдельно код с определением места курсора не идет. Почему и как исправить?
А зачем дополнительно проверять на существование html в
e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);?
Ведь html всегда существует, а в случае отсутствие у него свойства scrollLeft и так будет выдаваться undefined, т.е. значение false?
Тем более, что дальше в этой же строчке вводим проверяем свойство html.clientLeft без проверки на существование html?
Здравствуйте!
Можете объяснить принцип работы переменной this
Как я понимаю это что-то на подобии event. Он будет вноситься в функцию первым аргументом или вторым если в аргументах есть event.
А далее можно будет не прописывать
var X=document.getElementById...
а просто
this.style.color... например для смены цвета объекта на котором сработал обработчик
this это указатель на объект, вызвавший событие, передавать в качестве параметра его не обязательно
function getEventType(e) {
if (!e) e = window.event;
alert(e.type);
}
Автор, пожалуйста, будь так добр пояснить сий "трюк". Что за чёртова буква "e"? Как это вообще работает? Почему в финальном демо при назначение функции обработчиком события она работает? Как? Откуда она берёт параметр e для своей работы, если эта функция нигде не вызывается и никто ей не передаёт параметров?
Если это особенность вызова функции без параметров, тогда как в её описание/определение аргументы всё же указаны, то следовало бы указать эту деталь.
Как я понял. А я ничерта не понял как это работает! Финальное демо обрабатывает событие. Когда функция назначается обработчиком события onmousemove, то она при исполнение получает вместо e - это самое событие onmousemove. Видимо, это особенность работы функций в JS. И как это понимать? Как всё это происходит??????? Где почитать?
У меня вообще сложилось впечатление, что в данной статье использовался кривой подход к объектному программированию. Вроде как об ООП речи не идёт, но в то же время используются принципы ООП.
Простите мне мою горячность, но статья без пояснения вышеописанной детали бред. Я прочитал всю статью. Рылся в интернете. И так за 2 дня не понял весь механизм работы демо в финале статьи!!! Я в ярости.
А Вы введение в события прочитали?
Читал. Но я там не нашёл нужной для понимания детали. До неё пришлось доходить самому. А в статье упоминается это лишь вскользь. Ключевым оказалось то, что event - не простая переменная/имя. При появление этого "слова" происходит передача объекта события в функцию. Так что не совсем точным оказалось определение о понятие объекта события и о том, как оно ловиться функцией.
Также, всё зависит ещё и от способа назначения обработчика.
P.S. До конца я ещё не понял весь механизм. Поэтому мои слова тут вполне могут быть ошибочными ещё.
Вот ещё одна мега промашка.
"Координаты курсора мыши относительно окна находятся в стандартных свойствах clientX/clientY. Они одинаково поддерживается всеми браузерами."
"Как правило, при обработке события нужна позиция мыши относительно документа, учитывающая прокрутку. Стандарт W3C предоставляет для этого свойство pageX/pageY."
ииии??? и что же такое на самом деле pageX/clientX?? Что ещё за стандартные свойства? Сколько уже скриптов писал, ни разу в жизни не сталкивался с общим однозначным понятием для всех JS под названием "стандартный свойства". Ладно. Не буду негодовать.
Я хочу через alert узнать x координату своей мыши относительно окна. Например, используя СТАНДАРТНОЕ СВОЙСТВО clientX. К жопе чего мне нужно приписать .clientX?????
alert(xxx.clientX)
Что должно стоять на месте "xxx", чтобы я в результате срабатывания alert получил искомую свою координату мыши?
Спасибо, что терпеливо прочитали мои возмущения. Пожалуйста. Обойдетесь без бессмысленных ответов. Я перечитал все комментарии к этой статье. Из низ 90% бессмысленны и не отвечают на поставленные вопросы полноценным образом.
Название страницы читали? Я Вам его даже напомню: "Свойства объекта событие". Путем нетрудных умозаключений получаем, что clientX - свойство объекта "событие". В первом же пункте показан пример работы с этим объектом.
А Вы статью читали?
Свойства, описанные стандартом.
Спасибо за гениальный ответ. Всегда восхищался людьми, которые отвечают на вопросы не отвечая на вопросы.
P.S. Всё я читал. Не волнуйтесь. Я трудолюбивый и очень дотошный.
А вот вы, мой комментарий чуть выше, не читали.
Да, не читал, поскольку отвечаю на комментарии в порядке их вывода в блоке "Последние комментарии". И я как-то считаю, что если у человека есть вопросы, то он вполне может уместить их в одном комментарии, и поэтому не счел нужным читать предыдущие.
Доброго времени суток! может вы сможете мне помочь? мне надо чтобы вот в этом тексте
$(function () {
function makeTabs(contId) {
var tabContainers = $('#'+contId+' div.tabs > div');
tabContainers.hide().filter(':ID').show();
$('#'+contId+' div.tabs ul.tabNavigation a').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('#'+contId+' div.tabs ul.tabNavigation a').removeClass('selected');
$(this).addClass('selected');
return false;
}).filter(':ID').click();
}
});
ID было не названием (сейчас ид (в ксс) материала у меня работает как просто название) а конкретным, уникальным номером задающим, свое, уникальное название-номер для таба.
Если не сложно конечно...
лучше б вы показали как отслеживать положение экрана относительно документа
Совсем ничего не получается, устал....
координаты определяются и в ИЕ и в Опере, но только не в FF ((((
помогите, пожалуйста....что я не так делаю?
вот тестовая страница: killarney.ru/event-test2.htm
Для файрфокса тег body должен выглядеть так:
(event) - обязательно
А можно получить координаты относительно какого-нибудь блока?
Уважаемые !! помогите пожалуйста !!
как положить координаты ,клик .и двойной клик мышки в текстовый файл ?
бьюсь пятые сутки ...помогите !!
Для этого Вам нужно воспользоватся AJAX запросом, которым Вы передаете на серверную сторону координаты, и уже php на серверной стороне запишет их в нужный файл.
Не могу понять почему в Опере 12 нажатие на среднюю кнопку (колесико) не вызывает срабатывания onmousedown/ что за фича такая? И можно это поправить? Ответьте, уважаемые знатоки Java Script.
Друзья, с clientX и clientY не все так радужно, как описано в статье.
Они одинаково поддерживается всеми браузерами.
Это не правда. Если быть точным, это не для всех событий правда.
Например, мне надо было отследить положение курсора во время скроллинга. Мне нужно только свойство clientX. Так вот у события onscroll этого свойства в FF не обнаружилось. И на планшетном (сенсорном) Chrome, хотя на виндузовом Chrome все работает.
Тема статьи "Свойства объекта событие", но, почему-то, ничего не сказано, например, о событии "onkeypress". =( грустно...
Хорошая статья, спасибо =) Мне очень пригодилось при написании событий клика мышью по объектам.
if (!e.relatedTarget && e.fromElement) {
e.relatedTarget = (e.fromElement==e.target) ? e.toElement : e.fromElement
}
кто может разшифровать эту строку?)
Кроссбраузерный(т.к. IE работает не по стандартам W3C) способ получения элемента на который перешел курсор мыши при событии mouseout.
Если не понимаешь саму строку, тогда учи краткую запись If.
Мышка-клавиатура-загрузка_страницы это чудно. Но что насчёт событий tap&swipe? Заранее благодарен.
Здравствуйте, не могу понять как на Firefox у вас вызывается событие click даже когда кликаю средней кнопкой мыши.
А если мне нужно вторым аргументом callback передать, как это сделать не трогая event который идет первым аргументом?
Люди, помогите с такой проблемой. Есть графический объект, передвигающийся за курсором мыши. Но мне необходимо знать, куда мышь в данный момент передвигается: влево или вправо, чтобы менять этот графический объект в зависимости стороны передвижения мыши. Перекопал инет. Подобной задачи никто не решал.
А маргинами не пробовал?
Не получается отследить клики по дочерним элементам целевого элемента
найс, то что нужно