Pull to refresh

Comments 25

UFO just landed and posted this here
очень интересная тема. подобный метод был представлен на ClientSide 2007 года Андреем Суминым (разработчиком из hh.ru) - там он показал класс для регистрации событий от независимых подгружаемых модулей на примере созданной им библиотеки (доступна на jsx.ru)
Спасибо за ссылку. Информационное пространство одно на всех, тяжело вносить что-то новое :)
Интересная реализация :)

А скажите пожалуйста, здесь ведь не используется никакой фреймворк?
Разве конструкция вида $('a1') есть в чистом javascript? (Это мне для личного развития)
Конечно ее нет :)
Утрированному примеру — утрированная функция:
function $(id) { return document.getElementById(id) }
Хорошая реализация есть у товарища: http://sunjs.blogspot.com/2008/04/getele…
я, наверное, не проснулся...

правильно ли я понимаю, что надо добавить обработчик события к элементу a1?

если да, то почему не сделать так:

function _addevent(el, event, fn, scope) {
 var h = function(e) {
  fn.call(scope, e);
 }
 el.attachEvent("on" + event, h);
}

но, все-же есть вероятность, что я чего-то недопонял, так что заранее звиняйте. если не сложно, объясните :)
А если событие не стандартное? onclick всего лишь пример
Давайте наоборот попробуем. При срабатывании Core.another2 надо вызвать a1.onclick :)
а... вот вы к чему... теперь понял. сорри.
попробую подумать, как это сделать по-другому. eval, конечно, не люблю.
кстати, это все-же не совсем Observer, по крайней мере не классический вариант.
можно про это тут посмотреть http://ru.wikipedia.org/wiki/Observer_(%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
за статью все равно спасибо!
к сожалению вариант без eval я не нашел, если найдете — буду благодарен за идею
да, это не классический паттерн Observer, его назвать можно как угодно, главное — релизованная задача
Я конечно все понимаю, но зачем тут eval? eval это зло и, по всей видимости, (код изучил поверхностно) все более красиво реализуется без него. И сдается что Вы весьма плохо владеете js. То что вы описали, есть в любой библиотеке/фреймворке. Что-то вроде этого:
Event.addHandler(element, 'click', Core.another);
Только это называется добавить обработчик события, связи как не было так и нет (мы просто регистрируем свой обработчик).
Прочитайте внимательно задачу. Изучите код не поверхностно.
Да я понял задачу. Тогда вам и надо было "связывать" не элементы, а именно объекты js. Вы понамешали все в одну кучу, вот и сообразить толком сложно что Вы имели ввиду.
По сути
1. Вы не связываете объекты, а делаете вызов функции когда вызывается другая функция.
2. Нарушаете свое же требование "Менять исходный код объектов нельзя.". Или что Вы имели ввиду? Нельзя менять свойства (методы)? Так вы же переопределяете свойство (метод) - когда связываете.
Почитайте комментарии ниже.
Вот решение вашей задачи

var Observer = {
attach: function(object, methodName, relatedObject, relatedMethod){
if (!object[methodName].observerItems)
{
var newMethod = function(){
newMethod.savedMethod.apply(object, arguments);
for (var i = 0; i < newMethod.observerItems.length; i++)
{
var item = newMethod.observerItems[i];
item.relatedObject[item.relatedMethod].apply(item.relatedObject, arguments);
}
};
newMethod.observerItems = [];
newMethod.savedMethod = object[methodName];
object[methodName] = newMethod;
}
object[methodName].observerItems.push({ relatedObject: relatedObject, relatedMethod: relatedMethod });
},
detach: function(object, methodName, relatedObject, relatedMethod){
if (object[methodName].observerItems)
{
var items = object[methodName].observerItems;
for (var i = 0, k = 0; i < items.length; i++)
{
var item = items[i];
if (item.relatedObject != relatedObject || item.relatedMethod != relatedMethod)
items[k++] = items[i];
}
items.length = k;
if (items.length == 0)
object[methodName] = object[methodName].savedMethod;
}
}
};

Заметьте без eval. Особо не тестировал, но вроде работает как надо. Все параметры переданые первому методу, попадают в привязаный метод (а не так как у вас 6 штук).
ЗЫ Но имхо, сама идея никуда не годится. Хотя может конечно вам это и нужно, если у вас песочница, как вы написали ниже (js загружается с разных серверов и разрабатывается разными людьми, влиять на js нельзя). В общем жуть :)
Согласен. Красиво. Спасибо.
хоть один адекватный человек :)
тут все же дело не в обработчике события, а в том, чтобы настроить обмен сообщениями между объектами, которые не были изначально предназначены для этого.
пока практический смысл для меня ускользает (я бы использовал стандартный Observer (с интерфейсом Observable)). но, мало ли что может пригодиться.
сам автор поделиться мыслями, когда такая задача возникла?
Да я понял. Но это, ИМХО, не нормально и афигительный источник ошибок :)
Источник ошибок — пользователь (разработчик), а не инструмент
большой проект. много объектов как в доме так и в js. js загружается с разных серверов и разрабатывается разными людьми, влиять на js нельзя. необходимо очень быстро реализовать взаимодействие 2х разных объектов.
не, это не самый хороший способ. на самом деле, будут ошибки.
пока мой вариант применения - профайлинг или логирование (но только для времени разработки).
Смотрите комментарий выше :)
тут все же дело не в обработчике события, а в том, чтобы настроить обмен сообщениями между объектами, которые не были изначально предназначены для этого.
пока практический смысл для меня ускользает (я бы использовал стандартный Observer (с интерфейсом Observable)). но, мало ли что может пригодиться.
сам автор поделится мыслями, когда такая задача возникла?
Sign up to leave a comment.

Articles