@unfapable

Как сделать чтобы модальное окно загружалось динамически?

У меня на сайте много модальных окон с формами, сейчас они просто вставлены в html-код, и из-за этого исходный код страницы выглядит большим и длинным. Существуют способы загрузки модального окна динамически?
  • Вопрос задан
  • 600 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Wheelie
1. клик по элементу.
2. добавим прелоадер.
3. body append modal (данные из js шаблона) + инициализация скрипта(в след. раз уже не надо)
4. modal show.
5. закрытия модалки. body modal remove.
Ответ написан
Комментировать
@WhiteSama
Создаешь структуру окна в js. Затем создаешь (можно в js, можно в бд, можно json), информацию по окнам(заголовок, текст, форма и т.д, для каждого своё). Затем по какому-либо параметру на кнопке вызывающей окно, передаешь в скрипт создания окна эту информацию.

Например куски кода:

<a href="/23_this.page.html#!flat_21" data-popup="apartment">3-комн.</a>


Ф-ция вызова окна:
var popup = new function() {

    this.init = function(ajaxCallback, link, argument) {

        if(!popupOpen) {
            popup.open(ajaxCallback, link, argument);
        } else {
            popup.change(ajaxCallback, link, argument);
        }

    };

    this.open = function(ajaxCallback, link, argument) {

        $body = $('body');

        var scroll = (navigator.userAgent.search(/MSIE/) != -1) ? document.documentElement.scrollTop : window.scrollY;
        var html = '<div class="b-popup"><div class="b-popup-box"><div class="h-loaded-content"></div><span class="close">' + msg.close + '</span></div><div class="h-mask"></div></div>';

        $body.append(html);
        $('.b-popup').fadeIn(400);
        $('.h-mask').fadeTo(400, 0.7);
        $body.addClass('h-popup-on');

        $body.on('click', '.close, .h-mask, .b-popup .hide', function(){
            popup.close(scroll);
        });

        ajaxCallback(link, argument);

        $('.h-wrapper').css({ marginTop: -scroll });
        document.documentElement.scrollTop = 0;
        document.body.scrollTop = 0;

        popupOpen = true;

    };

    this.change = function(ajaxCallback, link, argument) {

        $('.b-popup-box').removeClass('loaded');

        if(argument) {
            $('.h-loaded-content').empty();
        }

        ajaxCallback(link, argument);

    };

    this.close = function(scroll) {

        $('.b-popup').fadeOut(400, function(){

            $(this).remove();
            $('.h-wrapper').css({ marginTop: 0 });
            $('body').removeClass('h-popup-on');

            document.documentElement.scrollTop = 0;
            document.body.scrollTop = 0;
            window.scrollBy(0,scroll);

            popupOpen = false;
            orderForm = false;

        });

    };

    this.floatHeader =  function() {

        var $container = $('.h-loaded-content');
        $container.prepend('<div class="b-popup-header"><span class="close">' + msg.close + '</span></div>');

        $container.find('header').clone().appendTo('.b-popup-header');
        $('.b-popup-header').append('<table></table>');

        $container.find('table tr:first').clone().appendTo('.b-popup-header table');
        $('.b-popup-header table').append('<tr><td><a>№8</a></td><td>забронирована</td><td>1</td><td>1</td><td><span class="red">3 050 000 руб</span> / 2 980 000 руб </td></tr>');

        $(window).scroll(function(){
            if(window.scrollY > 100) {
                $('.b-popup-header').show();
            } else {
                $('.b-popup-header').hide();
            }
        })


    };

};


Инициализация окна:
this.apartments = function() {

        popupOpen = false;
        orderForm = false;

        $('body').on('click', '[data-popup]', function(){

            var url = '/plain/json/' + $(this).attr('href').split('flat_')[1] + '.json';

            switch($(this).data('popup')) {
                case 'apartment':
                    popup.init(site.apartmentInfo, url, true);
                    break;
                case 'reserve':
                    if (!orderForm) {
                        popup.init(site.apartmentForm, $(this).attr('href'), false);
                    }
                    break;
                case 'subscribe':
                    if (!orderForm) {
                        popup.init(site.subscribe, $(this).attr('href'), false);
                    }
                    break;
                case 'plan':
                    popup.init(site.apartmentPlan, $(this).attr('href'), true);
                    break;
                case 'image':
                    popup.init(site.image, $(this).attr('href'), true);
                    break;

            }

            return false;

        });

    };


Генерация контента окна из json :
this.apartmentForm = function(link) {

        $.ajax({
            type: 'get',
            url: link,
            dataType: 'html',
            success: function(data){

                $('.b-popup-box').addClass('loaded');
                $('.b-popup-box [data-popup="reserve"]').addClass('disabled');

                $('.b-apartment_details_params').prepend('<tr class="image"><td colspan="2"><img src="' + $('.b-apartment_details_plan img').attr('src') + '" alt="" /></td></tr>');
                $('.b-apartment_details .grid_3').append('<p class="b-apartment_details_notice">Вы можете оставить заявку, указав интересующую вас квартиру и удобные условия оплаты.</p>');
                $('.clear + .grid_12').remove();
                $('.b-apartment_details .grid_9').empty().append(data);

                $('.b-popup-box .h-feed-form form').prepend('<input type="hidden" name="data[new][title]" value="' + $('.h-loaded-content h1').text() + '" />');

                // Form
                site.forms('input[type="checkbox"], input[type="radio"], select');
                site.validate('[data-validate]');

                orderForm = true;

            }
        });

    };


К сожалению нет времени объяснять подробнее, и пример прям с живого проекта.
Ответ написан
@IsaevDev
Через ajax дергайте нужную форму с сервера, как вариант
Если уже jquery используете, то вообще элементарно
Сделали запрос, добавили окно и через ajax же отправили результаты
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы