IMHO нет эквивалента remove_if(). Вы не можете изменить порядок карты. Таким образом, remove_if() не может поставить интересующие вас пары в конце, на которые вы можете позвонить erase().
Реальный ответ: Нет, это невозможно.
Хорошо, я только что подумал о пути. Наложите свою страницу на div, который охватывает весь документ. Внутри этого, создайте (скажем) 2 000 x 2000 & lt; a & gt;
элементов (так что псевдокласс класса : hover
будет работать в IE 6, см.), Каждый 1 пиксель в размере. Создайте правило CSS : hover
для тех элементов & lt; a & gt;
, которые изменяют свойство (скажем, font-family
). В вашем обработчике нагрузки проведите цикл через каждый из 4 миллионов элементов & lt; a & gt;
, проверив currentStyle
/ getComputedStyle ()
, пока не найдете тот с шрифтом наведения. Экстраполируйте назад из этого элемента, чтобы получить координаты внутри документа.
N.B. НЕ ДЕЛАЙТЕ ЭТО.
Ответ @Tim Down не работает, если вы выставляете 2 000 x 2000 & lt; a & gt;
элементов:
ОК, я только что подумал об этом. Наложите свою страницу на div, который охватывает весь документ. Внутри этого, создайте (скажем) 2000 x 2000 элементов (чтобы псевдо-класс: hover работал в IE 6, см.), Каждый размером 1 пиксель. Создайте правило CSS: hover для тех элементов, которые изменяют свойство (скажем, семейство шрифтов). В вашем обработчике нагрузки пройдите через каждый из 4 миллионов элементов, проверяя currentStyle / getComputedStyle (), пока не найдете ту, которая имеет шрифт зависания. Экстраполируйте назад этот элемент, чтобы получить координаты внутри документа.
N.B. НЕ ДЕЛАЙТЕ ЭТО.
blockquote>Но вам не нужно отображать 4 миллиона элементов одновременно, вместо этого используйте бинарный поиск. Просто используйте 4
& lt; a & gt;
элементы:
- Шаг 1: Рассмотрите весь экран как начальную область поиска
- Шаг 2: Разделить область поиска в 2 x 2 = 4 прямоугольника
& lt; a & gt;
элементы- Шаг 3: Используя функцию
getComputedStyle ()
, определите, в какой прямоугольной мышке hovers- Шаг 4: Уменьшите область поиска до этого прямоугольника и повторите с шага 2.
Таким образом, вам нужно будет повторить эти шаги максимум 11 раз, учитывая ваши экран не шире 2048px.
Итак, вы создадите максимум 11 x 4 = 44
& lt; a & gt;
элементов.Если вам не нужно чтобы определить положение мыши точно в пикселе, но, как говорят, точность 10 пикселей. Вы повторите шаги не более 8 раз, поэтому вам нужно будет нарисовать max 8 x 4 = 32
& lt; a & gt;
элементов.Также генерировать и затем уничтожать
& lt; a & gt;
не выполняется, поскольку DOM обычно медленный. Вместо этого вы можете просто повторно использовать исходные 4& lt; a & gt;
элементы и просто отрегулировать ихверх
,влево
,width
иheight
, когда вы выполняете шаги.Теперь создание 4
& lt; a & gt;
также является излишним. Вместо этого вы можете использовать один и тот же элемент& lt; a & gt;
для тестирования дляgetComputedStyle ()
в каждом прямоугольнике. Таким образом, вместо разделения области поиска на 2 x 2& lt; a & gt;
элементы просто повторно используют один элемент& lt; a
, перемещая его с помощьюtop
иleft
.Итак, все, что вам нужно, это один элемент
& lt; a & gt;
изменить его ширинуи
height
не более 11 раз, а верхняяверхняя
иоставлена
max 44 раза, и вы будете иметь точную позицию мыши.
var x = 0; var y = 0; document.addEventListener ('mousemove', onMouseMove, false) function onMouseMove (e) {x = e.clientX; y = e.clientY; } function getMouseX () {return x; } function getMouseY () {return y; }
Что вы можете сделать, это создать переменные для координат x
и y
вашего курсора, обновлять их всякий раз, когда мышь перемещается и вызывать функцию на интервал, чтобы сделать то, что вам нужно сохранить сохраненную позицию.
Недостатком этого является то, что для его работы требуется хотя бы одно начальное движение мыши. Пока курсор обновляет свое положение хотя бы один раз, мы можем найти его положение независимо от того, будет ли он двигаться снова.
var cursorX; var cursorY; document.onmousemove = function (e) {cursorX = e.pageX; cursorY = e.pageY; } setInterval (checkCursor, 1000); function checkCursor () {alert ("Курсор в:" + cursorX + "," + cursorY); }
Предыдущий код обновляется один раз в секунду с сообщением о том, где находится ваш курсор. Надеюсь, это поможет.
cursorX / Y
до того, как произойдет какое-либо событие.
– polkovnikov.ph
9 February 2016 в 18:11
Вам не нужно перемещать мышь, чтобы получить местоположение курсора. Местоположение также сообщается о событиях, отличных от mousemove. Вот пример click-event:
document.body.addEventListener ('click', function (e) {console.log ("cursor-location:" + e.clientX + ' , '+ e.clientY);});
Вы можете попробовать что-то похожее на то, что предложил Тим Даун, но вместо того, чтобы иметь элементы для каждого пикселя на экране, создайте всего 2-4 элемента (ячейки) и измените их местоположение, ширину и высоту динамически, чтобы разделить все возможное места на экране на 2-4 рекурсивно, таким образом быстро обнаруживая реальное местоположение мыши.
Например - первые элементы занимают правую и левую половину экрана, а затем верхнюю и нижнюю половину. К настоящему времени мы уже знаем, в какой четверти экрана находится мышь, можно повторить - обнаружить, какая четверть этого пространства ...
Riffing on @ ответ SuperNova , вот подход с использованием классов ES6, который поддерживает контекст для , этот
правильный в вашем обратном вызове:
класс Мышь {constructor () {this.x = 0; this.y = 0; this.callbacks = {mouseenter: [], mousemove: [],}; } get xPos () {return this.x; } get yPos () {return this.y; } get position () {return `$ {this.x}, $ {this.y}`; } addListener (type, callback) {document.addEventListener (type, this); // Передаем `this`, как второй arg, чтобы сохранить контекст правильно this.callbacks [type] .push (callback); } // `handleEvent` является частью API-интерфейса браузера EventListener. // https://developer.mozilla.org/en-US/docs/Web/API/EventListener/handleEvent handleEvent (event) {const isMousemove = event.type === 'mousemove'; const isMouseenter = event.type === 'mouseenter'; if (isMousemove || isMouseenter) {this.x = event.pageX; this.y = event.pageY; } this.callbacks [event.type] .forEach ((callback) = & gt; {callback ();}); }} const mouse = new Mouse (); mouse.addListener ('mouseenter', () = & gt; console.log ('mouseenter', mouse.position)); mouse.addListener ('mousemove', () = & gt; console.log ('mousemove A', mouse.position)); mouse.addListener ('mousemove', () = & gt; console.log ('mousemove B', mouse.position));
Самое простое решение, но не на 100% точное
$ (': hover'). last (). offset ()
Результат: {top: 148, left: 62.5}
Результат зависит от размера ближайшего элемента и возвращает undefined
, когда пользователь переключил вкладку
undefined
независимо. Можете ли вы рассказать о том, как использовать это?
– tresf
8 March 2018 в 17:06
undefined
, когда курсор не зависал ни один элемент (или когда браузер потерял фокус). Возможно, вам потребуется установить временной интервал, если вы тестируете его с консоли.
– StefansArya
10 March 2018 в 05:12
setTimeout
работал. Я использовал jsfiddle, и вы правы, он никогда не попадал в событие hover, потому что он перерисовывает DOM каждый раз, когда вы нажимаете play. Я бы рекомендовал добавить этот намек другим.
– tresf
10 March 2018 в 09:03
Вы также можете зацепить mouseenter (это событие запускается после перезагрузки страницы, когда мышка находится внутри страницы). Расширение кода Corrupted должно делать трюк:
var x = null; var y = null; document.addEventListener ('mousemove', onMouseUpdate, false); document.addEventListener ('mouseenter', onMouseUpdate, false); function onMouseUpdate (e) {x = e.pageX; y = e.pageY; console.log (x, y); } function getMouseX () {return x; } function getMouseY () {return y; }
Вы также можете установить x и y в значение null на mouseleave-event. Таким образом, вы можете проверить, находится ли пользователь на вашей странице с помощью курсора.
mouseleave
, которое устанавливает x
и y
обратно в null
или 'не определено'
– rtpax
14 December 2016 в 00:02
Я предполагаю, что, возможно, у вас есть родительская страница с таймером, и через определенное время или задача завершена, вы пересылаете пользователя на новую страницу. Теперь вам нужна позиция курсора, и поскольку они ждут, они не обязательно касаются мыши. Поэтому следите за мышью на родительской странице с помощью стандартных событий и передавайте последнее значение на новую страницу в переменной get или post.
Вы можете использовать код JHarding на своей родительской странице, чтобы последняя позиция была всегда доступно в глобальной переменной:
var cursorX; var cursorY; document.onmousemove = function (e) {cursorX = e.pageX; cursorY = e.pageY; }
Это не поможет пользователям перейти на эту страницу, отличную от родительской.
Я выполнил горизонтальный / вертикальный поиск (сначала сделайте div, полный вертикальных линий, расположенных горизонтально, затем сделайте div, полный горизонтальных линий, расположенных вертикально, и просто посмотрите, какой из них имеет состояние зависания), как идея Тима Дауна выше, и он работает довольно быстро. К сожалению, не работает на Chrome 32 в KDE.
jsfiddle.net/5XzeE/4 /
& lt; a & gt;
, покрывающих заданные прямоугольники (с использованием абсолютного позиционирования элементов размера& lt; img & gt;
, я полагаю), каждый раз сокращая прямоугольники. Да, это смешно, но так не удается получить эту информацию до первой mousemove. – Darius Bacon 28 May 2013 в 23:24