Я понимаю (и разделяю) ваше предпочтение стараться избегать JQuery там, где это возможно, но когда вы работаете с компонентом JQuery, на этом корабле уже что-то приплыло ..: -)
Чтобы ответить на ваш вопрос (и продемонстрировать, почему при работе с JQuery трудно избежать JQuery), есть два способа скрыть его с помощью «обычного JS»:
Как вы можете видеть, он делает гораздо больше вещей, чем просто применение стиля hide
. Вот почему это не работает.
if (event) {
event.preventDefault()
}
if (this._isTransitioning || !this._isShown) {
return
}
const hideEvent = $.Event(Event.HIDE)
$(this._element).trigger(hideEvent)
if (!this._isShown || hideEvent.isDefaultPrevented()) {
return
}
this._isShown = false
const transition = $(this._element).hasClass(ClassName.FADE)
if (transition) {
this._isTransitioning = true
}
this._setEscapeEvent()
this._setResizeEvent()
$(document).off(Event.FOCUSIN)
$(this._element).removeClass(ClassName.SHOW)
$(this._element).off(Event.CLICK_DISMISS)
$(this._dialog).off(Event.MOUSEDOWN_DISMISS)
if (transition) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element)
.one(Util.TRANSITION_END, (event) => this._hideModal(event))
.emulateTransitionEnd(transitionDuration)
} else {
this._hideModal()
}
Я пробовал подобные вещи раньше и обычно заканчивал тем, что бросил вечер работы (вычисляя и связывая все зависимости) после того, как пришел к выводу, что я должен просто позволить библиотеке справиться с этим.
Это не значит, что это пустая трата времени. Это поможет вам лучше понять, как работают эти библиотеки, и в конечном итоге сэкономит время в долгосрочной перспективе, потому что API будет меньше сюрпризов для вас.
2. Вручную вызвать Modal.hide()
Это включает в себя поиск правильного jQuery
объекта в элементе, получение нужного вам экземпляра объекта и последующий вызов соответствующего метода для него. Быстрый и грязный способ сделать это:
const el = document.getElementById("confirmationRequired");
const modal = Object.getOwnPropertyNames(el)
.filter(n => n.startsWith("jQuery"))
.map(n => e[n]["bs.modal"])
.find(j => j !== undefined);
modal.hide();
Или ..
Я бы просто использовал jQuery, чтобы сделать то же самое, но с меньшим количеством кода и более надежно.
Как уже отмечал Джесси, aurelia-dialog
- это путь, если вы хотите избежать JQuery. Это требует обучения, но это очень аккуратная библиотека, как только вы ее освоите.
Кто-то может поспорить: почему бы просто не прокрутить свою собственную модальную логику, используя только CSS из начальной загрузки для стилизации диалога? Модал - это две простые части:
Фиксированный заполняющий экран элемент с оттенком и положительным z-индексом, который делает остальную часть приложения недоступной для клика, когда модал активен. Просто показать / скрыть это с помощью CSS.
Элемент простой формы, фиксированный и центрированный, с более высоким z-индексом, чем заполнитель экрана. Вы можете сделать это пользовательским элементом и сделать его по-настоящему простым, позвольте ему общаться через EventAggregator
, чтобы вам не приходилось совершать колдовство с тесно связанными привязками.
Добавьте несколько обработчиков событий, таких как esc
, и щелкните за пределами модального окна в качестве альтернативы, чтобы закрыть его, и вы получите золотую медаль.