Функция Javascript Prototype и SVG setAttribute (onclick) - PullRequest
0 голосов
/ 27 января 2011

Попытка использовать svg onClick для вызова функции-прототипа.

Обычно для вызова функции-прототипа я бы просто делал это (functionName), но когда я помещаю ее в .setAttribute(onclick, "this.(functionName)"), она не распознает функцию-прототип.У кого-нибудь был опыт в этом?

В случае, если вышеупомянутое не было ясно, вот основной смысл этого ...

function myobject(svgShape) {
    this.svgshape.setAttribute(onclick, 'this.doSomething()');
}
myobject.prototype.doSomething = function() {
    alert("works");
}

1 Ответ

3 голосов
/ 27 января 2011

Три вещи, которые могут помочь:

1) Во-первых, я думаю, что вам не хватает этой строки в верхней части вашей myobject функции:

this.svgshape = svgshape;

Япредполагая, что это была просто ошибка при отправке вопроса и вставили его ниже.

2) Обычно, когда вы используете Prototype (или любую современную библиотеку), вы не используете строки для обратных вызовов, вы используете Функция .Кроме того, вы обычно назначаете обработчики, используя оболочку библиотеки для addEventListener / attachEvent (observe, в случае с Prototype), а не со старым атрибутом DOM0.Итак:

function myobject(svgShape) {
    this.svgshape = svgshape;
    $(this.svgshape).observe('click', this.doSomething); // STILL WRONG, see below
}
myobject.prototype.doSomething = function() {
    alert("works");
}

3) Но в JavaScript нет методов (они на самом деле не нужны), он просто имеет функции, поэтому приведенное выше не гарантирует, что this ( контекст вызова) установлен правильно.С Prototype вы бы использовали bind для установки контекста:

function myobject(svgShape) {
    this.svgshape = svgshape;
    $(this.svgshape).observe('click', this.doSomething.bind(this));
}
myobject.prototype.doSomething = function() {
    alert("works");
}

(или вы можете использовать собственное закрытие для этого. Преимущество bind в том, чтозамыкание находится в очень хорошо контролируемой среде и поэтому не закрывается над вещами, которые вы не хотите хранить.)

Теперь я никогда не занимался программированием SVG с помощью Prototype, поэтому, если observeпо какой-то причине не работает, вы можете попытаться напрямую присвоить отраженное свойство onclick:

function myobject(svgShape) {
    this.svgshape = svgshape;
    this.svgshape.onclick = this.doSomething.bind(this);
}
myobject.prototype.doSomething = function() {
    alert("works");
}

Я все еще использую bind, поэтому this имеет правильное значение.

Эти посты из моего анемичного небольшого блога более подробно обсуждают вышеперечисленное:

...