| Предотвращение всплывания события. Свойство cancelBubble
 
 
 
 Реакция на событие в отдельном элементе Так как в объектной модели объекты могут быть вложены друг в друга, то событие, происходящее в дочернем объекте, одновременно происходит и в родительском объекте. JavaScript предоставляет различные способы локализации влияния события на иерархию объектов. Простейшей способ локализации (пример 2.1) заключается в размещении сценария в теге, на который должно воздействовать событие. Пример 2.1.                                         | <HTML> |                       |  | <BODY> |                       |  | <P align=right ID='alfa' |                       |  | onMouseOver="document.all.alfa.align='center'" |                       |  | onMouseOut="this.align='left'"> |                       |  | События onMouseOver и onMouseOut </p> |                       |  | </body> |                       |  | </html> |  Выполнить пример 2.1 Страница в примере 2.1 состоит из одной строки, заключённой в контейнер <P> …</p>. В объектной модели страницы событие, происходящее с объектом P, происходит также и с родительским объектом BODY. Чтобы локализовать реакцию на событие только пределами строки, то есть объекта P, сценарий реакции на события помещен в тег <P >. В результате исполнения сценария изменяется положение текста на строке. Первоначально строка прижата к правому краю окна. При попадании на неё курсора она выравнивается по центру, а после снятия курсора прижимается к левому краю окна. Для обращения к объекту используется коллекция all, которая правильно воспринимается браузерами Internet Explorer 6.0 и Mozilla Firefox 2.0 . Ключевое слово this означает ссылку на текущий объект. Если при наступлении события нужно произвести много действий, то удобно сценарий написать в виде функции и поместить её отдельно от элемента в специально предназначенный для сценариев контейнер <SCRIPT> …</script>. В примере 2.2 каждое из событийonMouseOver и onMouseOut вызывает два действия: выравнивание и изменение цвета текста в строке. Пример 2.2 <HTML><P align=right ID='alfa' onMouseOver="M_Over()"
 onMouseOut="M_Out()">
 Событие onMouseOver</p>
 <SCRIPT>
 function M_Over()
 { document.all.alfa.align='center'
 document.all.alfa.style.color='FF00FF'
 }
 function M_Out()
 { document.all.alfa.align='left'
 document.all.alfa.style.color='0000FF'
 }
 </script>
 </html>
 Выполнить пример 2.2 Задача 2.1. Напишите HTML-документ, отображающийся в окне браузера в виде следующих четырёх строк:                    Пять событий с мышкойЩёлкните по мне мышкойНа этом тексте нажмите, подержите и отпустите левую кнопку мышкиМедленно проведите курсором мышки по этой надписи Первая строка – заголовок страницы. Вторая строка меняется при щелчке мышкой следующим образом:                    шрифт увеличивается до 48pt;цвет шрифта меняется на белый;цвет фона меняется на голубой. Повторный щелчок мышкой возвращает вторую строку к первоначальному виду. Фон третьей строки меняется, когда курсор мышки находится на ней и нажимается или отпускается левая кнопка мышки. При нажатии фон становится зелёным, а при отпускании – жёлтым. При попадании курсора мышки на четвёртую строку её фон становится красным, а при снятии – голубым. Фиксация события в родительском элементе Если реакцию на какое-либо событие требуют несколько элементов, расположенных на странице, то можно вызвать функцию для обработки этого события только в родительском элементе. В функции определяется, на каком элементе произошло событие, и выполняются соответствующие действия. Удобство такого подхода состоит в том, что весь алгоритм преобразований находится в одном месте, а недостаток – в сложности самой функции. Рассмотрим сценарий (пример 2.3), в котором для изменения свойств любого из трёх объектов, находящихся в окне браузера служит одна функция. 
 
 Пример 2.3 <HTML>
 <HEAD>
 <TITLE>Реакция на событие</TITLE>
 <STYLE>H1 {color:FF00FF} #k1{position:absolute; left:50;top:200;
 width:300; height:100;background-color:blue}
 #k2{position:relative;
 left:50;top:25; width:200; height:50;background-color:yellow}
 </STYLE></HEAD> <BODY ID="B" bgcolor="AAAAAA"
 onclick="rodEl()">
 <H1 ID="HH" >ЦВЕТ</H1> <DIV ID="k1" >
 <DIV ID="k2">
 </div>
 </div>
 </BODY>
 <SCRIPT> /*
 Функция запускается при щелчке мышкой по любой точке документа */
 function rodEl()
 { var e=window.event
 id1=e.srcElement.id
 switch(id1)
 { case "k1":
 //Изменение цвета внешнего прямоугольникаz=document.getElementById(id1).style.backgroundColor
 if(z!="red")z="red"
 else
 z="green" document.getElementById(id1).style.backgroundColor=z
 break
 case "k2": //Изменение цвета внутреннего прямоугольникаz=document.getElementById(id1).style.backgroundColor
 if(z!="#00ffff"){z="#00ffff"} else{z="FF00FF"}
 document.getElementById(id1).style.backgroundColor=z
 break
 case "B": //Изменение цвета заднего плана документаdocument.getElementById(id1).bgColor="777777"
 break
 case "HH": //Изменение цвета слова "Цвет"
 document.getElementById(id1).style.color= "AA00AA"
 }
 }
 </SCRIPT>
 </HTML>
 Выполнить пример 2.3 В примере 2.3 родительским по отношению к элементу H1 и двум элементам DIV является элемент BODY. Поэтому в теге <BODY> вызывается функция rodEl(), служащая для обработки события onclick. В момент наступления события вся информация о нём запоминается в объекте event, дочернем по отношению к объекту window. В примере используется свойство srcElement, хранящее в качестве значения объект на котором произошло событие. Поэтому выражениеsrcElement.Id читается так: Id объекта, на котором произошло событие. К сожалению, свойство srcElement имеется только в объектной модели, поддерживаемой браузером Internet Explorer, поэтому сценарий данного примера в других браузерах работать не будет. В сценарии сначала определяется Id элемента, по которому пользователь щёлкнул мышкой, а затем с помощью оператора Switch делается переход к изменению свойств указанного элемента. Цвет слова ЦВЕТ и фона документа меняется только один раз, а цвет прямоугольников – при каждом щелчке по ним мышкой. В примере 2.3 для того, чтобы хорошо была видна структура документа, громоздкие описания параметров вынесены в CSS. Задача 2.2. Создайте страницу с изображением и подписью под ним. При щелчке по подписи, она должна менять свой цвет. Щелчок по изображению должен вызывать замену изображения и подписи. Функция для обработки события должна вызываться из родительского по отношению к изображению и подписи объекта. Предотвращение всплывания события. Свойство cancelBubble В примере 2.3 рассматривалась простая страница с небольшим количеством элементов, но даже в таком простом случае функция реакции на событие получилась сложной. Проще для каждого элемента написать свою функцию обработки события, а распространение события вверх по дереву иерархической структуры от "детей" к "родителям" (в этом случае говорят о всплывании события) блокировать с помощь специально для этого предназначенного свойства cancelBubble объекта event. Изменим пример 2.3 так, чтобы для реакции на щелчок по каждому из четырёх элементов страницы служила своя функция: Пример 2.4 HTML><HEAD><TITLE>Реакция насобытие</TITLE>
 <STYLE>H1 {color:FF00FF} #k1{position:absolute;
 left:50;top:200; width:300; height:100;background-color:blue}
 #k2{position:relative; left:50;top:25; width:200;
 height:50;background-color:yellow}</STYLE></HEAD>
 <BODY ID="B" bgcolor= "AAAAAA" onclick="rodEl()">
 <H1 ID="HH"onclick="H_l()">
 ЦВЕТ</H1>
 <DIV ID="k1" onclick="D_l()">
 <DIV ID="k2" onclick="D_2()"></div>
 </div>
 </BODY>
 <SCRIPT>
 /* Функция запускается при щелчке мышкой по
 любой точке документа */
 function rodEl()
 { //Изменение цвета заднего плана документа
 z=document.all.B.bgColorif(z!="#777777"){z="#777777"}
 else{z="AAAAAA"}
 document.all.B.bgColor =z
 }function D_l()
 { //Изменение цвета внешнего прямоугольника
 z= document.all.k1.style.backgroundColorif(z!="red")z="red"
 else z="green"
 document.all.k1.style.backgroundColor=z
 }function D_2()
 { //Изменение цвета внутреннего прямоугольника
 z=document.all.k2.style.backgroundColorif(z!="#00ffff"){z="#00ffff"}
 else{z="FF00FF"}
 document.all.k2.style.backgroundColor=z
 }function H_l()
 { //Изменение цвета слова "Цвет"
 z=document.all.HH.style.colorif(z!="#aa00aa"){z="#aa00aa"}else{z="00FFFF"}
 document.all.HH.style.color= z
 }</SCRIPT>
 </HTML>
 Выполнить пример 2.4 Для лучшего проявления эффекта всплывания событий в пример 2.4 добавлено изменение фона всего документа и цвета надписи при каждом щелчке мышкой по ним. Скопируйте в свой каталог и просмотрите пример 2.4 в браузере Internet Explorer. Щёлкните по словуЦВЕТ. Изменится не только цвет слова, но и цвет фона документа, так как после щелчка сначала выполнится функция H_1(), а затем событие всплывёт к родительскому элементу BODY и выполнится функция rodE1(). При щелчке по внутреннему прямоугольнику будут меняться цвета обоих прямоугольников и фона документа. Щелчок по внешнему прямоугольнику изменит цвет этого прямоугольника и цвет фона документа. Задача 2.3. Чтобы предотвратить всплывание события в примере 2.4, вставьте в начало всех функций, кроме первой, оператор window.event.cancelBubble=true   
 
 
 
 |