Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   обработчик onMouseMove (https://javascript.ru/forum/misc/4211-obrabotchik-onmousemove.html)

jeel 02.07.2009 10:42

обработчик onMouseMove
 
Помогите модифицировать функцию JavaScript!

В HTML документе есть тег div id = "middle_bg", в него вложен div id = "img".
Img содержит картинку, размеры которой больше middle_bg.
Функция mouseMove - обработчик на OnMouseMove, двигает img внутри middle_bg.
Каким образом можно модифицировать функцию, чтобы при достижении границы middle_bg тегом img, img дальше не двигался, т.е. чтобы не было свободного пространства и угол img не двигался дальше угла middle_bg?

function mouseMove(ev){
ev = ev || window.event;
var mousePos = mouseCoords(ev); //получаем координаты мыши
if(dragObject){
dragObject.style.position = 'relative';
var middle_bg=document.getElementById('middle_bg');
var middle_bg_coords = getPosition(middle_bg);
var img=document.getElementById('img');
var img_coords = getPosition(img);
dragObject.style.top = mousePos.y - mouseOffset.y - middle_bg_coords.y;
dragObject.style.left = mousePos.x - mouseOffset.x - middle_bg_coords.x;
return false;
}
}

jeel 02.07.2009 10:55

Если строчку
dragObject.style.top = mousePos.y - mouseOffset.y - middle_bg_coords.y;
заменить например таким
if (map_coords.y <= middle_bg_coords.y)
{
dragObject.style.top = mousePos.y - mouseOffset.y - middle_bg_coords.y;
}
то если сначала двигать картинку вверх, а затем вниз, то она останавливается у верхнего края, однако дальнейшие попытки сдвинуть картинку вверх остаются безрезультатными, и картинка как бы прилипает к верхнему краю и вверх не передвигается

Помогите, пожалуйста, исправить код...

B~Vladi 02.07.2009 10:59

if (map_coords.y < middle_bg_coords.y)

jeel 02.07.2009 11:02

такой вариант работает только для первого раза...затем картинка как-бы прилипает к верхней границе и повертикали не двигается...в чем может быть дело?

B~Vladi 02.07.2009 11:04

Проверяешь если y<0, ставишь её в 0. Т.е. нада возвращать её туда, где проверка будет давать false, чтобы можно было таскать.

B~Vladi 02.07.2009 11:07

ах, да... Забыл кое-что.
Алгоритм, значт, такой:
1. Присваиваем новое значение.
2. Проверяем, не вышла ли картинка за пределы
3. Если вышла - возвращаем назад.

jeel 02.07.2009 11:54

if (map_coords.y <= middle_bg_coords.y)
{
dragObject.style.top = mousePos.y - mouseOffset.y - middle_bg_coords.y;
}
else
{
dragObject.style.top = 0;
}

При таком коде при движении мышью картинка дрожит, т.е. как бы пытается вернуться к верхнему краю...
Если отпускаю кнопку мыши, она иногда притягивается к верхнему краю, иногда нет ... от чего это зависит не пойму

jeel 02.07.2009 12:00

if (map_coords.y <= middle_bg_coords.y)
{
dragObject.style.top = mousePos.y - mouseOffset.y - middle_bg_coords.y;
}
else
{
dragObject.style.top = 0;
dragObject = null;
}

при таком варианте (когда обнуляю dragObject) работает нормально, однако чтобы передвигать в другую сторону приходится заново цеплять мышкой...
не можете подсказать рациональное решение как от этого избавиться?

B~Vladi 02.07.2009 13:47

Ты не методом тыка делай, а умом.
Допустим ты двигаешь элемент по Y вверх. Тебе нада чтобы он не заходил выше нуля. Когда происходит событие, сначала присваиваешь новые значения. К примеру новое значение -10. После этого Делаешь проверку. В ней проверяешь - если твой объект находится там, где он НЕ должен быть, только тогда отправляешь его туда, где находится граница возможного расположения объекта, т.е. 0. Делать проверку вида y<=0 неправильно, т.к. 0 находится в области, в которой объект МОЖЕТ быть. Для понимания сего ты должет чётко представлять это в голове.

jeel 02.07.2009 13:51

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


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