您好我正在尝试获取触摸事件的offsetX,Y,它应该与鼠标事件的offsetX相同。为此,我使用了以下代码:
ev.offsetX = ev.targetTouches[0].pageX- canvasName.offsetLeft
我甚至试图将触摸事件模拟为鼠标事件,但为此我需要offsetX / Y,这在触摸事件中是不可用的。是否有任何方法可以计算offsetX / Y的触摸?请帮忙
答案 0 :(得分:26)
我用这个
var rect = e.target.getBoundingClientRect();
var x = e.targetTouches[0].pageX - rect.left;
var y = e.targetTouches[0].pageY - rect.top;
答案 1 :(得分:3)
在具有滚动功能的网页上,最佳答案对我不起作用!这样会更好:
var bcr = e.target.getBoundingClientRect();
var x = e.targetTouches[0].clientX - bcr.x;
var y = e.targetTouches[0].clientY - bcr.y;
我用它来解决我的问题。
答案 2 :(得分:2)
我知道这是一个古老的问题,但是谷歌中的第一个" offsetX触摸事件" ...我在研究之后最终使用了这样的东西。
function getOffsetPosition(evt, parent){
var position = {
x: (evt.targetTouches) ? evt.targetTouches[0].pageX : evt.clientX,
y: (evt.targetTouches) ? evt.targetTouches[0].pageY : evt.clientY
};
while(parent.offsetParent){
position.x -= parent.offsetLeft - parent.scrollLeft;
position.y -= parent.offsetTop - parent.scrollTop;
parent = parent.offsetParent;
}
return position;
}
答案 3 :(得分:1)
如果您在页面上滚动,则应使用鼠标事件的clientX
/ clientY
属性(或pageX
/ pageY
)。
至于你的解决方案。可以使用getElementById(canvasName).clientX
ev.offsetX = ev.targetTouches[0].pageX - getElementById(canvasName).clientX
canvasName.offsetLeft
相对于其父级canvasName
的偏移量。因此,如果您想使用offsetLeft
,您应该执行以下操作
var left = 0,
elem = getElementById(canvasName);
while(elem) {
left = left + parseInt(elem.offsetLeft);
elem = elem.offsetParent;
}
ev.offsetX = ev.targetTouches[0].pageX - left
答案 4 :(得分:0)
如果使用jQuery touchend事件,则layerX和layerY属性提供相对x和y,但不考虑转换。所以我通过从css中获取变换比例值来手动应用变换。
e =来自jQuery的touchend事件
parent =应用“transform”的父元素的jQuery对象。对我来说是$(e.target.parentNode);
const layerX = e.originalEvent.layerX;
const layerY = e.originalEvent.layerY;
const currentScale = 1 / parseFloat(parent.css('transform').match(/-?[\d\.]+/g)[0]);
const offsetX = layerX * currentScale;
const offsetY = layerY * currentScale;
使最后两行与触摸和点击事件兼容:
const offsetX = e.offsetX || layerX * currentScaleX;
const offsetY = e.offsetY || layerY * currentScaleY;
获取变换值的参考:Fetch the css value of transform directly using jquery
如果您使用的是Reactjs onClick
,那么您可以使用e.nativeEvent.layerX
获取layerX和layerY值。出于某种原因,在反应触摸事件中,layerX和layerY不可用。如果您确实需要使用React onTouchEnd
:
const rect = e.nativeEvent.target.getBoundingClientRect();
const layerX = e.changedTouches[0].clientX - rect.left;
const layerY = e.changedTouches[0].clientY - rect.top;
const currentScale = 1 / parseFloat(parent.css('transform').match(/-?[\d\.]+/g)[0]);
const offsetX = layerX * currentScale;
const offsetY = layerY * currentScale;
注意:最好将变换的值存储在Redux中,而不是使用jQuery抓取它们。
答案 5 :(得分:0)
贷记https://stackoverflow.com/a/11396681/1997890
function recoverOffsetValues(e) {
var rect = e.target.getBoundingClientRect();
var bodyRect = document.body.getBoundingClientRect();
var x = e.originalEvent.changedTouches[0].pageX - (rect.left - bodyRect.left);
var y = e.originalEvent.changedTouches[0].pageY - (rect.top - bodyRect.top);
return [x, y];
}
答案 6 :(得分:0)
我用这个:
const {x, y, width, height} = e.target.getBoundingClientRect();
const offsetX = (e.touches[0].clientX-x)/width*e.target.offsetWidth;
const offsetY = (e.touches[0].clientY-y)/height*e.target.offsetHeight;