Проблема с вызовом this.
Не могу получить this объекта, на который навешан обработчик событий.
var CanvasControl = new Class(); CanvasControl.extend({ init: function (canvas_element) { this.canvas = canvas_element; this.canvas.onmousemove = this.myMove; console.log(this) //ВЫВОД № 1 } }); CanvasControl.include({ myMove: function (e) { this.xMouse = e.pageX this.yMouse = e.pageY console.log(this) //ВЫВОД № 2 } }); var can1 = new CanvasControl(document.getElementById("canvasA")); ВЫВОД № 1: _class {canvas: canvas#canvasA, ctx: CanvasRenderingContext2D, WIDTH: 1920, HEIGHT: 602, ClearStyle: function…} ВЫВОД № 2: <canvas id="canvasA" width="300" height="150"> Мне же нужно в myMove: function (e) получить ссылку на _class (т.е. тот же объект что в выводе №1) |
Упрощу задачу.
XXX.onmousemove = this.myMove; myMove: function (e) { console.log(this) // получу не свой объект XXX на который навешен onmousemove, а элемент html canvas } |
Вариант 1: this.myMove.bind(this) (ES5 браузеры только)
Вариант 2: замыкание, var that = this.. Вариант 3: addEventListener('mousemove', this). И добавить метод handleEvent(e), в котором делать switch (e.type) case 'mousemove': ... |
По handleEvent смотри пример: http://javascript.ru/forum/dom-windo...tml#post343069
|
Посмотрел пример, но не очень понял.
В примере: form.addEventListener('input', this);- //тут мы навесили обработчик прямо на форму, верно? не на объект js, а на сам объект DOM? Тут понятно - вроде описываем сам обработчик. handleEvent: function(event) { switch (event.type) { case 'input': this.validateInput(event.target); break; case 'submit': if (!this.validateInputs(this.form.elements)) event.preventDefault(); break; } Но я что-то так и не разобрался, где вызывается сам обработчик. |
Цитата:
Короче, метод addEventListener принимает вторым аргументом либо функцию, либо объект, имеющий метод handleEvent |
не врубаюсь все равно...
в моем случае даже замыкание не помогло, потому что я в принципе не могу обратиться к моему объекту, кроме как по ссылке this. т.е. допустим у меня 3 объекта XXX, соответственно есть переменная var a = [] Где-то внутри XXX: a.push(XXX) this.PoseInA = a.length-1 внутри MyMove(e) я не могу обратиться к this.PoseInA, а значит и к элементу XXX хранящемуся в "a" тоже( Пытаюсь разобраться c Listener но пока не догоняю. Что мне нужно сделать, можно по шагам расписать? 1. внутри моего объекта XXX: someFunction(canvas){ XXX=canvas XXX.addEventListener } или someFunction(canvas){ XXX=canvas canvas.addEventListener } след. шаги не понимаю совсем( |
Цитата:
Цитата:
Нет, ты как раз получишь ссылку на элемент, на который навешал обработчик. То есть на XXX. Врать не хорошо, тебя не учили разве? |
Так, во избежание недопониманий, вот что имеем:
var CanvasControl = new Class(); CanvasControl.extend({ init: function (canvas_element) { this.canvas = canvas_element; this.canvas.width = canvas_element.offsetWidth; this.canvas.height = canvas_element.offsetHeight; this.ctx = this.canvas.getContext("2d"); this.WIDTH = window.innerWidth; this.HEIGHT = window.innerHeight; this.canvas.onmousemove = this.myMove; console.log(this) //ВЫВОД 1 } }); CanvasControl.include({ /*ClearStyle: function () { this.ctx.strokeStyle = "rgba(0,0,0,1)"; this.ctx.fillStyle = "rgba(0,0,0,1)"; this.ctx.lineWidth = 1; }, RECT: function (x, y, w, h) { this.ctx.beginPath(); this.ctx.rect(x, y, w, h); this.ctx.fill(); this.ctx.stroke(); }, DrawText: function (s, x, y) { this.ctx.textBaseline = "middle"; this.ctx.textAlign = "center"; this.ctx.strokeText(s, x, y); }, draw: function () { this.RECT(0, 0, 100, 100); },*/ myMove: function (e) { console.log(this) //ВЫВОД 2 } }); var can1 = new CanvasControl(document.getElementById("canvasA")); Вывод 1: _class {canvas: canvas#canvasA, ctx: CanvasRenderingContext2D, WIDTH: 1920, HEIGHT: 602, ClearStyle: function…}HEIGHT: 602WIDTH: 1920canvas: canvas#canvasActx: CanvasRenderingContext2D__proto__: _class Вывод 2: <canvas id="canvasA" width="300" height="150"> testClass2.html:91 <canvas id="canvasA" width="300" height="150"> Вопрос - как обратиться к объекту из Вывод 1 внутри myMove |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 05:24. |