Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отловить направление onmousemove event? (https://javascript.ru/forum/misc/25209-otlovit-napravlenie-onmousemove-event.html)

T-sh 29.01.2012 03:06

Цитата:

Сообщение от Livaanderiamarum (Сообщение 153826)
лишние блоки сильнее нагружают комп чем то что сделал я. вот с чего.

да.. четыре блока эт серьезный удар по производительности... согласен.

Livaanderiamarum 29.01.2012 03:12

с чего это он серьезный?? ты представляешь сколько браузер может обрабатывать и не захлебываться? 4 блока для него вообще не заметны. вернее для нас.
прочитай мой текст внимательно, твой способ это НЕПОМЕРНАЯ нагрузка, если существует мой.

devote 29.01.2012 05:48

Как то так, но в идеале события лучше вешать через нормальные методы, 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>

Livaanderiamarum 29.01.2012 06:04

devote,
и что вообще делает твой код, почему определение направления происходит только при выведении мышки за пределы квадрата?

devote 29.01.2012 16:36

Цитата:

Сообщение от Livaanderiamarum
devote,
и что вообще делает твой код, почему определение направления происходит только при выведении мышки за пределы квадрата?

потому что автору так надо было

devote 29.01.2012 16:55

вот тебе другое:

<!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>

Livaanderiamarum 29.01.2012 18:42

потому что автору так надо было[источник?]

Pavel M. 29.01.2012 20:50

Цитата:

Сообщение от jsuse
Отловить направление onmousemove event?

была похожая тема, про то откуда зашла мышь http://javascript.ru/forum/events/24...odit-mysh.html

Livaanderiamarum 29.01.2012 21:48

Я не знаю как вы вообще столько кода выдаете

<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>

devote 29.01.2012 21:51

Цитата:

Сообщение от Livaanderiamarum
Я не знаю как вы вообще столько кода выдаете

что бы работало везде, например твой у меня не работает.


Часовой пояс GMT +3, время: 14:27.