вопрос о this

berkut

Новичок
вопрос о this

копаюсь в недрах одной библиотеки, есть такой код
Код:
var My =
{
    check: function()
    {
    },
    
    init: function()
    {
        alert(this);
        this.check();
    }
}
каким образом и что нужно сделать с My, что-бы в My.init() - this ссылался не на init, а на объект My? Т.е. я пробую запустить так: My.init() - вылетает ошибка, на this.check();.
 

berkut

Новичок
нет, я просто протупил. My.init() работал. Ошибка была при window.onload = My.init;
Сейчас написал так: window.onload = function() { My.init.apply(My) }
оно как-бы работает

-~{}~ 08.02.08 19:07:

по теме, покритикуйте плиз мою штуку. Служит для того, что-бы регистрировать код для window.onload. Т.е. в нескольких файлах разбросаны onload, что-бы их все можно было исполнять.
Код:
var AddOnLoad =
{
	onLoad: [],
	
	add: function(func)
	{
		AddOnLoad.onLoad.push(func);
	},
	
	execute: function()
	{
		for (var i = 0; i < AddOnLoad.onLoad.length; ++i) {
			AddOnLoad.onLoad[i].apply(window);
		}
		AddOnLoad.onLoad = [];
	}
}

window.onload = AddOnLoad.execute;

// а использую так:
AddOnLoad.add( function() { alert('111'); } );
AddOnLoad.add( function() { alert('222'); } );
 

dimagolov

Новичок
berkut, я или туплю, или не доганяю зачем такое надо.
это что, код который AddOnLoad.add исполняется в <script> по ходу загрузки страницы чтобы установить какой-то особый обработчик onload? вернее чтобы по onload отработал не один обработчик а много разных? вообще если они в разных файлах и грузятся по <script src=>, то эти обработчики могут банально не успеть загрузиться до загрузки главной странички, если были заранее не закешированы. попробуй почистить кеш броузеоа и посмотреть что получиться.
 

Gas

может по одной?
чтобы по onload отработал не один обработчик а много разных?
похоже на то и действительно бывает нужно.

обработчики могут банально не успеть загрузиться
onload же отрабатывает когда все внешние ресурсы будут загружены.
 

berkut

Новичок
вернее чтобы по onload отработал не один обработчик а много разных?
ну типо да. но код - говно, я уже понял. надо юзать addEventListener, чтоб цеплятся на любые события, как в примере у dark-demon
 

dimagolov

Новичок
Да какая разница как цепляться на event-ы, особенно если речь о конкретном onload. Он, кстати, особенный во многих планах и основное его назначение информировать JS-приложение о том, что страница (картинка, фрейм) загрузились. и данная инфа интересна не сама по себе, а тем, что означает, что дерево DOM сформировано и можно начинать с ним работать не опасаясь косяков.
Вообще как я вижу для себя данную проблематику:
1. Есть некая страница которая грузит завизимости
2. Есть контроллер зависимостей, который содержит массив флагов о окончании загрузки зависимостей он инициализируется как "все плохо" в самом начале обработки главной страницы и ставит OkInterval= setInterval (isOkNow, 500);
3. Обработчики onload в зависимостях меняют "свой" флаг в контроллере.
4. ф-я isOkNow дергается каждые пол-секунды и смотрит на флаги. если все уже хорошо, то она прибивает OkInterval и пускает собственно приложение (ну или прячет транспарант "дождитесь окончания загрузки", это что нужно)

Теперь раскажи (может у меня просто лыжи не едут) зачем мне более одного обработчика именно onload? или onload был просто неудачным примером?
 

berkut

Новичок
Теперь раскажи (может у меня просто лыжи не едут) зачем мне более одного обработчика именно onload?
да тебе может и не надо, а у меня всё криво - мне надо.
есть несколько библиотек, которые должны стартовать по он-лоаду. на разных страницах - разное количество подключаемых библиотек.
 

Gas

может по одной?
dimagolov
Например, на странице несколько разных "js-контролов", которые генерятся/вставляются разными "модулями" и друг о друге понятия не имеют. Можно сделать на строне backend'а регистрацию их в каким-то scope, а потом при рендеринге всей страницы "выплюнуть" сразу, обернув в onload. А можно и так, как делает berkut.

Насчёт приведённой тобой схемы - зачем так сложно, если речь об onload?
 

dimagolov

Новичок
berkut, ну более-ли менее понял. но я бы делал это примерно так, как описал Gas (сделать на строне backend'а регистрацию их в каким-то scope, а потом при рендеринге всей страницы "выплюнуть" сразу, обернув в onload)

Gas, у меня приложение состоит из множества фреймов, каждый фрейм - отдельный модуль. Перед тем, как им начать взаимодействовать надо убедиться, что все уже загрузились. Более того, для разных типов юзеров грузиться разный набор модулей. А когда юзер делает logout, то модули прибиваются и при новом логине (он может быть с совсем другим набором модулей) грузяться по-новому.
Короче мои, специфические тараканы, во многом обусловленные выбранной до меня архитектурой. Кстати не скажу, что она такая уж порочная, учитывая то, что она реализут "тонкого клиента" стремясь приблизиться по интерактивности интерфейса именно к традиционным десктопным приложениям, то есть выглядить не как веб-страничка, а как скажем приложение, написанное на access-е.
 

berkut

Новичок
kruglov
это к чему?

-~{}~ 10.02.08 02:19:

dark-demon
вообщем-то повдуплял я код в блоге, но так и не врубился, как он может события ловить? что-такое node? вообщем-то совсем не понятно как его применять-то
 

dark-demon

d(^-^)b
node - это объект. произвольный яваскриптовый объект, которому можно добавлять свойства. например, window или document.
при вызове window.observe( 'load', callback_func ); регистрируется метод window.onload.
при window.observe( 'qwerty', callback_func ); будет window.onqwerty
этот метод является неким контейнером, который вмещает в себя произвольное количество обработчивков события, которые можно динамически добавлять и удалять посредством методов observe и unobserve.
 

berkut

Новичок
поясни плиз ламеру, получается, перед тем как вызывать
window.observe('load', callback_func);
нужно ведь сначала добавить
window.observe= function(event, func){.......}
и так для любого объекта, для которого я хочу использовать
obj.observe('load', callback_func); - правильно?
Либо юзать window.observe = node.observe; А нельзя-ли через prototype прицепить observe, unobserve вообще к всем объектам, что-бы избежать MyObj.observe = node.observe;

И самое главное, насколько я понимаю, в коде в блоге нет кода, который будет дёргать node['onload'].func(event)
Т.е. сами events никак не ловятся
 

dark-demon

d(^-^)b
> А нельзя-ли через prototype прицепить observe, unobserve вообще к всем объектам

можно :)


> нет кода, который будет дёргать node['onload'].func(event)

есть :) node[event]= function f( e ){...
а саму node[event] вызывает либо браузер либо наш скрипт.
 
Сверху