我想添加一个具有不同功能的绘图程序按钮。但是我当然遇到了第一个问题。我正试图用一个按钮来清除整个画布。但不知怎的,它不起作用。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var cb_canvas = null;
var cb_ctx = null;
var cb_lastPoints = null;
var cb_easing = 0.4;
// Setup event handlers
window.onload = init;
function init(e) {
cb_canvas = document.getElementById("cbook");
cb_lastPoints = Array();
if (cb_canvas.getContext) {
cb_ctx = cb_canvas.getContext('2d');
cb_ctx.lineWidth = 2;
cb_ctx.strokeStyle = "rgb(0, 0, 0)";
cb_ctx.beginPath();
cb_canvas.onmousedown = startDraw;
cb_canvas.onmouseup = stopDraw;
cb_canvas.ontouchstart = startDraw;
cb_canvas.ontouchstop = stopDraw;
cb_canvas.ontouchmove = drawMouse;
}
}
function startDraw(e) {
if (e.touches) {
// Touch event
for (var i = 1; i <= e.touches.length; i++) {
cb_lastPoints[i] = getCoords(e.touches[i - 1]); // Get info for
finger #1
}
}
else {
// Mouse event
cb_lastPoints[0] = getCoords(e);
cb_canvas.onmousemove = drawMouse;
}
return false;
}
// Called whenever cursor position changes after drawing has started
function stopDraw(e) {
e.preventDefault();
cb_canvas.onmousemove = null;
}
function drawMouse(e) {
if (e.touches) {
// Touch Enabled
for (var i = 1; i <= e.touches.length; i++) {
var p = getCoords(e.touches[i - 1]); // Get info for finger i
cb_lastPoints[i] = drawLine(cb_lastPoints[i].x, cb_lastPoints[i].y,
p.x, p.y);
}
}
else {
// Not touch enabled
var p = getCoords(e);
cb_lastPoints[0] = drawLine(cb_lastPoints[0].x, cb_lastPoints[0].y, p.x,
p.y);
}
cb_ctx.stroke();
cb_ctx.closePath();
cb_ctx.beginPath();
return false;
}
// Draw a line on the canvas from (s)tart to (e)nd
function drawLine(sX, sY, eX, eY) {
cb_ctx.moveTo(sX, sY);
cb_ctx.lineTo(eX, eY);
return { x: eX, y: eY };
}
// Get the coordinates for a mouse or touch event
function getCoords(e) {
if (e.offsetX) {
return { x: e.offsetX, y: e.offsetY };
}
else if (e.layerX) {
return { x: e.layerX, y: e.layerY };
}
else {
return { x: e.pageX - cb_canvas.offsetLeft, y: e.pageY -
cb_canvas.offsetTop };
}
}
$("clear").onclick=function(){clearAll()};
function clearAll() {
var canvas = $("#cbook");
var ctx = canvas.get(0).getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
});
</script>
</head>
<body>
<canvas id="cbook" width="500" height="333"></canvas>
<button id="clear">Clean Up</button>
</body>
</html>
答案 0 :(得分:1)
你是对的,有几个问题......
$("clear").onclick=function(){clearAll()};
应该阅读
$("#clear").click(clearAll);
您需要将选择器标记为id,并且您还尝试将本机元素事件放在jQuery对象上。
另一个问题是你正在使用包含画布而不是原生元素的jQuery对象,而是改变...
var canvas = $("#cbook");
var ctx = canvas.get(0).getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
要...
var canvas = $("#cbook");
var ctx = canvas.get(0).getContext("2d");
ctx.clearRect(0, 0, canvas.get(0).width, canvas.get(0).height);
或更简单......
var canvas = $("#cbook").get(0);
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
小提琴......
哦,完全忘了,window.onload
处理程序是不必要的,因为你在jQuery的文档就绪函数中运行它,无论如何都应该准备好了。我刚刚将所有内容移出函数并删除了window.onload
处理程序。
答案 1 :(得分:0)
我可以看到您的代码存在三个主要问题。首先,你正在混合和匹配Javascript和jQuery,这导致了问题(当使用Canvas时,尝试并坚持使用vanilla Javascript)。
你没有在clearAll()
函数中获取上下文,因为你正在尝试使用jQuery:
var canvas = $("#cbook");
当你应该使用普通的'JS'时,就像你的绘图功能一样:
var canvas = document.getElementById("cbook");
其次,你正在调用这样的清除函数:
$("clear").onclick=function(){clearAll()};
应该如此:
$("#clear").on('click', function(){clearAll()});
(注意#
之前的clear
- 您需要使用它来引用元素的ID。)
最后,您正在寻找画布中第一个画布实例,该实例不起作用:
var ctx = canvas.get(0).getContext("2d");
您只需要:
var ctx = canvas.getContext("2d");
这是一个有效的JSFiddle: