Скрыть 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';
}
}
}
|
Franz,
как можно нажать на ок если кнопка в невидимом блоке |
Не понял.
Input, который является кнопкой, активен. Никаких скрывающих свойств не указано. |
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';
}
}
|
Спасибо за ответ.
Простите, моё изучение JS началось час назад и поэтому вопрос: это дополняющий код или заменяющий? Если заменяющий, то после его вставки #modal-bg перестал появляться. |
Franz,
строка 9 добавьте вашу кнопку в число запретных
if (target.id == 'mce-responses' || target.id == 'mc-embedded-subscribe') {
|
Всё работает, супер. Спасибо.
Теперь буду думать как всё это оптимизировать. |
Снова здравствуйте.
Выяснилось, что не такая реализация не работает под android. Окно открывается, но закрыть его уже не выходит. Какие могут быть причины? UPD: Как можно поменять скрипт так, чтобы modal-bg открывался только в случае открытия mce-success-response\error? Потому что сейчас может случиться так: пользователь промахнулся\случайно нажал на кнопку ОК - попап не вылез, а затенение появилось. |
Franz,
может там target = event.targetTouches[0] a "click"="touchstart" |
Пардон, но "там" это где?
А настройках браузера? Или где-то в скрипте? |
Franz,
править естественно скрипт -- чтоб он учитывал специфику android -- неподскажу http://javascript.ru/forum/mobile/ не моя стихия |
В любом случае, спасибо за направление :)
Цитата:
|
Franz,
так проверьте состояние перед показом
function show() {
if(document.getElementById('mce-success-response').offsetWidth || document.getElementById('mce-error-response').offsetWidth) document.getElementById('modal-bg').style.display = 'block';}
|
Спасибо.
Я понимаю логику, но сам язык ещё толком не знаю. Буду учиться. |
Странно, но теперь окно перестало появляться совсем.
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';
}
|
Franz,
делайте макет или сами проверьте данные 'block' или что иное offsetWidth или что ранее ваше окно откроется или клик сработает. |
О каком макете идёт речь?
|
Franz,
макет - код который можно запустить тут или http://learn.javascript.ru/play --минимальный чтоб можно было локализовать проблему а не гадать. а фон должен открываться не кнопкой а той функций что открывает окно |
К сожалению та функция, которая открывает окно недоступна. За неё отвечает mailchimp. Именно поэтому такие танцы с бубном.
Нет никаких хотя бы костыльных решений? :) UPD: Тут лежит JS файл, который отвечает за всю эту кухню: http://s3.amazonaws.com/downloads.ma...mc-validate.js Если сделать поиск по ID (mce-error-response/mce-success-response), то можно найти блок с их вызовом. Только я так ничего и не добился, изучая это :\ |
Franz,
ставить фон по таймеру - всё тоже offsetWidth или 'block' но с задержкой на время открытия окна |
Таймер реализовать средствами js?
|
Цитата:
добавьте $('#modal-bg').show() |
Franz,
mce_success_cb: function(resp){
$('#modal-bg').show();
$('#mce-success-response').hide();
|
Проблема как раз в том, что этот файл удалённый. Без возможности редактирования.
|
Цитата:
|
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 секунд. |
Franz,
где функция которая запустит таймер по клику |
Я так понял, что необходимо задержать функцию перед вызовом.
Я ориентировался на это http://learn.javascript.ru/settimeout-setinterval Разве я не прав? Где я ошибся? |
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';};
|
И это работает.
Спасибо вам. |
| Часовой пояс GMT +3, время: 14:01. |