123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- ///import core
- ///import uicore
- (function() {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- domUtils = baidu.editor.dom.domUtils,
- UIBase = baidu.editor.ui.UIBase,
- Popup = (baidu.editor.ui.Popup = function(options) {
- this.initOptions(options);
- this.initPopup();
- });
- var allPopups = [];
- function closeAllPopup(evt, el) {
- for (var i = 0; i < allPopups.length; i++) {
- var pop = allPopups[i];
- if (!pop.isHidden()) {
- if (pop.queryAutoHide(el) !== false) {
- if (
- evt &&
- /scroll/gi.test(evt.type) &&
- pop.className == "edui-wordpastepop"
- )
- return;
- pop.hide();
- }
- }
- }
- if (allPopups.length) pop.editor.fireEvent("afterhidepop");
- }
- Popup.postHide = closeAllPopup;
- var ANCHOR_CLASSES = [
- "edui-anchor-topleft",
- "edui-anchor-topright",
- "edui-anchor-bottomleft",
- "edui-anchor-bottomright"
- ];
- Popup.prototype = {
- SHADOW_RADIUS: 5,
- content: null,
- _hidden: false,
- autoRender: true,
- canSideLeft: true,
- canSideUp: true,
- initPopup: function() {
- this.initUIBase();
- allPopups.push(this);
- },
- getHtmlTpl: function() {
- return (
- '<div id="##" class="edui-popup %%" onmousedown="return false;">' +
- ' <div id="##_body" class="edui-popup-body">' +
- ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
- ' <div class="edui-shadow"></div>' +
- ' <div id="##_content" class="edui-popup-content">' +
- this.getContentHtmlTpl() +
- " </div>" +
- " </div>" +
- "</div>"
- );
- },
- getContentHtmlTpl: function() {
- if (this.content) {
- if (typeof this.content == "string") {
- return this.content;
- }
- return this.content.renderHtml();
- } else {
- return "";
- }
- },
- _UIBase_postRender: UIBase.prototype.postRender,
- postRender: function() {
- if (this.content instanceof UIBase) {
- this.content.postRender();
- }
- //捕获鼠标滚轮
- if (this.captureWheel && !this.captured) {
- this.captured = true;
- var winHeight =
- (document.documentElement.clientHeight ||
- document.body.clientHeight) - 80,
- _height = this.getDom().offsetHeight,
- _top = uiUtils.getClientRect(this.combox.getDom()).top,
- content = this.getDom("content"),
- ifr = this.getDom("body").getElementsByTagName("iframe"),
- me = this;
- ifr.length && (ifr = ifr[0]);
- while (_top + _height > winHeight) {
- _height -= 30;
- }
- content.style.height = _height + "px";
- //同步更改iframe高度
- ifr && (ifr.style.height = _height + "px");
- //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解
- if (window.XMLHttpRequest) {
- domUtils.on(
- content,
- "onmousewheel" in document.body ? "mousewheel" : "DOMMouseScroll",
- function(e) {
- if (e.preventDefault) {
- e.preventDefault();
- } else {
- e.returnValue = false;
- }
- if (e.wheelDelta) {
- content.scrollTop -= e.wheelDelta / 120 * 60;
- } else {
- content.scrollTop -= e.detail / -3 * 60;
- }
- }
- );
- } else {
- //ie6
- domUtils.on(this.getDom(), "mousewheel", function(e) {
- e.returnValue = false;
- me.getDom("content").scrollTop -= e.wheelDelta / 120 * 60;
- });
- }
- }
- this.fireEvent("postRenderAfter");
- this.hide(true);
- this._UIBase_postRender();
- },
- _doAutoRender: function() {
- if (!this.getDom() && this.autoRender) {
- this.render();
- }
- },
- mesureSize: function() {
- var box = this.getDom("content");
- return uiUtils.getClientRect(box);
- },
- fitSize: function() {
- if (this.captureWheel && this.sized) {
- return this.__size;
- }
- this.sized = true;
- var popBodyEl = this.getDom("body");
- popBodyEl.style.width = "";
- popBodyEl.style.height = "";
- var size = this.mesureSize();
- if (this.captureWheel) {
- popBodyEl.style.width = -(-20 - size.width) + "px";
- var height = parseInt(this.getDom("content").style.height, 10);
- !window.isNaN(height) && (size.height = height);
- } else {
- popBodyEl.style.width = size.width + "px";
- }
- popBodyEl.style.height = size.height + "px";
- this.__size = size;
- this.captureWheel && (this.getDom("content").style.overflow = "auto");
- return size;
- },
- showAnchor: function(element, hoz) {
- this.showAnchorRect(uiUtils.getClientRect(element), hoz);
- },
- showAnchorRect: function(rect, hoz, adj) {
- this._doAutoRender();
- var vpRect = uiUtils.getViewportRect();
- this.getDom().style.visibility = "hidden";
- this._show();
- var popSize = this.fitSize();
- var sideLeft, sideUp, left, top;
- if (hoz) {
- sideLeft =
- this.canSideLeft &&
- (rect.right + popSize.width > vpRect.right &&
- rect.left > popSize.width);
- sideUp =
- this.canSideUp &&
- (rect.top + popSize.height > vpRect.bottom &&
- rect.bottom > popSize.height);
- left = sideLeft ? rect.left - popSize.width : rect.right;
- top = sideUp ? rect.bottom - popSize.height : rect.top;
- } else {
- sideLeft =
- this.canSideLeft &&
- (rect.right + popSize.width > vpRect.right &&
- rect.left > popSize.width);
- sideUp =
- this.canSideUp &&
- (rect.top + popSize.height > vpRect.bottom &&
- rect.bottom > popSize.height);
- left = sideLeft ? rect.right - popSize.width : rect.left;
- top = sideUp ? rect.top - popSize.height : rect.bottom;
- }
- var popEl = this.getDom();
- uiUtils.setViewportOffset(popEl, {
- left: left,
- top: top
- });
- domUtils.removeClasses(popEl, ANCHOR_CLASSES);
- popEl.className +=
- " " + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)];
- if (this.editor) {
- popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10;
- baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex =
- popEl.style.zIndex - 1;
- }
- this.getDom().style.visibility = "visible";
- },
- showAt: function(offset) {
- var left = offset.left;
- var top = offset.top;
- var rect = {
- left: left,
- top: top,
- right: left,
- bottom: top,
- height: 0,
- width: 0
- };
- this.showAnchorRect(rect, false, true);
- },
- _show: function() {
- if (this._hidden) {
- var box = this.getDom();
- box.style.display = "";
- this._hidden = false;
- // if (box.setActive) {
- // box.setActive();
- // }
- this.fireEvent("show");
- }
- },
- isHidden: function() {
- return this._hidden;
- },
- show: function() {
- this._doAutoRender();
- this._show();
- },
- hide: function(notNofity) {
- if (!this._hidden && this.getDom()) {
- this.getDom().style.display = "none";
- this._hidden = true;
- if (!notNofity) {
- this.fireEvent("hide");
- }
- }
- },
- queryAutoHide: function(el) {
- return !el || !uiUtils.contains(this.getDom(), el);
- }
- };
- utils.inherits(Popup, UIBase);
- domUtils.on(document, "mousedown", function(evt) {
- var el = evt.target || evt.srcElement;
- closeAllPopup(evt, el);
- });
- domUtils.on(window, "scroll", function(evt, el) {
- closeAllPopup(evt, el);
- });
- })();
|