Документация для разработчиков
Темная тема

BX.PopupWindowManager

BX.PopupWindowManager - обертка над BX.PopupWindow. Имеет две особенности в использовании:

  • Повторный вызов метода create - вернет уже существующий объект.
  • Открытие диалога, автоматически закрывает другой открытый диалог, созданный через BX.PopupWindowManager.
Метод Описание С версии
create(uniquePopupId, bindElement, params) Создает диалог. Точно также как и BX.PopupMenu.
isPopupExists(uniquePopupId) Проверяет существование диалога.
getCurrentPopup() Получает текущий диалог.

Пример

var popup = BX.PopupWindowManager.create("popup-message", null, {
	content: "Hello World!",
	darkMode: true,
	autoHide: true
});

popup.show();


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Талант Рыскулов
Сообщение не промодерировано, возможны ошибки и неточности.
У Битрикс попапа нет параметра по типу breakpoints, чтобы изменять его под разную ширину.

Сделал следующий адаптив для мобилок.
Код
let popup = BX.PopupWindowManager.create("smartFilterDropDown"+popupId, this.lastDropDown, {
    className: 'bx-filter-select-popup-window',
    autoHide: true,
    autoHideHandler: outsideClick, // fix label->input outside click
    offsetLeft: 0,
    offsetTop: 8,
    overlay : false,
    draggable: false,
    closeByEsc: true,
    closeIcon: {left: "8px", top: "18px"},
    width: this.lastDropDown.offsetWidth,
    maxHeight: 300,
    titleBar: this.lastDropDown.querySelector('[data-role="currentOption"]').innerText,
    content: contentNode,
    events: {
      onPopupShow: () => dropdownWrapper.classList.add('_select-active'),
      onPopupClose: () => dropdownWrapper.classList.remove('_select-active'),
    }   
  });

 popup.show();

 // Адаптивность под телефон
 adjustPopup = () => {
    width = window.innerWidth;

    if (width < 768) { //------- Для мобильных устройств
      popup.setBindElement(null) //------ Отцепляется от this.lastDropDown
      popup.setOffset({offsetTop: 0})
      popup.setFixed(true); //----- На весь экран
      popup.setWidth(window.innerWidth); //---- На весь экран
      popup.setMaxHeight(window.innerHeight); //----- На весь экран
      popup.adjustPosition(); //---- Обновить текущую позицию
    }
  }

 adjustPopup();
 window.addEventListener('resize', adjustPopup);

0
Талант Рыскулов
Сообщение не промодерировано, возможны ошибки и неточности.
Битрикс пишет, что BX.PopupWindowManager устарел и предлагает ES6 метод. Можно использовать и так и так
(путь /bitrix/js/main/popup/src/index.js):
Код
const BX = Reflection.namespace('BX');

/** @deprecated use BX.Main.Popup or import { Popup } from 'main.popup' */
BX.PopupWindow = Popup;

/** @deprecated use BX.Main.PopupManager or import { PopupManager } from 'main.popup' */
BX.PopupWindowManager = PopupManager;

/** @deprecated use BX.Main.Menu or import { Menu } from 'main.popup' */
BX.PopupMenuWindow = Menu;

/** @deprecated use BX.Main.MenuManager or import { MenuManager } from 'main.popup' */
BX.PopupMenu = MenuManager;

/** @deprecated use BX.Main.MenuItem or import { MenuItem } from 'main.popup' */
BX.PopupMenuItem = MenuItem;

/** @deprecated use BX.UI.Button */
BX.PopupWindowButton = Button;

/** @deprecated use BX.UI.Button */
BX.PopupWindowButtonLink = ButtonLink;

/** @deprecated use BX.UI.Button */
BX.PopupWindowCustomButton = CustomButton;

/** @deprecated use another API */
window.BXInputPopup = InputPopup;
0
Талант Рыскулов
Сообщение не промодерировано, возможны ошибки и неточности.
Версия битрикс 23.675.0
На случай если у вас не что-то не работает, скидываю это, потому что есть отличия в старых коментах

Принимаемые настройки BX.PopupWindowManager (путь /bitrix/js/main/popup/src/popup/popup-types.js):
Код
import { type BaseEvent } from 'main.core.events';
import { ZIndexComponentOptions } from 'main.core.z-index-manager';
import type CloseIconSize from './popup-close-icon-size';

