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

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

рони 05.11.2014 20:56

Franz,
править естественно скрипт -- чтоб он учитывал специфику android -- неподскажу http://javascript.ru/forum/mobile/ не моя стихия

Franz 05.11.2014 20:57

В любом случае, спасибо за направление :)
Цитата:

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

А не подскажете вот по этому вопросу?

рони 05.11.2014 21:20

Franz,
так проверьте состояние перед показом
function show() {
if(document.getElementById('mce-success-response').offsetWidth || document.getElementById('mce-error-response').offsetWidth)  document.getElementById('modal-bg').style.display = 'block';}

Franz 05.11.2014 21:29

Спасибо.
Я понимаю логику, но сам язык ещё толком не знаю. Буду учиться.

Franz 05.11.2014 21:36

Странно, но теперь окно перестало появляться совсем.

UDP: такой вариант тоже не работает.
function show() {
  	  if(document.getElementById('mce-success-response').style.display == 'block' || document.getElementById('mce-error-response').style.display == 'block') 
          document.getElementById('modal-bg').style.display = 'block';
  	}

рони 05.11.2014 22:35

Franz,
делайте макет или сами проверьте данные 'block' или что иное offsetWidth или что ранее ваше окно откроется или клик сработает.

Franz 05.11.2014 23:12

О каком макете идёт речь?

рони 05.11.2014 23:24

Franz,
макет - код который можно запустить тут или http://learn.javascript.ru/play --минимальный чтоб можно было локализовать проблему а не гадать.

а фон должен открываться не кнопкой а той функций что открывает окно

Franz 06.11.2014 13:39

К сожалению та функция, которая открывает окно недоступна. За неё отвечает mailchimp. Именно поэтому такие танцы с бубном.
Нет никаких хотя бы костыльных решений? :)

UPD:
Тут лежит JS файл, который отвечает за всю эту кухню:
http://s3.amazonaws.com/downloads.ma...mc-validate.js

Если сделать поиск по ID (mce-error-response/mce-success-response), то можно найти блок с их вызовом.
Только я так ничего и не добился, изучая это :\

рони 06.11.2014 13:56

Franz,
ставить фон по таймеру - всё тоже offsetWidth или 'block' но с задержкой на время открытия окна

Franz 06.11.2014 13:58

Таймер реализовать средствами js?

рони 06.11.2014 14:02

Цитата:

Сообщение от Franz
Тут лежит JS файл, который отвечает за всю эту кухню:

строка 250
добавьте $('#modal-bg').show()

рони 06.11.2014 14:03

Franz,
mce_success_cb: function(resp){
$('#modal-bg').show();
		    $('#mce-success-response').hide();

Franz 06.11.2014 14:21

Проблема как раз в том, что этот файл удалённый. Без возможности редактирования.

рони 06.11.2014 14:42

Цитата:

Сообщение от Franz
Таймер реализовать средствами js?

да

Franz 06.11.2014 15:10

function show() {
if(document.getElementById('mce-success-response').offsetWidth || document.getElementById('mce-error-response').offsetWidth)  document.getElementById('modal-bg').style.display = 'block';}
setTimeout(show, 1000)


И даже так не работает. Задержку пробовал разную, вплоть до 10 секунд.

рони 06.11.2014 15:37

Franz,
где функция которая запустит таймер по клику

Franz 06.11.2014 19:10

Я так понял, что необходимо задержать функцию перед вызовом.
Я ориентировался на это http://learn.javascript.ru/settimeout-setinterval

Разве я не прав? Где я ошибся?

рони 06.11.2014 19:54

function show() { 

setTimeout(abc, 1000) 
} 


function abc() { if(document.getElementById('mce-success-response').offsetWidth || document.getElementById('mce-error-response').offsetWidth)  document.getElementById('modal-bg').style.display = 'block';};

Franz 06.11.2014 20:11

И это работает.
Спасибо вам.


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