私はOOのアプローチを使ってJavaScriptを学ぼうとしています。これは私のコードです:OO Javascript - イベント
/*global document, MouseEvent */
MouseEvent.prototype.mouseCoordinates = function() {
return {
'x' : this.pageX - this.target.offsetLeft,
'y' : this.pageY - this.target.offsetTop
};
};
(function() {
var Pencil = function() {},
Canvas = function() {
this.element = document.getElementById('canvas');
this.tool = new Pencil();
this.element.addEventListener('click', this.tool.draw, false);
},
c;
Pencil.prototype.draw = function (event) {
var context = event.target.getContext('2d'),
coordinates = event.mouseCoordinates();
context.fillRect(coordinates.x, coordinates.y, 5, 5);
};
c = new Canvas();
}());
私はMSペイントのようなことをしようとしています。そこで、CanvasオブジェクトとPencilオブジェクトを作成しました。私は手続き的なアプローチを使用してそれを行うことができますが、私はしたくありません。私は今、どんな図書館も使いたくない、ただ勉強しているだけだ。
私はこれらの質問をしました:
は、イベントを登録するためにあらゆることをお勧めはありますか?オブジェクトコンストラクタを使用してイベントを登録する必要がありますか?
私のキャンバスオブジェクトにはツール(この場合は鉛筆)オブジェクトがあります。概念的にはそれは良くありません。私のキャンバスにはツールオブジェクトがありません。それは描画するサーフェスを提供する必要があります、それはそれです!しかし、コールバック(クリックイベント)としてそこにあります。どうすればこの問題を解決できますか?
すべてのツールは同じインターフェイスを持ちますが、動作は異なります。 Javascriptを使用してインターフェースを作成できますか?
その他に何が改善できるのですか?
UPDATE:私は(!私はあなたの助けに感謝、ありがとうございました)すべてのヒントに従ってきた
(function() {
var pencil = {
draw : function (event) {
var context = event.target.getContext('2d'),
coordinates = event.mouseCoordinates();
context.fillRect(coordinates.x, coordinates.y, 5, 5);
}
},
currentTool = pencil,
canvas = (function() {
var object = {};
object.element = document.getElementById('canvas');
object.element.addEventListener('click', function (event) {
currentTool.draw(event);
}, false);
return object;
}());
}());
。どう思いますか?今私は "グローバル" currentTool変数があります。あなたはそれについてどう思いますか?ありがとう。
ありがとうございます。
(1)イベントをバインドするには、 'addEventListener'を使用してください。 「オブジェクトコンストラクタを使用してイベントを登録する」とはどういう意味ですか? (2) 'Canvas'インスタンスのプロパティではなく、' Pencil'インスタンスを独立したオブジェクトとして定義するだけです。 (3)それは良い質問です。インターフェイスはJavaScriptの一部ではありませんが、それらをエミュレートする方法があるかもしれません... –
申し訳ありません、私は意味しました: "どこイベントにバインドする必要がありますか?"ありがとうございました。 – thom
あなたは正しいことをしています。 'Canvas'コンストラクタの中で、新しいCANVASオブジェクトを作成し、それにクリックハンドラをバインドします。それで大丈夫です。しかし、 'pencil.draw'に直接バインドするのではなく、' canvasClicked'ハンドラを持つことを考えてください。 'canvasClicked'ハンドラの中で、ユーザが何をしたかを設定し(複数の可能性がある場合)、異なる関数を呼び出すことができます... –