export type PopupOptions = {
 id?: string,
 bindElement?: PopupTarget,
 bindOptions?: PopupTargetOptions,
 content?: string | Element | Node,
 closeByEsc?: boolean,
 buttons?: [],
 className?: string,
 width?: number,
 height?: number,
 minWidth?: number,
 minHeight?: number,
 maxWidth?: number,
 maxHeight?: number,
 resizable?: boolean,
 padding?: number,
 contentPadding?: number,
 borderRadius?: string,
 contentBorderRadius?: string,
 background?: string,
 cacheable?: boolean,
 contentBackground?: string,
 animation?: PopupAnimationOptions,
 closeIcon?: boolean,
 closeIconSize?: $Values<CloseIconSize>,
 autoHide?: boolean,
 autoHideHandler?: (event: MouseEvent) => boolean,
 zIndexOptions?: ZIndexComponentOptions,
 toFrontOnShow?: boolean,
 events?: { [eventName: string]: (event: BaseEvent) => void },
 titleBar?: string | { content: string },
 angle?: boolean | { offset: number, position?: 'top' | 'bottom' | 'left' | 'right' },
 overlay?: boolean | { backgroundColor?: string, opacity?: number },
 contentColor?: 'white' | 'gray',
 draggable?: boolean | { restrict: boolean },
 darkMode?: boolean,
 fixed?: boolean,
 compatibleMode?: boolean,
 bindOnResize?: boolean,
 targetContainer?: HTMLElement,
 disableScroll?: boolean,

 //Compatibility
 noAllPaddings?: boolean,
 contentNoPaddings?: boolean,
}

export type PopupTarget = Element | { left: number, top: number } | null | MouseEvent;
export type PopupTargetOptions = {
 forceBindPosition?: boolean,
 forceLeft?: boolean,
 forceTop?: boolean,
 position?: 'top' | 'bootom'
};

export type PopupAnimationOptions =
 string
 | boolean
 | { showClassName?: string, closeClassName?: string, closeAnimationType: ? string }

0
Алексей Алексеев
Сообщение не промодерировано, возможны ошибки и неточности.
Кнопка виджета Б24 перекрывала плашку. Опция zIndex не работала.

Внутри z-index устанавливает BX.ZIndexManager и есть функция доступа к компоненту стека BX.ZIndexManager.
Можно установить z-index вручную после отображения попапа.

Код
    window.JCCatalogItem.prototype = {
        ...
        initPopupWindow: function () 
        {
            if (this.obPopupWin) return;

            this.obPopupWin = BX.PopupWindowManager.create('CatalogSectionBasket_' + this.visual.ID, null, {
                ...
            });

            BX.addCustomEvent('onAfterPopupShow', BX.proxy(this.autoClosePopup, this));
        },

        autoClosePopup: function () 
        {
            // Всплывашка выше кнопки Б24
            this.obPopupWin.getZIndexComponent().setZIndex(10200);
            ...
        }
    };
