Игнорирование дочерних элементов в mousemove
Я пытаюсь получить положение мыши относительно элемента с помощью mousemove. Он отлично работает, но когда мышь наводит дочерний элемент, координаты относительно этого дочернего элемента. Мне нужно положение мыши относительно родительского div, а не ребенка.
посмотреть это JSFiddle например.
var object = document.getElementsByClassName('object'),
scene = document.getElementById('scene');
function initMove() {
for(var i=0; i<object.length; i++) {
object[i].addEventListener("mousemove", function(event) {
//event.stopPropagation();
return false;
}, false);
}
scene.addEventListener("mousemove", function (event) {
//event.stopPropagation();
//event.currentTarget;
moveX = event.offsetX;
moveY = event.offsetY;
console.log(moveX + ' + ' + moveY);
}, false);
}
function init() {
initMove();
document.onselectstart = function(){ return false; }
};
init();
добавлять event.stopPropagation()
при дочернем возврате данных нет.
И я не уверен, как event.currentTarget
строительство.
Я не могу использовать mouseenter или все другие элементы управления мыши, потому что я хочу, чтобы это было touch friendly (путем замены mousemove на touchmove).
какие идеи?
3 ответов
в ваш код mousemove
, попробуйте использовать следующие moveX
и moveY
:
moveX = event.clientX - scene.offsetLeft;
moveY = event.clientY - scene.offsetTop;
кроме того, вы забыли #
на $('scene')
.
вот обновленный JSFiddle.
использовать mousemove
и координаты курсора, чтобы получить глобальную позицию мыши. Затем вычитайте смещение вашего дочернего элемента из этого.
var scene = $('#scene');
scene.mousemove(function(e){
var offsetX = e.pageX - scene.offset().left;
var offsetY = e.pageY - scene.offset().top;
});
весь ваш скрипт может выглядеть следующим образом проверена пример, который позволяет перейти к объекту в сцене.
jQuery(document).ready(function(){
var scene = $('#scene');
var object = $('.object');
scene.mousemove(function(e){
// get offset of object relative to scene
var offsetX = e.pageX - scene.offset().left;
var offsetY = e.pageY - scene.offset().top;
// grab object in it's center (optional)
offsetX -= object.width() / 2;
offsetY -= object.height() / 2;
// don't left to object out of the scene
var maxX = scene.width() - object.width();
var maxY = scene.height() - object.height();
if(0 > offsetX) offsetX = 0;
else if(offsetX > maxX) offsetX = maxX ;
if(0 > offsetY) offsetY = 0;
else if(offsetY > maxY) offsetY = maxY;
// delete decimals
offsetX = Math.floor(offsetX);
offsetY = Math.floor(offsetY);
// debug information
object.html('X: ' + offsetX + '<br>Y: ' + offsetY);
// move object
object.css('left', offsetX).css('top', offsetY);
});
});
это то, что вы хотели сделать? Вот ваша скрипка:http://jsfiddle.net/Bp3wH/9/ (Если вам нравится видеть эту версию только с оптическими улучшениями http://jsfiddle.net/Bp3wH/11/)
для дальнейшего использования вы можете просто создать абсолютный div и поместить его сверху, установить Z-индекс и зафиксировать его сверху и слева от родителя, содержащего ребенка, а затем изменить код, чтобы обработчик событий запускался на селекторе для входного слоя сверху. Разделите значения высоты и ширины на X и Y на курсоре, и он находится в центре.