Получить прототип внутри обработчика событий - PullRequest
0 голосов
/ 04 июля 2011

Я пытаюсь получить прототип внутри обработчика событий.

function Post(){
    this.post;
    this.deleteButton;
}
Post.prototype.delete = function(){

    var OBJ = this;//this is not the prototype, instead it is the HTML element (deleteButton)
    $(OBJ.container).remove();
}
Post.prototype.createPost = function(){

    var OBJ = this;
    OBJ.post = document.createElement('div');
    OBJ.post.className = 'post'
    OBJ.deleteButton = document.createElement('div');
    OBJ.deleteButton.addEventListener('click', OBJ.delete, false);
}

Посмотрите на раздел комментариев выше. Обработчик удаления объявляется как метод-прототип Post. И я назначаю обработчик удаления кнопке удаления. Дело в том, что this становится элементом HTML вместо прототипа объекта.

РЕДАКТИРОВАТЬ:

Я тоже хочу иметь возможность удалить обработчик удаления

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

Вот так:

OBJ.deleteButton.addEventListener('click', function() {
    OBJ.delete();
}, false);

Но OBJ не является прототипом, это относится к экземпляру.

Обновление: Если вы хотите удалить еготоже храните ссылку на него:

this.deleteHandler_ = function() {
    OBJ.delete();
};
OBJ.deleteButton.addEventListener('click', this.deleteHandler_, false);

Где-то еще:

this.deleteButton.removeEventListener('click', this.deleteHandler_);
1 голос
/ 05 июля 2011

В jQuery вы можете использовать $. Proxy :

var onDelete = $.proxy(OBJ.delete, OBJ);
OBJ.deleteButton.addEventListener('click', onDelete, false);

Существует также ECMAScript 5 bind метод:

var onDelete = OBJ.delete.bind(OBJ);
OBJ.deleteButton.addEventListener('click', onDelete, false);

Дляудалить слушателя:

OBJ.deleteButton.removeEventListener('click', onDelete, false);
0 голосов
/ 05 июля 2011
Post.prototype.createPost = function(){

    var OBJ = this;
    OBJ.post = document.createElement('div');
    OBJ.post.className = 'post'
    OBJ.deleteButton = document.createElement('div');
    OBJ.deleteButton.addEventListener('click', function(){OBJ.delete();}, false);
}

Если вы используете jquery, вы можете использовать прокси-метод:

  OBJ.deleteButton.addEventListener('click',$.proxy(OBJ.delete,OBJ), false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...