0

さまざまな機能を持つボタンを描画プログラムに追加したいと思います。しかし、もちろん、最初のものには問題がありました。キャンバス全体をクリアするボタンを用意しようとしています。しかし、どういうわけかうまくいきません。

<!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>
4

2 に答える 2

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);

フィドル...

http://jsfiddle.net/zZhfE/

ああ、完全に忘れてしまいましたがwindow.onload、jQueryのドキュメント準備機能内でハンドラーを実行しているのでハンドラーは不要です。とにかくすべての準備が整っているはずです。window.onload関数からすべてを移動し、ハンドラーを削除しました。

于 2012-11-15T09:23:38.013 に答える
0

私はあなたのコードに関する3つの主要な問題を見ることができます。まず、JavascriptとjQueryを組み合わせて一致させているため、問題が発生しています(Canvasを使用する場合は、バニラJavascriptを使用してみてください)。

clearAll()jQueryを使用しようとしているため、関数でコンテキストを取得していません。

var canvas = $("#cbook");

描画関数のように、プレーンなol'JSを使用する必要がある場合:

var canvas = document.getElementById("cbook");

次に、次のようにclear関数を呼び出しています。

$("clear").onclick=function(){clearAll()};

これが必要な場合:

$("#clear").on('click', function(){clearAll()});

#(前に注意してくださいclear-要素のIDを参照するにはこれを使用する必要があります。)

最後に、キャンバス内のキャンバスの最初のインスタンスを探していますが、これは機能しません。

 var ctx = canvas.get(0).getContext("2d");

あなたに必要なのは:

var ctx = canvas.getContext("2d");

動作するJSFiddleは次のとおりです。

http://jsfiddle.net/hGjDR/

于 2012-11-15T09:21:40.023 に答える