18.12.2014, 17:26
|
Новичок на форуме
|
|
Регистрация: 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 еще не висит. В чем может быть проблема?
|
|
18.12.2014, 17:38
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от TheHappy
|
по логике не должно, т.к. событие на document еще не висит. В чем может быть проблема?
|
Событие click - "всплывающее". Оно проходит последовательно вверх по всем предкам элемента, достигая document и window. Таким образом когда событие обрабатывается самим элементом ты навешиваешь обработчик на document, затем событие всплывает постепенно до document и обрабатывает тот самый обработчик.
Остановить всплытие можно через event.stopPropagation()
__________________
В личку только с интересными предложениями
|
|
18.12.2014, 17:39
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от TheHappy
|
с несколькими методами
|
Методы лучше в прототип вынести. А если widget будет всего в одном экземпляре, то тебе и конструктор не нужен, и прототип тоже - сразу создавай объект с нужными свойствами/методами. Хотя это на любителя.
__________________
В личку только с интересными предложениями
|
|
18.12.2014, 17:56
|
Новичок на форуме
|
|
Регистрация: 05.03.2012
Сообщений: 6
|
|
Сообщение от danik.js
|
Методы лучше в прототип вынести. А если widget будет всего в одном экземпляре, то тебе и конструктор не нужен, и прототип тоже - сразу создавай объект с нужными свойствами/методами. Хотя это на любителя.
|
Виджет будет в одном экземляре, как супер объект. От него уже будут наследоваться остальные классы, методы в которых будут "перебиваться". Объектов остальных классов будет несколько.
var widjet = new Widjet();//супер объект
Headline.prototype = widjet;//наследование заголовка от виджета
P.S. Вообще, это мой первый проект завязанный на JS, обычно хватает jQuery за глаза. Поэтому прошу особо не ругать за кривизну кода
|
|
18.12.2014, 18:09
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от danik.js
|
Событие click - "всплывающее". Оно проходит последовательно вверх по всем предкам элемента, достигая document и window. Таким образом когда событие обрабатывается самим элементом ты навешиваешь обработчик на document, затем событие всплывает постепенно до document и обрабатывает тот самый обработчик.
|
Не логично. когда он кликает по баттон, событие на документ еще не повешено. Это косяк компилятора скорей всего.
Последний раз редактировалось krutoy, 18.12.2014 в 18:15.
|
|
18.12.2014, 18:15
|
Новичок на форуме
|
|
Регистрация: 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. Т.е. проходит по всем родительским элементам, насколько я понял.
|
|
18.12.2014, 18:16
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от TheHappy
|
Виджет будет в одном экземляре, как супер объект
|
Тогда нах*я ты городишь класс для него?
|
|
18.12.2014, 18:18
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от TheHappy
|
событие поднимается до documen
|
Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.
|
|
18.12.2014, 18:22
|
Новичок на форуме
|
|
Регистрация: 05.03.2012
Сообщений: 6
|
|
Сообщение от krutoy
|
Тогда нах*я ты городишь класс для него?
|
Наследоваться остальные классы от чего будут?
Есть класс виджет - у него есть методы(пример: добавить, удалить, изменить, заблокировать и т.д.)
Есть классы наследники - параграф и заголовок. У классов наследников изменяются только методы добавления и изменения, остальное поведение остается прежним.
В чем моя ошибка?
|
|
18.12.2014, 18:23
|
Новичок на форуме
|
|
Регистрация: 05.03.2012
Сообщений: 6
|
|
Сообщение от krutoy
|
Допустим, оно проходит до документ, но на документ в этот момент (первого прохода), событие ЕЩЕ НЕ ВИСИТ.
|
Я понимаю, и как писал ВЫШЕ, считаю, что в консоль(при первом проходе) выводиться ничего не должно.
|
|
|
|