Отловить направление onmousemove event?
Возможно ли отловить направление onmousemove event? Нужно для драг и дроп. Например, когда собираешься тянуть элемент вниз, код определят, что направление вниз и запрещает. Разрешается только вверх.
Полезное свойство. Думаю, не может быть, чтобы не было штатного. Но порылся в спецификациях, на qJ, на Мазиле, и нечего похожего не нашел. Может кто-то знает? Или нет штатного, писать свое надо? |
только отслеживанием координат мыши
|
как извращенный вариант: (однажды реализовывал... с координатами возиться лень было, а красота кода была не приоритетом) обернул нужный div четырьмя span'ами, каждый из который выступал из-за div'a только с одной стороны, и отлавливал мышь на них.. в зависимости от результата — то или иное действие)
|
Цитата:
|
Нет. родного нет, нужно писать свое.
|
так бы сделал Максим)
document.body.onmousemove = (function() {
var y = 0
return function(e) {
if (e.clientY > y) {
alert('вниз')
} else if (e.clientY < y) {
alert('вверх')
}
y = e.clientY
}
})()
|
Цитата:
|
Но ведь это непомерная нагрузка
|
Цитата:
|
лишние блоки сильнее нагружают комп чем то что сделал я. вот с чего.
|
Цитата:
|
с чего это он серьезный?? ты представляешь сколько браузер может обрабатывать и не захлебываться? 4 блока для него вообще не заметны. вернее для нас.
прочитай мой текст внимательно, твой способ это НЕПОМЕРНАЯ нагрузка, если существует мой. |
Как то так, но в идеале события лучше вешать через нормальные методы, addEvenetListener. Но для примера привожу примерно так.
Возможно что-то придется под себя подкорректировать.
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
div {
position: absolute;
left: 50%;
top: 50%;
width: 100px;
height: 100px;
margin: -50px 0 0 -50px;
background-color: #0f0;
color: #f00;
}
</style>
<script type="text/javascript">
function init() {
function mouseDirection( callback ) {
// Save old mouse position
var X, Y;
document.onmousemove = function( e ) {
// correction event for IE
e = e || window.event;
// correction page for IE
if ( e.pageX == null && e.clientX != null ) {
var html = document.documentElement,
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);
}
// reset direction to default
var direction = 0;
// adjust coordinates or move starting position
X = ( X || ( X = e.pageX ) ) && X <= e.pageX + 2 && X >= e.pageX - 2 && ( e.pageY >= Y + 2 || e.pageY <= Y - 2 ) ? e.pageX : X;
Y = ( Y || ( Y = e.pageY ) ) && Y <= e.pageY + 2 && Y >= e.pageY - 2 && ( e.pageX >= X + 2 || e.pageX <= X - 2 ) ? e.pageY : Y;
// definition position
direction += Y > e.pageY ? 1 : 0; // to TOP
direction += X < e.pageX ? 2 : 0; // to RIGHT
direction += Y < ( Y = e.pageY ) ? 4 : 0; // to BOTTOM
direction += X > ( X = e.pageX ) ? 8 : 0; // to LEFT
// execute callback
callback( direction );
}
}
(function( window ) {
var direction = 0;
mouseDirection(function( dir ) {
direction = dir;
});
document.getElementById('debug').onmouseout = function() {
var pos = '';
pos += direction & 1 ? 'Top' : '';
pos += direction & 2 ? 'Right' : '';
pos += direction & 4 ? 'Bottom' : '';
pos += direction & 8 ? 'Left' : '';
document.getElementById('debug').innerHTML = pos;
}
})( window );
}
</script>
</head>
<body onload="init();">
<div id="debug"></div>
</body>
</html>
|
devote,
и что вообще делает твой код, почему определение направления происходит только при выведении мышки за пределы квадрата? |
Цитата:
|
вот тебе другое:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function init() {
function mouseDirection( callback ) {
// Save old mouse position
var X, Y;
document.onmousemove = function( e ) {
// correction event for IE
e = e || window.event;
// correction page for IE
if ( e.pageX == null && e.clientX != null ) {
var html = document.documentElement,
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);
}
// reset direction to default
var direction = 0;
// adjust coordinates or move starting position
X = ( X || ( X = e.pageX ) ) && X <= e.pageX + 2 && X >= e.pageX - 2 && ( e.pageY >= Y + 2 || e.pageY <= Y - 2 ) ? e.pageX : X;
Y = ( Y || ( Y = e.pageY ) ) && Y <= e.pageY + 2 && Y >= e.pageY - 2 && ( e.pageX >= X + 2 || e.pageX <= X - 2 ) ? e.pageY : Y;
// definition position
direction += Y > e.pageY ? 1 : 0; // to TOP
direction += X < e.pageX ? 2 : 0; // to RIGHT
direction += Y < ( Y = e.pageY ) ? 4 : 0; // to BOTTOM
direction += X > ( X = e.pageX ) ? 8 : 0; // to LEFT
// execute callback
callback( direction );
}
}
mouseDirection(function( direction ) {
var pos = '';
pos += direction & 1 ? 'Top' : '';
pos += direction & 2 ? 'Right' : '';
pos += direction & 4 ? 'Bottom' : '';
pos += direction & 8 ? 'Left' : '';
document.getElementById('debug').innerHTML = pos;
});
}
</script>
</head>
<body onload="init();">
<div id="debug"></div>
</body>
</html>
|
потому что автору так надо было[источник?]
|
Цитата:
|
Я не знаю как вы вообще столько кода выдаете
<body>
<script>
document.body.onmousemove = (function() {
var y = 0
var x = 0
return function(e) {
if (e.clientY > y) {
console.log('вниз')
} else if (e.clientY < y) {
console.log('вверх')
}
if (e.clientX > x) {
console.log('вправо')
} else if (e.clientX < x) {
console.log('влево')
}
x = e.clientX; y = e.clientY
}
})()
</script>
</body>
|
Цитата:
|
Ну эт потому что боди пустое, а что за браузер?
|
| Часовой пояс GMT +3, время: 20:48. |