[英]JavaScript modal with ES6 classes
I am trying to create a modal using es6 classes. 我正在尝试使用es6类创建模式。 A codePen: https://codepen.io/t411tocreate/pen/KomLzo 一个代码笔: https ://codepen.io/t411tocreate/pen/KomLzo
The idea is to get a button from the dom using data-for-modal
attribute, get modal itself searching by data-modal
attribute. 我们的想法是利用来从DOM的按钮data-for-modal
特性,得到模态本身通过搜索data-modal
属性。 Then showModal
and hideModal
methods should be bound to the element created as Modal
class instance. 然后, showModal
和hideModal
方法应绑定到作为Modal
类实例创建的元素。 Why it doesen't works ? 为什么不起作用?
My JS looks like this: 我的JS看起来像这样:
class Modal {
constructor(modalName) {
this.showBtn = document.querySelector(`[data-for-modal=\'${modalName}\']`)
this.modalWrapper = document.querySelector(`[data-modal=\'${modalName}\']`);
this.closeBtn = document.querySelector(`[data-modal=\'${modalName}\']`).children[0].children[0].children[1];
}
showModal () {
this.modalWrapper.classList.add('.ui-modal-wrappper.ui-modal-wrappper--active-modal');
}
hideModal () {
this.modalWrapper.classList.remove('.ui-modal-wrappper.ui-modal-wrappper--active-modal');
}
this.showBtn.addEventListener('click', this.showModal);
this.closeBtn.addEventListener('click', this.hideModal);
}
const m1 = new Modal('modal-1');
const m2 = new Modal('modal-2');
Why it doesen't works ? 为什么不起作用?
Because the handler is being bound by a different context this
than the context from class Modal
. 因为处理程序受不同上下文的约束,所以this
不同于类Modal
的上下文。
You need to bind the right context this
: 您需要绑定正确的上下文this
:
this.showBtn.addEventListener('click', this.showModal.bind(this));
this.closeBtn.addEventListener('click', this.hideModal.bind(this));
The function bind
will bind that context this
from class Modal
and returns a new function bound to the right context. 功能bind
将绑定这方面this
从类Modal
,并返回绑定到正确的上下文新功能。
class Modal { constructor(modalName) { this.showBtn = document.querySelector(`[data-for-modal=\\'${modalName}\\']`) this.modalWrapper = document.querySelector(`[data-modal=\\'${modalName}\\']`); this.closeBtn = document.querySelector(`[data-modal=\\'${modalName}\\']`).children[0].children[0].children[1]; this.showBtn.addEventListener('click', this.showModal.bind(this)); this.closeBtn.addEventListener('click', this.hideModal.bind(this)); } showModal() { console.log(this.modalWrapper); this.modalWrapper.classList.add('.ui-modal-wrappper.ui-modal-wrappper--active-modal'); } hideModal() { console.log(this.modalWrapper); this.modalWrapper.classList.remove('.ui-modal-wrappper.ui-modal-wrappper--active-modal'); } } const m1 = new Modal('modal-1'); const m2 = new Modal('modal-2');
* { margin: 0; padding: 0; outline: 0; } body { font-family: sans-serif; } .buttons-panel { background: #ccc; margin-top: 50vh; text-align: center; padding: 20px 0; } .ui-show-modal-btn { background: #3b5998; font-size: 1.5em; border: 0; outline: 0; margin: 0 10px; padding: 10px 15px; color: #fff; transition: opacity .3s ease; } .ui-show-modal-btn:hover { cursor: pointer; opacity: .9; } .ui-modal-wrappper { display: none; justify-content: center; align-items: center; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: rgba(51, 51, 51, 0.7); } .ui-modal-wrappper.ui-modal-wrappper--active-modal { display: flex; } .ui-modal-body { width: 80%; background: #ececec; font-family: Arial, sans-serif; box-shadow: 5px 5px 5px #333; } .ui-modal-body__header, .ui-modal-body__footer { color: #ececec; background: #3b5998; padding: 10px 15px; } .ui-modal-body__header { display: flex; justify-content: space-between; align-items: center; font-size: 1.5em; } .ui-modal-header__title {} .ui-modal-header__close-btn { padding: 5px 0px 5px 15px; transition: .2s ease all; } .ui-modal-header__close-btn:hover { cursor: pointer; opacity: .8; } .ui-modal-body__footer { font-size: 1.3em; text-align: center; } .ui-modal-body__content { padding: 20px 15px; color: #222; text-align: justify; } .ui-modal-body__content p { padding: 0 0 10px 0; } .ui-modal-body__content p:last-child { padding: 0px 0 0px 0; }
<div class="buttons-panel"> <button class="ui-btn ui-show-modal-btn" type="button" name="button" data-for-modal="modal-1">Show modal 1</button> <button class="ui-btn ui-show-modal-btn" type="button" name="button" data-for-modal="modal-2">Show modal 2</button> </div> <div class="ui-modal-wrappper" data-modal="modal-1"> <div class="ui-modal-body"> <div class="ui-modal-body__header"> <span class="ui-modal-header__title">Modal 1 header</span> <span class="ui-modal-header__close-btn">x</span> </div> <div class="ui-modal-body__content"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <div class="ui-modal-body__footer">Modal footer</div> </div> </div> <div class="ui-modal-wrappper" data-modal="modal-2"> <div class="ui-modal-body"> <div class="ui-modal-body__header"> <span class="ui-modal-header__title">Modal 2 header</span> <span class="ui-modal-header__close-btn">x</span> </div> <div class="ui-modal-body__content"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> <div class="ui-modal-body__footer">Modal footer</div> </div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.