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?')
            }
        })
    });
Другие вопросы по тегам