提问人:bob 提问时间:10/28/2023 最后编辑:bob 更新时间:10/29/2023 访问量:30
如何在mousemove上通过jQuery插件更改位置元素?
How can I change the position element via jQuery plugin on mousemove?
问:
我需要通过mousemove上的jQuery插件更改位置元素。我正在获取索引 .js 文件中的鼠标移动坐标,并尝试将其作为参数传递给 jQuery 自定义插件。因此,indexjs 变量在 mousemove 上会更改,但是当这些变量作为参数传递到插件文件时,它们不会动态更改。还有错误 TypeError: ((S.event.special[o.origType] ||{}).句柄 ||o.handler).apply 不是函数
// Plugin jQuery file
(function ($) {
$.fn.moveAnimate = function (posX,posY) {
console.log('inner posX', posX) // the posX is instantly === 1, not being changed reactively
return $(this).each(function () {
var $moveElement = $('.move');
$moveElement.animate(
{
position: "absolute",
left: `${posX} + "150px"`,
top: `${posY} + "150px"`
},
1000
);
});
};
})(jQuery);
// index.js file
$(function() {
let globalX = 1
let globalY = 1
$("body").on("mousemove", (e) => {
console.log('inner', globalX) // changes the globalX
globalX = e.pageX;
globalY = e.pageY;
})
$("body").on("mousemove", $(".move").moveAnimate(globalX, globalY))
});
答:
1赞
Rory McCrossan
10/29/2023
#1
代码中存在一些问题。
left: `${posX} + "150px"`,
不是有效的数学运算。您需要添加整数值,然后附加到末尾:px
left: (posX + 150) + 'px'
- 您只需要一个事件处理程序。
body.mousemove
- 您需要在事件处理程序中调用,而不是单独执行它并提供其返回值作为事件处理程序。
$.fn.moveAnimate()
- 函数中不需要循环,因为可以应用于集合。
each()
moveAnimate()
animate()
- 使用事件,而不是 ,因为后者将对鼠标移动的每个像素执行,这不是此用例中需要的
mouseenter
mousemove
- 该元素需要设置为动画运行前才能正常工作。这可以在CSS中完成。
.move
position: absolute
进行这些更改后,代码工作正常:
// Plugin jQuery file
(function($) {
$.fn.moveAnimate = function(posX, posY) {
return $(this).animate({
left: (posX + 150) + 'px',
top: (posY + 150) + 'px'
}, 1000);
};
})(jQuery);
// index.js file
$(function() {
$("body").on("mouseenter", e => {
globalX = e.pageX;
globalY = e.pageY;
$(".move").moveAnimate(globalX, globalY);
});
});
.move {
position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div id="app">
<h1 class="hello">hello</h1>
<h1 class="move">move</h1>
</div>
评论
moveAnimate()
posX
posY
moveAnimate()
mousemove