Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Событие на document (https://javascript.ru/forum/misc/52423-sobytie-na-document.html)

TheHappy 18.12.2014 17:26

Событие на document
 
Вложений: 1
Здравствуйте.

Имеется некий класс с несколькими методами. + Довольно стандартные строки навешивания события на элемент.

Код JS.

function Widjet() {
    this.id = null;
    this.jqlink = null;
    this.type = null;
    this.add = function () {
    };
    this.remove = function () {
    };
    this.copy = function () {
    };
    this.lock = function () {
    };
    this.unlock = function () {
    };
    this.edit = function () {
    };
    this.activate = function () {
        $(document).on('click', function () {
            console.log('123');
        });
    };
    this.deactivate = function () {
    };
    this.hovered = function () {
    };
    this.dehovered = function () {
    };
    this.getSerialize = function () {
    };
    this.load = function () {
    };
}
var widjet = new Widjet();
$(document).ready(function () {
    $('#button').click(function () {
        widjet.activate();
    });
});


Описание:
При клике на элемент #button, вызывается метод activate, внутри которого вешается событие на document. При последующих кликах на document в консоль должно выводиться 123.

Проблема:
При первом клике на #button в консоль сразу выводится 123, но по логике не должно, т.к. событие на document еще не висит. В чем может быть проблема?

danik.js 18.12.2014 17:38

Цитата:

Сообщение от TheHappy
по логике не должно, т.к. событие на document еще не висит. В чем может быть проблема?

Событие click - "всплывающее". Оно проходит последовательно вверх по всем предкам элемента, достигая document и window. Таким образом когда событие обрабатывается самим элементом ты навешиваешь обработчик на document, затем событие всплывает постепенно до document и обрабатывает тот самый обработчик.

Остановить всплытие можно через event.stopPropagation()

danik.js 18.12.2014 17:39

Цитата:

Сообщение от TheHappy
с несколькими методами

Методы лучше в прототип вынести. А если widget будет всего в одном экземпляре, то тебе и конструктор не нужен, и прототип тоже - сразу создавай объект с нужными свойствами/методами. Хотя это на любителя.

TheHappy 18.12.2014 17:56

Цитата:

Сообщение от danik.js (Сообщение 347089)
Методы лучше в прототип вынести. А если widget будет всего в одном экземпляре, то тебе и конструктор не нужен, и прототип тоже - сразу создавай объект с нужными свойствами/методами. Хотя это на любителя.

Виджет будет в одном экземляре, как супер объект. От него уже будут наследоваться остальные классы, методы в которых будут "перебиваться". Объектов остальных классов будет несколько.

var widjet = new Widjet();//супер объект
Headline.prototype = widjet;//наследование заголовка от виджета


P.S. Вообще, это мой первый проект завязанный на JS, обычно хватает jQuery за глаза. Поэтому прошу особо не ругать за кривизну кода :)

krutoy 18.12.2014 18:09

Цитата:

Сообщение от danik.js
Событие click - "всплывающее". Оно проходит последовательно вверх по всем предкам элемента, достигая document и window. Таким образом когда событие обрабатывается самим элементом ты навешиваешь обработчик на document, затем событие всплывает постепенно до document и обрабатывает тот самый обработчик.

Не логично. когда он кликает по баттон, событие на документ еще не повешено. Это косяк компилятора скорей всего.

TheHappy 18.12.2014 18:15

Цитата:

Сообщение от krutoy (Сообщение 347098)
Не логично. когда он кликает по баттон, событие на документ еще не повешено. Это косяк компилятора скорей всего.

И потом, с чего ты взял, что button наследует от документ?

Я тоже думаю, что не логично, т.к. действительно событие на document еще не висит. Тем не менее остановил всплывание при помощи e.stopPropagation();

e.stopPropagation();
        $(document).on('click', function (e) {
            console.log('123');
        });


Помогло.

По поводу наследования button от document:

danik.js имел в виду несколько другое. При клике на button событие поднимается до document. Т.е. проходит по всем родительским элементам, насколько я понял.

krutoy 18.12.2014 18:16

Цитата:

Сообщение от TheHappy
Виджет будет в одном экземляре, как супер объект

Тогда нах*я ты городишь класс для него?

krutoy 18.12.2014 18:18

Цитата:

Сообщение от TheHappy
событие поднимается до documen

Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.

TheHappy 18.12.2014 18:22

Цитата:

Сообщение от krutoy (Сообщение 347100)
Тогда нах*я ты городишь класс для него?

Наследоваться остальные классы от чего будут?
Есть класс виджет - у него есть методы(пример: добавить, удалить, изменить, заблокировать и т.д.)

Есть классы наследники - параграф и заголовок. У классов наследников изменяются только методы добавления и изменения, остальное поведение остается прежним.

В чем моя ошибка?

TheHappy 18.12.2014 18:23

Цитата:

Сообщение от krutoy (Сообщение 347101)
Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.

Я понимаю, и как писал ВЫШЕ, считаю, что в консоль(при первом проходе) выводиться ничего не должно.


Часовой пояс GMT +3, время: 20:42.