#javascript #object #canvas #dom-events
#javascript #объект #холст #dom-события
Вопрос:
У меня есть часть программного обеспечения js, которая структурирована следующим образом:
obj = new object[id]();
function wrapperFunction (e) {
var pos = findPos(this);
e._x = e.pageX - pos.x;
e._y = e.pageY - pos.y;
var func = obj[e.type];
if (func) {
func(e);
}
}
__
obj.line = function () {
this.started = false;
this.mousedown = function (e) {
}
this.mousemove = function (e) {
if (this.started) {
}
}
this.mouseup = function (e) {
if (this.started) {
}
}
}
Приведенный выше блок кода дублируется для нескольких фигур, поэтому существует также obj.square obj.circle
и т.д…
У меня также есть объект shape, который выглядит следующим образом.
function Shape (type, color, height, width, radius, x, y) {
this.type = type;
this.color = color;
this.h = height;
this.w = width;
this.r = radius;
this.points = ["x","y"];
this.points["x"] = [x];
this.points["y"] = [y];
};
Я хотел бы инициировать объект shape на mousedown
для каждого объекта obj.* и заполнить объект shape информацией о propper.
Теперь о проблеме.
radius
Вычисляется для каждого mousemove
так же, как height
и width
, но когда я добавляю shapes = new Shape(circle, black, 10, 10, null, e._x, e._y)
к mousemove
, это выглядит так…
this.mousemove = function (e) {
if (this.started) {
shapes = new Shape(circle, black, 10, 10, null, e._x, e._y);
}
}
Объект shape не создается.
Если я создаю объект shape внутри функции-оболочки вместо mousemove
, то объект инициируется, но я не могу использовать radius
or height/width
. Как я могу создать объект внутри другого объекта внутри функции-оболочки, чтобы я мог использовать вычисляемые термины внутри созданного объекта? Есть ли альтернативный маршрут, помимо того, что я делаю?
Комментарии:
1. Где код, который вызывает вышеупомянутое?
2. Используете ли вы какую-либо библиотеку JavaScript?
obj = new object[this.id]();
недопустимый ванильный JS — и в любом случае просто шаткий.3. @Mattyeah Я использую jQuery Извините, если я слишком сильно трансировал свой код, я не хотел вставлять все. Я подумал, что это будет больно читать. this.id создается ли переменная в другом месте, предположим, что она соответствует линии, кругу, квадрату.
4. @Box9 что? Код, который вызывает функцию-оболочку, представляет собой jQuery при загрузке страницы.
5. Я имею в виду, что такое
obj.line
? Как он создается? Как запускаетсяmousemove
событие, потому что я не вижу, чтобы оно было привязано к каким-либо событиям DOM? Здесь действительно недостаточно информации, которая могла бы помочь.
Ответ №1:
Помимо шаткости в obj = new object[this.id]();
строке, я думаю, что вам просто не хватает this
ключевого слова:
this.mousemove = function (e) {
if (this.started) {
this.shapes = new Shape(circle, black, 10, 10, null, e._x, e._y);
}
}
Редактировать только что заметил больше шаткости в вашем коде (да, это технический термин :). Я думаю, вы хотите изменить эти строки в конструкторе:
this.points = ["x","y"]; // creates an array, which is indexed by numbers
this.points["x"] = [x]; // tacks on some ad-hoc properties to the array, which
this.points["y"] = [y]; // doesn't really make sense
к этому:
this.points = {x: x, // I think this is what you actually mean to do.
y: y};
Комментарии:
1. Только что попробовал, и это не сработало, также после вашего редактирования. Объект по-прежнему не создается, когда у меня есть
mousedown
событие2. Хорошо, я действительно не понимаю, что вы пытаетесь сделать, и как код, который вы нам показали, вписывается в общую картину. Я удалю этот ответ немного позже, но не могли бы вы показать нам демонстрацию (например, jsfiddle кода, который работает, и один из кодов, который не работает?
3. Благодаря тому, что вы добавили, и тому, что я начал добавлять материал в jquery, я получил ответ. Спасибо
4. Не могли бы вы отредактировать свой вопрос или опубликовать свой собственный ответ, чтобы показать нам, как вы устранили проблему?