Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Скрыть 2 div'a после клика вне первого. (https://javascript.ru/forum/dom-window/51273-skryt-2-div%27-posle-klika-vne-pervogo.html)

Franz 30.10.2014 22:05

Скрыть 2 div'a после клика вне первого.
 
Собственно, сабж.

Текущий код умеет:
При нажатии на кнопку ОК (#mc-embedded-subscribe) вылезает попап с одним из двух div'ов (#mce-error-response или #mce-success-response) (эта часть кода храниться на сервере, предоставляющем API).

Вместе с этими дивами вылезает блок, который затемняет весь background (#modal-bg).

При клике вне попапа он закрывается. Как сделать, чтобы вместе с ним закрывался и затемняющий background блок? И как можно красиво переписать существующий JS код?

Большое спасибо.

<div id="mce-responses">
              <div id="mce-error-response" style="display:none" ></div>
              <div id="mce-success-response" style="display:none"></div>
            </div> 
            <div id="modal-bg" style="display:none">
            <input type="submit" value="ОК" id="mc-embedded-subscribe" onClick="show();">



<script>
        function show(){
	document.getElementById('modal-bg').style.display = 'block';        
    }
        window.onload = function () {
        document.onclick = function (e) {
             e = e || window.event;
             if((e.target || e.srcElement).id != 'mce-success-response') {
                 document.getElementById('mce-success-response').style.display = 'none';
                 
             }
             if((e.target || e.srcElement).id != 'mce-error-response') {
                 document.getElementById('mce-error-response').style.display = 'none';
                 
             }
        }
    }

рони 30.10.2014 22:29

Franz,
как можно нажать на ок если кнопка в невидимом блоке

Franz 30.10.2014 22:37

Не понял.
Input, который является кнопкой, активен. Никаких скрывающих свойств не указано.

рони 30.10.2014 22:52

Franz, классика делегирования
function show() {
  	  document.getElementById('modal-bg').style.display = 'block';
  	}
  	window.onload = function () {
  	  document.onclick = function (e) {
  	    e = e || window.event;
  	    var target = event.target || event.srcElement;
  	    while(target != this) {
  	      if (target.id == 'mce-responses') {
  	        return
  	      }
  	      target = target.parentNode;
  	    }
  	    document.getElementById('mce-success-response').style.display = 'none';
  	    document.getElementById('mce-error-response').style.display = 'none';
  	    document.getElementById('modal-bg').style.display = 'none';
  	  }
  	}

Franz 30.10.2014 22:59

Спасибо за ответ.

Простите, моё изучение JS началось час назад и поэтому вопрос:
это дополняющий код или заменяющий?

Если заменяющий, то после его вставки #modal-bg перестал появляться.

рони 30.10.2014 23:21

Franz,
строка 9 добавьте вашу кнопку в число запретных
if (target.id == 'mce-responses' || target.id == 'mc-embedded-subscribe') {

Franz 30.10.2014 23:23

Всё работает, супер. Спасибо.

Теперь буду думать как всё это оптимизировать.

Franz 05.11.2014 19:53

Снова здравствуйте.
Выяснилось, что не такая реализация не работает под android. Окно открывается, но закрыть его уже не выходит. Какие могут быть причины?

UPD: Как можно поменять скрипт так, чтобы modal-bg открывался только в случае открытия mce-success-response\error?
Потому что сейчас может случиться так: пользователь промахнулся\случайно нажал на кнопку ОК - попап не вылез, а затенение появилось.

рони 05.11.2014 20:36

Franz,
может там
target = event.targetTouches[0]
a "click"="touchstart"

Franz 05.11.2014 20:48

Пардон, но "там" это где?
А настройках браузера? Или где-то в скрипте?


Часовой пояс GMT +3, время: 01:29.