|
1 | 1 | /* |
2 | | - * webui popover plugin - v1.2.1 |
| 2 | + * webui popover plugin - v1.2.2 |
3 | 3 | * A lightWeight popover plugin with jquery ,enchance the popover plugin of bootstrap with some awesome new features. It works well with bootstrap ,but bootstrap is not necessary! |
4 | 4 | * https://github.com/sandywalker/webui-popover |
5 | 5 | * |
|
58 | 58 | }; |
59 | 59 |
|
60 | 60 |
|
61 | | - var popovers = []; |
| 61 | + var _srcElements = []; |
62 | 62 | var backdrop = $('<div class="webui-popover-backdrop"></div>'); |
63 | 63 | var _globalIdSeed = 0; |
64 | 64 | var _isBodyEventHandled = false; |
|
69 | 69 | return isNaN(numeric) ? (fallback || 0) : Number(numeric); |
70 | 70 | }; |
71 | 71 |
|
| 72 | + var getPopFromElement = function($element) { |
| 73 | + return $element.data('plugin_' + pluginName); |
| 74 | + }; |
| 75 | + |
| 76 | + var hideAllPop = function() { |
| 77 | + for (var i = 0; i < _srcElements.length; i++) { |
| 78 | + _srcElements[i].webuiPopover('hide'); |
| 79 | + } |
| 80 | + $document.trigger('hiddenAll.' + pluginType); |
| 81 | + }; |
| 82 | + |
| 83 | + |
72 | 84 |
|
73 | 85 |
|
74 | 86 | // The actual plugin constructor |
|
87 | 99 | this._name = pluginName; |
88 | 100 | this._targetclick = false; |
89 | 101 | this.init(); |
90 | | - popovers.push(this.$element); |
| 102 | + _srcElements.push(this.$element); |
91 | 103 | } |
92 | 104 |
|
93 | 105 | WebuiPopover.prototype = { |
|
119 | 131 | destroy: function() { |
120 | 132 | var index = -1; |
121 | 133 |
|
122 | | - for (var i = 0; i < popovers.length; i++) { |
123 | | - if (popovers[i] === this.$element) { |
| 134 | + for (var i = 0; i < _srcElements.length; i++) { |
| 135 | + if (_srcElements[i] === this.$element) { |
124 | 136 | index = i; |
125 | 137 | break; |
126 | 138 | } |
127 | 139 | } |
128 | 140 |
|
129 | | - popovers.splice(index, 1); |
| 141 | + _srcElements.splice(index, 1); |
130 | 142 |
|
131 | 143 |
|
132 | 144 | this.hide(); |
|
203 | 215 | this[this.getTarget().hasClass('in') ? 'hide' : 'show'](); |
204 | 216 | }, |
205 | 217 | hideAll: function() { |
206 | | - for (var i = 0; i < popovers.length; i++) { |
207 | | - popovers[i].webuiPopover('hide'); |
208 | | - } |
209 | | - |
210 | | - $document.trigger('hiddenAll.' + pluginType); |
| 218 | + hideAllPop(); |
211 | 219 | }, |
212 | 220 | /*core method ,show popover */ |
213 | 221 | show: function() { |
|
552 | 560 | this.hideAll(); |
553 | 561 | } |
554 | 562 | }, |
555 | | - bodyClickHandler: function() { |
| 563 | + |
| 564 | + bodyClickHandler: function(e) { |
556 | 565 | _isBodyEventHandled = true; |
557 | | - if (this.getTrigger() === 'click') { |
558 | | - if (this._targetclick) { |
559 | | - this._targetclick = false; |
560 | | - } else { |
561 | | - this.hideAll(); |
| 566 | + var canHide = true; |
| 567 | + for (var i = 0; i < _srcElements.length; i++) { |
| 568 | + var pop = getPopFromElement(_srcElements[i]); |
| 569 | + if (pop._opened) { |
| 570 | + var popX1 = pop.getTarget().offset().left; |
| 571 | + var popY1 = pop.getTarget().offset().top; |
| 572 | + var popX2 = pop.getTarget().offset().left + pop.getTarget().width(); |
| 573 | + var popY2 = pop.getTarget().offset().top + pop.getTarget().height(); |
| 574 | + var inPop = e.pageX >= popX1 && e.pageX <= popX2 && e.pageY >= popY1 && e.pageY <= popY2; |
| 575 | + if (inPop) { |
| 576 | + canHide = false; |
| 577 | + break; |
| 578 | + } |
562 | 579 | } |
563 | 580 | } |
| 581 | + if (canHide) { |
| 582 | + hideAllPop(); |
| 583 | + } |
564 | 584 | }, |
565 | 585 |
|
| 586 | + /* |
566 | 587 | targetClickHandler: function() { |
567 | 588 | this._targetclick = true; |
568 | 589 | }, |
| 590 | + */ |
569 | 591 |
|
570 | 592 | //reset and init the target events; |
571 | 593 | initTargetEvents: function() { |
|
576 | 598 | .on('mouseleave', $.proxy(this.mouseleaveHandler, this)); |
577 | 599 | } |
578 | 600 | this.$target.find('.close').off('click').on('click', $.proxy(this.hide, this, true)); |
579 | | - this.$target.off('click.webui-popover').on('click.webui-popover', $.proxy(this.targetClickHandler, this)); |
| 601 | + //this.$target.off('click.webui-popover').on('click.webui-popover', $.proxy(this.targetClickHandler, this)); |
580 | 602 | }, |
581 | 603 | /* utils methods */ |
582 | 604 | //caculate placement of the popover |
|
0 commit comments