fancybox before Закрыть вопрос
У меня есть форма, реализованная в iframe fancybox (версия 2.1.5). Люди могут выбрать не заполнять форму и нажать "X", чтобы закрыть форму fancybox, или поочередно заполнить форму и нажать "Зарегистрироваться".
у меня есть beforeClose
Настройка обратного вызова, чтобы установить куки и сделать некоторую работу. Но я хочу, чтобы это срабатывало только в том случае, если кто-то нажимает "X" или клавишу Esc. Смотрите код ниже
$.fancybox.open({
type: "iframe",
href: "/[url].php",
autoSize: true,
height: "auto",
margin: 0,
padding: 0,
autoCenter: true,
maxWidth: 460,
maxHeight: 615,
modal: false,
iframe: {
scrolling: "no"
},
beforeClose: function () {
//set cookie code
},
});
Но если кто-то должен был зарегистрироваться, он будет отображать сообщение с благодарностью в течение 2 секунд и закроет fancybox. Это делается с помощью window.parent.$.fancybox.close();
Смотрите подробный код ниже
$.post('/register.php', post_vars, function(data) {
window.parent.$.fancybox.close();
});
Однако я не хочу beforeClose
событие, которое будет вызвано в случае, если я закрою его из iFrame или даже если он будет вызван, мне нужно каким-то образом знать, что это было сделано из iframe и не использовать кнопку "X".
Есть ли способ дифференцировать это?
2 ответа
Я могу придумать разные способы сделать это, например привязать пользовательские события к кнопке закрытия fancybox или перехватить клавишу escape с помощью keyup
или же keypress
, так далее.
Я предполагаю, что самый простой способ - создать на родительской странице пользовательскую функцию закрытия, например:
var closedFromIframe = false;
function customClose() {
closedFromIframe = true;
jQuery.fancybox.close();
}
Эта функция закроет fancybox (от самой родительской страницы) при вызове со страницы iframed И включит (ранее определенный) closedFromIframe
флаг, так что вместо этого:
$.post('/register.php', post_vars, function(data) {
window.parent.$.fancybox.close();
});
... ты мог бы сделать
$.post('/register.php', post_vars, function(data) {
window.parent.customClose();
});
Затем в вашем сценарии fancybox вы можете проверить в beforeClose
обратный вызов, статус closedFromIframe
отметьте и сделайте все, что вам нужно:
$.fancybox.open({
// your API options
beforeClose : function () {
if (closedFromIframe) {
// closed from iframe custom function
} else {
// close button -or- escape key
}
},
afterClose : function () {
closedFromIframe = false; // reset flag
}
});
Обратите внимание, мы также сбрасываем closedFromIframe
флаг в пределах afterClose
Перезвоните.
Смотрите демонстрацию этой реализации.
Это будет срабатывать, только если кто-то нажмет "X" или клавишу Esc
$(document).ready(function () {
$(".fancybox").fancybox({
closeClick: false, // prevents closing when clicking INSIDE fancybox
openEffect: 'none',
closeEffect: 'none',
enableEscapeButton: false,
helpers: {
overlay: {
closeClick: false // prevents closing when clicking OUTSIDE fancybox
}
},
beforeClose: function () {
return confirm('Are you sure?')
}
})
});