diff --git a/common.blocks/modal/_autoclosable/modal_autoclosable.js b/common.blocks/modal/_autoclosable/modal_autoclosable.js index c19240cbb..75b54d42c 100644 --- a/common.blocks/modal/_autoclosable/modal_autoclosable.js +++ b/common.blocks/modal/_autoclosable/modal_autoclosable.js @@ -13,14 +13,28 @@ modules.define( * @bem */ provide(Modal.declMod({ modName : 'autoclosable', modVal : true }, /** @lends modal.prototype */{ + beforeSetMod : { + 'visible' : { + '' : function() { + return this._pointerDownTarget === this._pointerUpTarget; + } + } + }, + onSetMod : { 'visible' : { 'true' : function() { this.__base.apply(this, arguments); + this._pointerDownTarget = null; + this._pointerUpTarget = null; + this ._nextTick(function() { - this._domEvents().on('pointerclick', this._onPointerClick); + this._domEvents() + .on('pointerdown', this._onPointerDown) + .on('pointerup', this._onPointerUp) + .on('pointerclick', this._onPointerClick); }) ._popup._events().on({ modName : 'visible', modVal : '' }, this._onPopupHide, this); } @@ -31,6 +45,14 @@ provide(Modal.declMod({ modName : 'autoclosable', modVal : true }, /** @lends mo dom.contains(this._elem('content').domElem, $(e.target)) || this.delMod('visible'); }, + _onPointerDown : function(e) { + this._pointerDownTarget = e.target; + }, + + _onPointerUp : function(e) { + this._pointerUpTarget = e.target; + }, + _onPopupHide : function() { this.delMod('visible'); }