0
Константин Савин
Сообщение не промодерировано, возможны ошибки и неточности.
Dreamsite.all = function () {
$(document).ready(function() {
   $('.otus_popup_window').on('click', function(event) {
       event.preventDefault();
       var popup = BX.PopupWindowManager.create("popup-message", BX('element'), {
           content:
               '<select name="country" id="country">\n' +
               '  <option value="bra" selected>Бразилия</option>\n' +
               '  <option value="rus">Россия</option>\n' +
               '  <option value="ind">Индия</option>\n' +
               '  <option value="chn">Китай</option>\n' +
               '  <option value="zaf">ЮАР</option>\n' +
               '</select>\n' +
               '<select name="city" id="city">\n',
           width: 450, // ширина окна
           height: 450, // высота окна
           zIndex: 100, // z-index
           closeIcon: {
               opacity: 1
           },
           titleBar: 'Заголовок окна',
           closeByEsc: true, // закрытие окна по escЙ
           darkMode: false, // окно будет светлым или темным
           autoHide: false, // закрытие при клике вне окна
           draggable: true, // можно двигать или нет
           resizable: true, // можно ресайзить
           min_height: 250, // минимальная высота окна
           min_width: 100, // минимальная ширина окна
           lightShadow: true, // использовать светлую тень у окна
           angle: true, // появится уголок
           overlay: {
               backgroundColor: 'black',
               opacity: 500
           },
           buttons: [
               new BX.PopupWindowButton({
                   text: 'Записать', // текст кнопки
                   id: 'save-btn', // идентификатор
                   className: 'ui-btn ui-btn-success', // доп. классы
                   events: {
                       click: function() {
                           var inpone=$("#country").val();
                           var inptwo=$("#city").val();

                           BX.ajax({
                               url: '/ajax/ajax.php',
                               method: 'POST',
                               dataType: 'json',
                               data: {
                                   inp1: inpone,
                                   inp2: inptwo,
                               },
                               onsuccess: function(data) {
                                   console.log(data);
                                   $(location).prop('href', 'http://hooly.ru/ajax/ajax.php')
                               },
                               onfailure: function() {
                               }
                           });
                       }
                   }
               }),
               new BX.PopupWindowButton({
                   text: 'Закрыть',
                   id: 'copy-btn',
                   className: 'ui-btn ui-btn-primary',
                   events: {
                       click: function() {
                           popup.close();
                       }
                   }
               })
           ],
           events: {
               onPopupShow: function () {
                   var cities = {
                       bra: ["Сан-Паулу", "Рио-де-Жанейро"],
                       rus: ["Москва", "Санкт-Петербург"],
                       ind: ["Мумбаи", "Дели"],
                       chn: ["Шанхай", "Пекин"],
                       zaf: ["Йоханнесбург", "Кейптаун"]
                   };
                   var country = document.getElementById("country");
                   var city = document.querySelector("#city");
                   window.onl oad = selectCountry;
                   country.oncha nge = selectCountry;

                   function selectCountry(ev){
                       city.innerHTML = "";
                       var c = this.value || "bra", o;
                       for(let i = 0; i < cities[c].length; i++){
                           o = new Option(cities[c][i],i,false,false);
                           city.add(o);
                       };
                   }

               },
               onPopupClose: function () {
                   // $("#procid").val("");
               }
           }
       });
       popup.show();
   });
});
}
0
Андрей Чурсин
Сообщение не промодерировано, возможны ошибки и неточности.
для лоадера в окне (пока грузится контент) можно вставить старенький спиннер


content: '<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>',
10
Адель Юсупов
Сообщение не промодерировано, возможны ошибки и неточности.
Код
<?php

CJSCore::Init(['popup']);
?>

<sc ript>
    // BX.element - элемент, к которому будет привязано окно, если null – окно появится по центру экрана

    BX.ready(function () {
        var popup = BX.PopupWindowManager.create("popup-message", BX('element'), {
            content: 'Контент, отображаемый в теле окна',
            width: 400, // ширина окна
            height: 100, // высота окна
            zIndex: 100, // z-index
            closeIcon: {
                // объект со стилями для иконки закрытия, при null - иконки не будет
                opacity: 1
            },
            titleBar: 'Заголовок окна',
            closeByEsc: true, // закрытие окна по esc
            darkMode: false, // окно будет светлым или темным
            autoHide: false, // закрытие при клике вне окна
            draggable: true, // можно двигать или нет
            resizable: true, // можно ресайзить
            min_height: 100, // минимальная высота окна
            min_width: 100, // минимальная ширина окна
            lightShadow: true, // использовать светлую тень у окна
            angle: true, // появится уголок
            overlay: {
                // объект со стилями фона
                backgroundColor: 'black',
                opacity: 500
            }, 
            buttons: [
                new BX.PopupWindowButton({
                    text: 'Сохранить', // текст кнопки
                    id: 'save-btn', // идентификатор
                    className: 'ui-btn ui-btn-success', // доп. классы
                    events: {
                      click: function() {
                          // Событие при клике на кнопку
                      }
                    }
                }),
                new BX.PopupWindowButton({
                    text: 'Копировать',
                    id: 'copy-btn',
                    className: 'ui-btn ui-btn-primary',
                    events: {
                      click: function() {

                      }
                    }
                })
            ],
            events: {
               onPopupShow: function() {
                  // Событие при показе окна
               },
               onPopupClose: function() {
                  // Событие при закрытии окна                
               }
            }
        });

        popup.show();
    });
</sc ript>
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх