Урок 13. Управление шрифтами в CSS
New Page 1
Web-программирование: «Java
Script(JS): Библиотека визуальных компонентов.
Класс контейнер. Продолжение».
Скачать
файлы с описанными классами можно здесь.
Так
же для углубленного изучения web-программирования
(язык PHP и написание своей собственной CMS)
советую подписаться на
платный раздел (см. анонсы раздела "Пишем
Easy CMS").
Сегодня
мы с вами разберем некоторые методы класса CXBrObjectsContainer,
разбор которого мы начали в предыдущем
выпуске. И так, метод глобального поиска
по имени:
function
CXBrObjectsContainer_global_get_by_name(name,self_container,search_in_owner,log)
{
if(log!=null) log._add("<b>Вошли в CXBrObjectsContainer_global_get_by_name "+this._id+" this._name="+this._name+" name="+name+"</b><br>");
if(this._name==name) {
return this;
}
for(var i=0; i<this._objects_list.length; i++) {
if(log!=null) log._add("Проходим цикл "+i+"<br>");
if(this._objects_list[i]._name==name)
return this._objects_list[i];
if(log!=null)
log._add("Прошли условие сравнения имен <br>");
if(this._objects_list[i]._is_child_or_self("CXBrObjectsContainer")) {
if(log!=null)
log._add("Вошли в ветку поиска в дочерних
объектах<br>");
if(log!=null) log._add("this._objects_list[i]._id="+this._objects_list[i]._id+"<br>");
if(log!=null) log._add("self_container._id="+self_container._id+"<br>");
if(this._objects_list[i]!=self_container) {
if(log!=null) log._add("Объект не равен сэлв контэйнеру<br>");
var ob=this._objects_list[i]._global_get_by_name(name,this._objects_list[i],false,log);
if(ob!=null) {
return
ob;
}
}
}
}
if(this._owner!=null) {
if(log!=null) log._add("Сейчас вызовем _owner._global_get_by_name у "+this._owner._id+"<br>");
if(search_in_owner) this._owner._global_get_by_name(name,this,true,log); else return null;
}
else
return
null;
} |
Как я
уже говорил в
на предыдущем уроке, этот класс производит
глобальный поиск по программному имени.
Ищет не только в текущем контейнере, но так
же в подчиненных контейнерах, контейнере
владельце и всех подчиненных ему
контейнеров до самого нижнего уровня.
Возвращает объект с данным именем в
контейнере. Если нет то null.
Как
де он работает? Сначала проверяет, а не является
ли он сам объектом с искомым именем:
if(this._name==name) {
return this;
} |
Если
нет, то наичнается цикл с перебором всех
объектов, содержащихся в данном контейнере:
for(var i=0; i<this._objects_list.length; i++) {
|
Как
только находит среди них объект с заданным
именем, возвращает его:
if(this._objects_list[i]._name==name)
return this._objects_list[i]; |
Но в
контейнере тоже могут содержаться
контейнеры, поэтому поиск производим и в
них:
if(this._objects_list[i]._is_child_or_self("CXBrObjectsContainer")) {
if(log!=null)
log._add("Вошли в ветку поиска в дочерних
объектах<br>");
if(log!=null) log._add("this._objects_list[i]._id="+this._objects_list[i]._id+"<br>");
if(log!=null) log._add("self_container._id="+self_container._id+"<br>");
if(this._objects_list[i]!=self_container) {
if(log!=null) log._add("Объект не равен сэлв контэйнеру<br>");
var ob=this._objects_list[i]._global_get_by_name(name,this._objects_list[i],false,log);
if(ob!=null) {
return
ob;
}
}
}
|
и при
том мы проверяем, что бы не искать второй
раз в самом себе, иначе бы мы зациклились в
бесконечном рекурсивном цикле, так как у починных
контейнеров мы так же запускаем global_get_by_name.
Почему возможно рекурсивное зацикливание и
для чего нужно услвоие
if(this._objects_list[i]!=self_container) |
мы
поймем, если посмотрим код дальше:
if(this._owner!=null) {
if(log!=null) log._add("Сейчас вызовем _owner._global_get_by_name у "+this._owner._id+"<br>");
if(search_in_owner) this._owner._global_get_by_name(name,this,true,log); else return null;
}
else
return
null;
|
тоесть,
мы вызываем global_get_by_name у родительского
контейнера. А что будет, если мы вызовем у
подчиненного контейнера метод global_get_by_name, а
тот в свою очередь вызовет его у
родительского, тоесть, у нас же? Правильно,
программа зависнет. Что бы этого не
случилось, мы и вводим условие, что бы не
искать повторно в самом себе.
Еще
стоило бы обратить внимание как устроен
метод send_message (послать сообщения):
function
CXBrObjectsContainer_send_message(msg,to_owner,source)
{
//Сперва
вызываем собственный обработчик. Если
он обработал сообщении - больше ничего
делать не надо
if(this._event_handler(msg)) return
true
//Теперь
обойдем все объекты, пока не закончиться
обработка
var l=this._objects_list.length
for(var i=0; i<l; i++) {
co=this._objects_list[i]
//Проверим еще, что бы сообщение не
послать самому себе
if(co._id==msg._source_id) continue;
//Проверим, что бы не послать
сообщение объекту, от которого оно
пришло,
//дабы
избежать многократного посыла
сообщения одному и тому же объекту
if(co==source) continue;
if(co._event_handler(msg))
return true
if(co._is_child_or_self("CXBrObjectsContainer")) {
if(co._send_message(msg,false)) return true
}
}
//
Если подчиненные объекты сообщение не
обработали, то передаем его владельцу
if((this._owner!=null)&&(to_owner))
return this._owner._send_message(msg,true,this); else return false
} |
расписывать
его не буду, так как все описано в комментах.
Остальные методы, тоже думаю, не стоит
подробно разбирать, так как они достаточно
простые. В будущих уроках мы разберем более интересные
классы, а так же я приведу ссылки на
скачивание онных. А на сегодня урок
закончен, до новых встреч.
|