предупреждением.
В документации https://dev.1c-bitrix.ru/api_help/js_lib/sidepanel/events/events.php
описан пример, как отменить закрытие вкладки с помощью инструкции event.denyAction();
Эту инструкцию потом можно отменить и закрыть вкладку? Или она окончательная?
Не понял вопроса
ну если толко кэш в true и еще раз открыть
ну или не так понял если слайдер просто закрыть, то инстанс получить проблем нет и вызвать close, в обработчике завести какую переменную для контроля включения лока закрытия
Если "лок закрытия" задействован, то его уже потом никак не отменить в последующем коде? Ну чтобы исходное закрытие все же произошло.
Если "лок закрытия" (event.denyAction();) задействован в обработчике, то его уже потом никак не отменить в последующем коде? Чтобы это исходное закрытие все же завершилось успешно.
У вас кажется проблемы с восприятием событийной модели. Есть действие, которое порождает событие. Есть обработчики которые подписываются на событие и могут выдавать реакцию. Например закрытие слайдера - это действие, оно порождает событие закрытия слайдера, он в свою очередь вызывает обработчики, которые на это событие подписаны. Действие можно совершать много раз и каждом обработчике можно эту ситуацию обработать. Например: сделать какое-нибудь глобальное хранилище, при выполнении действия проверить в нем условия закрытия и если они не соблюдаются вызвать deny - о чем вам и говорил коллега раньше
ну от логики на то он и обработчик что вызывается и без async так что просто вызываешь закрытие (передав инстанс дальше себе по коду) и в текущей отмене учитываешь, что это твой вызов без закрытия
Так и понимаю, как вы описали. Закрытие слайдера -> Событие -> Обработчик события Но мы видим, что обработчику дан метод влиять на процесс "Закрытия слайдера". Это метод отмены закрытия - event.denyAction(); Отсюда и вопрос, может быть есть метод отмены event.denyAction(); ? Т.е. отказ от незакрытия.
Нет. Если метод вызван, то в данном случае нельзя отменить его поведение.
что ты там делаешь? сообщение вы действительно хотите покинуть окно? так стандартный конфирм всунь :)))
Разрешите спросить про "глобальное хранилище". Цель запомнить выбор пользователя, чтобы учитывать его в следующем событии. Какой выбор у нас есть? Сессия, куки, пользовательское поле в сделке. Правильно?
Что такое конфирм? Я знаю BX.SidePanel.Instance.close([immediately=false]) который закрывает текущую вкладку. Но проблема в том, что это вызывает другое событие и новый запуск обработчика, который не учитывает предыдущий выбор пользователя.
какой кейс? для чего прерываешь?
Пользователь закрывает сделку. В обработчике проверяю, что в сделке подвязано >2 контактов. Блокирую закрытие сделки и показываю предупреждение с двумя кнопками [Исправить] [Оставить как было]. Обработчик кнопки [Оставить как было] должен закрыть предупреждение и саму сделку. Но новое закрытие сделки вызывает новое событие в которм не учитывается предыдущий выбор пользователя.
так конфирм повесь
Что такое конфирм)
let isBoss = confirm("Ты здесь главный?"); alert( isBoss ); // true, если нажата OK
https://learn.javascript.ru/alert-prompt-confirm
он блокирует выполнение кода, так что дождешься выбора юзера и узнаешь что нажал и закроешь окно или отменишь единственное что сообщение не сильно красивое :)
Понял, спасибо! Это действительно решение. Но некрасивое окно. Либо другое решение. Где-то (где?) запомнить выбор пользователя, чтобы учесть его в следующем закрытии. Андрей предложил "localstorage". Пойду почитаю, что это.
да не храниличе тебе нужно а просто глобальная переменная if(!window._facker_slider){ event.denyAction(); window._facker_slider = true; }else{ window._facker_slider = false; } например
А надо заботиться об удалении этой глобальной переменной? Ведь это выбор пользователя. Мне надо запомнить, чтобы учесть его только в следующем событии.
на следующем хите ее не будет ну в false поставить нужно, иначе при открытии другого слайдера она будет в рамках текущего хита
Обсуждают сегодня