Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2014, 17:26
Новичок на форуме
Отправить личное сообщение для TheHappy Посмотреть профиль Найти все сообщения от TheHappy
 
Регистрация: 05.03.2012
Сообщений: 6

Событие на document
Здравствуйте.

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

Код 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 еще не висит. В чем может быть проблема?
Вложения:
Тип файла: zip test.zip (33.2 Кб, 1 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 18.12.2014, 17:38
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

Остановить всплытие можно через event.stopPropagation()
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 18.12.2014, 17:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от TheHappy
с несколькими методами
Методы лучше в прототип вынести. А если widget будет всего в одном экземпляре, то тебе и конструктор не нужен, и прототип тоже - сразу создавай объект с нужными свойствами/методами. Хотя это на любителя.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 18.12.2014, 17:56
Новичок на форуме
Отправить личное сообщение для TheHappy Посмотреть профиль Найти все сообщения от TheHappy
 
Регистрация: 05.03.2012
Сообщений: 6

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

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


P.S. Вообще, это мой первый проект завязанный на JS, обычно хватает jQuery за глаза. Поэтому прошу особо не ругать за кривизну кода
Ответить с цитированием
  #5 (permalink)  
Старый 18.12.2014, 18:09
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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

Последний раз редактировалось krutoy, 18.12.2014 в 18:15.
Ответить с цитированием
  #6 (permalink)  
Старый 18.12.2014, 18:15
Новичок на форуме
Отправить личное сообщение для TheHappy Посмотреть профиль Найти все сообщения от TheHappy
 
Регистрация: 05.03.2012
Сообщений: 6

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

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

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


Помогло.

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

danik.js имел в виду несколько другое. При клике на button событие поднимается до document. Т.е. проходит по всем родительским элементам, насколько я понял.
Ответить с цитированием
  #7 (permalink)  
Старый 18.12.2014, 18:16
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от TheHappy
Виджет будет в одном экземляре, как супер объект
Тогда нах*я ты городишь класс для него?
Ответить с цитированием
  #8 (permalink)  
Старый 18.12.2014, 18:18
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от TheHappy
событие поднимается до documen
Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.
Ответить с цитированием
  #9 (permalink)  
Старый 18.12.2014, 18:22
Новичок на форуме
Отправить личное сообщение для TheHappy Посмотреть профиль Найти все сообщения от TheHappy
 
Регистрация: 05.03.2012
Сообщений: 6

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

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

В чем моя ошибка?
Ответить с цитированием
  #10 (permalink)  
Старый 18.12.2014, 18:23
Новичок на форуме
Отправить личное сообщение для TheHappy Посмотреть профиль Найти все сообщения от TheHappy
 
Регистрация: 05.03.2012
Сообщений: 6

Сообщение от krutoy Посмотреть сообщение
Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.
Я понимаю, и как писал ВЫШЕ, считаю, что в консоль(при первом проходе) выводиться ничего не должно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие на input radio redwert Элементы интерфейса 3 23.09.2014 09:45
Событие click Гробовщик jQuery 1 31.07.2013 07:28
Как добавить событие на document в Iframe ? Deff Events/DOM/Window 23 14.07.2012 21:40
Как правильно подавить событие при подключении своего обработчика? Маэстро Firefox/Mozilla 2 03.09.2011 11:46
document.documentElement и document meryfelow Events/DOM/Window 6 27.10.2010 15:24