Javascript canvas在桌面上工作得很好,但在移动设备上却不行';行不通
我有画布功能,在桌面上工作得很好,但在移动设备上它工作得很奇怪或者不工作 在移动设备上,它每20秒工作一次,当你们触摸手指的开始50px时,只会画一条线 这是我的密码:Javascript canvas在桌面上工作得很好,但在移动设备上却不行';行不通,javascript,jquery,canvas,Javascript,Jquery,Canvas,我有画布功能,在桌面上工作得很好,但在移动设备上它工作得很奇怪或者不工作 在移动设备上,它每20秒工作一次,当你们触摸手指的开始50px时,只会画一条线 这是我的密码: var canvasDiv = document.getElementById('canvasDiv'); var canvas = document.createElement('canvas'); canvas.setAttribute('id', 'canvas'); canvasDiv.appendChild(canva
var canvasDiv = document.getElementById('canvasDiv');
var canvas = document.createElement('canvas');
canvas.setAttribute('id', 'canvas');
canvasDiv.appendChild(canvas);
$("#canvas").attr('height', $("#canvasDiv").outerHeight());
$("#canvas").attr('width', $("#canvasDiv").width());
if (typeof G_vmlCanvasManager != 'undefined') {
canvas = G_vmlCanvasManager.initElement(canvas);
}
context = canvas.getContext("2d");
var blueprint_background = new Image();
blueprint_background.src = srctesting;
blueprint_background.crossOrigin="anonymous";
blueprint_background.onload = function(){
var pattern = context.createPattern(this, "no-repeat");
context.fillStyle = pattern;
context.rect(0,0,$("#canvasDiv").width(),$("#canvasDiv").outerHeight());
context.fill();
};
// console.log(blueprint_background)
$('#canvas').mousedown(function(e) {
var offset = $(this).offset()
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
paint = true;
addClick(e.pageX - offset.left, e.pageY - offset.top);
redraw();
});
$('#canvas').mousemove(function(e) {
if (paint) {
var offset = $(this).offset()
//addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
addClick(e.pageX - offset.left, e.pageY - offset.top, true);
// console.log(e.pageX, offset.left, e.pageY, offset.top);
redraw();
}
});
$('#canvas').mouseup(function(e) {
paint = false;
});
$('#canvas').mouseleave(function(e) {
paint = false;
});
var clickX = new Array();
var clickY = new Array();
var clickDrag = new Array();
var paint;
function addClick(x, y, dragging) {
clickX.push(x);
clickY.push(y);
clickDrag.push(dragging);
}
$("#reset-btn").click(function() {
context.clearRect(0, 0, window.innerWidth, window.innerWidth);
clickX = [];
clickY = [];
clickDrag = [];
});
$(document).on('click', '#btn-save', function() {
var mycanvas = document.getElementById('canvas');
var img = mycanvas.toDataURL("image/png");
anchor = $("#signature");
anchor.val(img);
$("#signatureform").submit();
});
var drawing = false;
var mousePos = {
x: 0,
y: 0
};
var lastPos = mousePos;
canvas.addEventListener("touchstart", function(e) {
mousePos = getTouchPos(canvas, e);
var touch = e.touches[0];
var mouseEvent = new MouseEvent("mousedown", {
clientX: touch.clientX,
clientY: touch.clientY
});
canvas.dispatchEvent(mouseEvent);
}, false);
canvas.addEventListener("touchend", function(e) {
var mouseEvent = new MouseEvent("mouseup", {});
canvas.dispatchEvent(mouseEvent);
}, false);
canvas.addEventListener("touchmove", function(e) {
var touch = e.touches[0];
var offset = $('#canvas').offset();
var mouseEvent = new MouseEvent("mousemove", {
clientX: touch.clientX,
clientY: touch.clientY
});
canvas.dispatchEvent(mouseEvent);
}, false);
// Get the position of a touch relative to the canvas
function getTouchPos(canvasDiv, touchEvent) {
var rect = canvasDiv.getBoundingClientRect();
return {
x: touchEvent.touches[0].clientX - rect.left,
y: touchEvent.touches[0].clientY - rect.top
};
}
var elem = document.getElementById("canvas");
var defaultPrevent = function(e) {
e.preventDefault();
}
elem.addEventListener("touchstart", defaultPrevent);
elem.addEventListener("touchmove", defaultPrevent);
function redraw() {
//
lastPos = mousePos;
for (var i = 0; i < clickX.length; i++) {
context.beginPath();
if (clickDrag[i] && i) {
context.moveTo(clickX[i - 1], clickY[i - 1]);
} else {
context.moveTo(clickX[i] - 1, clickY[i]);
}
context.lineTo(clickX[i], clickY[i]);
context.closePath();
context.stroke();
}
}
var canvasDiv=document.getElementById('canvasDiv');
var canvas=document.createElement('canvas');
setAttribute('id','canvas');
canvasDiv.appendChild(canvas);
$(“#canvas”).attr('height',$(“#canvasDiv”).outerHeight());
$(“#canvas”).attr('width',$(“#canvasDiv”).width();
if(G_vmlCanvasManager的类型!=“未定义”){
canvas=G_vmlCanvasManager.initElement(canvas);
}
context=canvas.getContext(“2d”);
var blueprint_background=新图像();
blueprint_background.src=srctesting;
blueprint_background.crossOrigin=“匿名”;
blueprint_background.onload=函数(){
var pattern=context.createPattern(这是“无重复”);
context.fillStyle=模式;
context.rect(0,0,$(“#canvasDiv”).width(),$(“#canvasDiv”).outerHeight());
context.fill();
};
//console.log(蓝图\后台)
$(“#画布”).mousedown(函数(e){
var offset=$(this.offset()
var mouseX=e.pageX-this.offsetLeft;
var mouseY=e.pageY-this.offsetTop;
油漆=真;
addClick(e.pageX-offset.left,e.pageY-offset.top);
重画();
});
$('#canvas').mousemove(函数(e){
如果(油漆){
var offset=$(this.offset()
//addClick(e.pageX-this.offsetLeft,e.pageY-this.offsetTop,true);
addClick(e.pageX-offset.left,e.pageY-offset.top,true);
//日志(e.pageX,offset.left,e.pageY,offset.top);
重画();
}
});
$('#canvas').mouseup(函数(e){
油漆=假;
});
$('#canvas').mouseleave(函数(e){
油漆=假;
});
var clickX=新数组();
var clickY=新数组();
var clickDrag=新数组();
var涂料;
功能添加单击(x、y、拖动){
点击x,推送(x);
clickY.push(y);
单击拖动。推送(拖动);
}
$(“#重置btn”)。单击(函数(){
clearRect(0,0,window.innerWidth,window.innerWidth);
点击X=[];
clickY=[];
单击拖动=[];
});
$(文档)。在('单击','btn保存',函数()上){
var mycanvas=document.getElementById('canvas');
var img=mycanvas.toDataURL(“image/png”);
anchor=$(“#签名”);
anchor.val(img);
$(“#签名表单”).submit();
});
var绘图=错误;
var mousePos={
x:0,,
y:0
};
var lastPos=鼠标点;
canvas.addEventListener(“touchstart”,函数(e){
mousePos=getTouchPos(画布,e);
var-touch=e.touch[0];
var mouseEvent=新的mouseEvent(“mousedown”{
clientX:touch.clientX,
clientY:touch.clientY
});
canvas.dispatchEvent(mouseEvent);
},假);
canvas.addEventListener(“touchend”,函数(e){
var mouseEvent=新的mouseEvent(“mouseup”,{});
canvas.dispatchEvent(mouseEvent);
},假);
canvas.addEventListener(“触摸移动”,函数(e){
var-touch=e.touch[0];
var offset=$('#canvas').offset();
var mouseEvent=新的mouseEvent(“mousemove”{
clientX:touch.clientX,
clientY:touch.clientY
});
canvas.dispatchEvent(mouseEvent);
},假);
//获取触摸相对于画布的位置
函数getTouchPos(canvasDiv、touchfevent){
var rect=canvasDiv.getBoundingClientRect();
返回{
x:touchEvent.Touchs[0]。clientX-rect.left,
y:touchEvent.Touchs[0]。clientY-rect.top
};
}
var elem=document.getElementById(“画布”);
var defaultPrevent=函数(e){
e、 预防默认值();
}
元素addEventListener(“touchstart”,defaultPrevent);
元素addEventListener(“触摸移动”,defaultPrevent);
函数重画(){
//
lastPos=鼠标垫;
对于(变量i=0;i正如你所看到的,我为手机添加了活动。我遗漏了什么吗?
var touch=e.changedtouch[0]
可能会更好。。?您还应该在引用其属性之前检查对象是否存在。Hello@Teemu谢谢您的建议,但这并没有解决问题啊,我的错,您需要从e.changedTouches
中获取最后一个索引,而不是第一个索引。miight在e.touchs
@Teemu yes中添加了var touch=e.touch[e.touch.length-1],但仍然没有改进,在画布和触摸设备上从未使用过。在Android和Chrome的FF上,在Galaxy S6上都能很好地工作。