Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Web-программирование - это просто!


Новое на сайте Программирование - это просто! (www.easyprog.ru):

В платном разделе

В бесплатном разделе

Добрый день, уважаемые подписчики!

Тема сегодняшнего выпуска: «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

}

 

расписывать его не буду, так как все описано в комментах. Остальные методы, тоже думаю, не стоит подробно разбирать, так как они достаточно простые. В будущих уроках мы разберем более интересные классы, а так же я приведу ссылки на скачивание онных. А на сегодня урок закончен, до новых встреч.

 

 

С уважением, Шуравин Александр, e-mail: megabax@rambler.ru, автор оставляет за собой право публиковать в рассылках ваши письма, если в письме прямо неоговорено нежелание его публиковать.

 


В избранное