Как предотвратить переход по плавающему меню по ссылкам ниже в IE

#javascript #css #html #css-float

#javascript #css #HTML #css-float

Вопрос:

Весь поиск, который я выполнил, приводит к вопросам, направленным на достижение обратного. В Firefox появляется мой слой div, содержащий меню, плавающий над другим содержимым при нажатии на другой элемент на странице. Содержимое под ним, такое как ссылки, недоступно для просмотра. Это поведение, которое я хочу, но оно не работает таким образом в Internet Explorer. В IE промежутки между ссылками в меню позволяют нажимать ссылки на содержимое под этим разделом. Также реклама Google, которая появляется под плавающим div, доступна для просмотра через div. Я хочу, чтобы div был сплошным и не допускал нажатия на любой контент под ним в IE, кто-нибудь может помочь с этим, пожалуйста?

Комментарии:

1. Я понял, что это поведение исчезает, когда в меню есть полосы прокрутки. Разрыв в 1 пиксель, который можно было бы щелкнуть между разделами, составляющими пункты меню, исчезает, и все объявление Google, по которому можно было щелкнуть по пробелу или без пробелов, больше не доступно для просмотра. Я добавил полосы прокрутки в IE, используя height:expression(this.scrollHeight > 199 ? "200px" : "auto" ); поскольку max-height работает не так, как должно в IE.

2. Содержимое является динамическим, когда некоторые из них удаляются, а полосы прокрутки исчезают, проблема возникает снова. Когда содержимое динамически помещается обратно и полосы прокрутки возвращаются, проблема исчезает.

Ответ №1:

распространение событий

например, это означает, что щелчок перемещает все элементы под курсором вглубь (захват) и обратно (пузырькование), вызывая реакции от многих элементов… распространенной ошибкой является думать о графическом отношении вместо отношения DOM parent-child (между элементами)

давайте поэкспериментируем:

 <div id="bottomDIV" 
onclick="rBot(event)" onMouseOver="this.style.background='olive'"
onMouseOut="this.style.background='#FF6'">bottomDIV
<div id="topDIV">topDIV</div></div>
</div>
  

итак, topDIV является первым дочерним элементом BottomDIV

добавьте некоторый стиль:

 <style>
#bottomDIV{ width:200px;height:200px; background:#FF6;}
#topDIV{
width:200px;height:200px;
position:relative;
background:rgba(0,255,255,.5);
top:80px;left:100px;}
</style>
  

добавить реакции на события:

   <script>
//add reaction for bottomDIV
bottomDIV=document.getElementById('bottomDIV')
rBot=function(e){evt=e||event;alert(evt.type   
            "n" ( evt.srcElement||evt.target).id  "n") ;//FF/IE
}


// add reactions on same event type for topDIV 
topDIV=document.getElementById('topDIV');
rTop=function(e){
        evt=e||event;
        if(evt.target)alert(evt.target.id); else alert(evt.srcElement.id)
        }

topDIV.addEventListener('click',rTop,false);
topDIV.addEventListener('mouseover',function(){this.style.background=
                                            'rgba(200,200,100,.7)'},false)
topDIV.addEventListener('mouseout',function(){this.style.background=
                                            'rgba(0,255,255,.5)'},false)
</script>
  

теперь обратите внимание на поведение в booth IE / FF для щелчка и наведения;

Даже под курсором нет графического перекрытия 2-х разделов — для выполнения реакций topDIV объекты событий следуют за отношением parentchild и при возврате запускают также нежелательные родительские реакции; Так что проблема в дочернем элементе 🙂

Решения:

1 остановите пузырящийся (обратный поток)

создайте функцию кроссбраузерной обработки, которая остановит распространение событий

 function SEP(evt){
                 try{evt.stopPropagation()}
                 catch(err){;evt.cancelBubble=true;}
      } //(IE/FF)
  

и перепишите все реакции topDIV, например:

 rTop=function(e){evt=e||event;SEP(evt);var elm=this;alert(elm.id);} 
  

2 — прервать связь родитель-потомок между 2 разделами
добавьте topDIV непосредственно в тело

 document.body.appendChild(topDIV);
  

и убедитесь, что вы сохраняете верхнюю

 topDIV.style.zIndex=1000; 
  

RU:) но не

Я думаю, что это хороший момент для уточнения .addEventListener(‘событие’, реакция, истина ), что означает, что событие срабатывает на этапе захвата

мы вернулись к решениям 1,2, поэтому у нас есть свободный поток событий parent-> child-> parent

как насчет нажатия topDIV (в любом месте), мы запускаем только реакцию bottomDIV?

 justBottomReation=function(e){evt=e||event;SEP(evt);elm=this;alert(elm.id)}
bottomDIV.addEventListener('click',justBottomReation, true)
  

таким образом, щелчок фиксируется родительским элементом, который отреагирует, и SEP() заблокирует распространение на дочерний элемент.

Ответ №2:

Если вы используете jQuery, вы могли бы использовать blockUI .

Комментарии:

1. Если бы вы могли создать небольшую демонстрацию в jsfiddle, людям было бы проще помогать вам.

Ответ №3:

Я, наконец, случайно обнаружил обходной путь, чтобы остановить IE, ведущий себя таким образом. Когда я добавил фиксированную ширину к div, содержащему меню, проблема с возможностью щелкнуть conent под div исчезла.