/** * guy * 最基础的dom操作 */ BI.extend(jQuery.fn, { destroy: function () { this.remove(); if (BI.isIE() === true) { this[0].outerHTML = ""; } }, /** * 高亮显示 * @param text 必需 * @param keyword * @param py 必需 * @returns {*} * @private */ __textKeywordMarked__: function (text, keyword, py) { if (!BI.isKey(keyword) || (text + "").length > 100) { return this.html(BI.htmlEncode(text)); } keyword = keyword + ""; keyword = BI.toUpperCase(keyword); var textLeft = (text || "") + ""; py = (py || BI.makeFirstPY(text)) + ""; if (py != null) { py = BI.toUpperCase(py); } this.empty(); while (true) { var tidx = BI.toUpperCase(textLeft).indexOf(keyword); var pidx = null; if (py != null) { pidx = py.indexOf(keyword); if (pidx >= 0) { pidx = pidx % text.length; } } if (tidx >= 0) { this.append(textLeft.substr(0, tidx)); this.append($("").addClass("bi-keyword-red-mark") .html(BI.htmlEncode(textLeft.substr(tidx, keyword.length)))); textLeft = textLeft.substr(tidx + keyword.length); if (py != null) { py = py.substr(tidx + keyword.length); } } else if (pidx != null && pidx >= 0 && Math.floor(pidx / text.length) === Math.floor((pidx + keyword.length - 1) / text.length)) { this.append(textLeft.substr(0, pidx)); this.append($("").addClass("bi-keyword-red-mark") .html(BI.htmlEncode(textLeft.substr(pidx, keyword.length)))); if (py != null) { py = py.substr(pidx + keyword.length); } textLeft = textLeft.substr(pidx + keyword.length); } else { this.append(textLeft); break; } } return this; }, getDomHeight: function (parent) { var clone = $(this).clone(); clone.appendTo($(parent || "body")); var height = clone.height(); clone.remove(); return height; }, // 是否有竖直滚动条 hasVerticalScroll: function () { return this.height() > 0 && this[0].clientWidth < this[0].offsetWidth; }, // 是否有水平滚动条 hasHorizonScroll: function () { return this.width() > 0 && this[0].clientHeight < this[0].offsetHeight; }, // 获取计算后的样式 getStyle: function (name) { var node = this[0]; var computedStyle = void 0; // W3C Standard if (window.getComputedStyle) { // In certain cases such as within an iframe in FF3, this returns null. computedStyle = window.getComputedStyle(node, null); if (computedStyle) { return computedStyle.getPropertyValue(BI.hyphenate(name)); } } // Safari if (document.defaultView && document.defaultView.getComputedStyle) { computedStyle = document.defaultView.getComputedStyle(node, null); // A Safari bug causes this to return null for `display: none` elements. if (computedStyle) { return computedStyle.getPropertyValue(BI.hyphenate(name)); } if (name === "display") { return "none"; } } // Internet Explorer if (node.currentStyle) { if (name === "float") { return node.currentStyle.cssFloat || node.currentStyle.styleFloat; } return node.currentStyle[BI.camelize(name)]; } return node.style && node.style[BI.camelize(name)]; }, __isMouseInBounds__: function (e) { var offset2Body = this.offset(); return !(e.pageX < offset2Body.left || e.pageX > offset2Body.left + this.outerWidth() || e.pageY < offset2Body.top || e.pageY > offset2Body.top + this.outerHeight()); }, __hasZIndexMask__: function (zindex) { return zindex && this.zIndexMask[zindex] != null; }, __buildZIndexMask__: function (zindex, domArray) { this.zIndexMask = this.zIndexMask || {};// 存储z-index的mask this.indexMask = this.indexMask || [];// 存储mask var mask = BI.createWidget({ type: "bi.center_adapt", cls: "bi-z-index-mask", items: domArray }); mask.element.css({"z-index": zindex}); BI.createWidget({ type: "bi.absolute", element: this, items: [{ el: mask, left: 0, right: 0, top: 0, bottom: 0 }] }); this.indexMask.push(mask); zindex && (this.zIndexMask[zindex] = mask); return mask.element; }, __releaseZIndexMask__: function (zindex) { if (zindex && this.zIndexMask[zindex]) { this.indexMask.remove(this.zIndexMask[zindex]); this.zIndexMask[zindex].destroy(); return; } this.indexMask = this.indexMask || []; var indexMask = this.indexMask.pop(); indexMask && indexMask.destroy(); } }); BI.extend(jQuery, { getLeftPosition: function (combo, popup, extraWidth) { return { left: combo.element.offset().left - popup.element.outerWidth() - (extraWidth || 0) }; }, getRightPosition: function (combo, popup, extraWidth) { var el = combo.element; return { left: el.offset().left + el.outerWidth() + (extraWidth || 0) }; }, getTopPosition: function (combo, popup, extraHeight) { return { top: combo.element.offset().top - popup.element.outerHeight() - (extraHeight || 0) }; }, getBottomPosition: function (combo, popup, extraHeight) { var el = combo.element; return { top: el.offset().top + el.outerHeight() + (extraHeight || 0) }; }, isLeftSpaceEnough: function (combo, popup, extraWidth) { return $.getLeftPosition(combo, popup, extraWidth).left >= 0; }, isRightSpaceEnough: function (combo, popup, extraWidth) { var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds(); return $.getRightPosition(combo, popup, extraWidth).left + viewBounds.width <= windowBounds.width; }, isTopSpaceEnough: function (combo, popup, extraHeight) { return $.getTopPosition(combo, popup, extraHeight).top >= 0; }, isBottomSpaceEnough: function (combo, popup, extraHeight) { var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds(); return $.getBottomPosition(combo, popup, extraHeight).top + viewBounds.height <= windowBounds.height; }, isRightSpaceLarger: function (combo) { var windowBounds = $("body").bounds(); return windowBounds.width - combo.element.offset().left - combo.element.bounds().width >= combo.element.offset().left; }, isBottomSpaceLarger: function (combo) { var windowBounds = $("body").bounds(); return windowBounds.height - combo.element.offset().top - combo.element.bounds().height >= combo.element.offset().top; }, getLeftAlignPosition: function (combo, popup, extraWidth) { var viewBounds = popup.element.bounds(), windowBounds = $("body").bounds(); var left = combo.element.offset().left + extraWidth; if (left + viewBounds.width > windowBounds.width) { left = windowBounds.width - viewBounds.width; } if (left < 0) { left = 0; } return { left: left }; }, getLeftAdaptPosition: function (combo, popup, extraWidth) { if ($.isLeftSpaceEnough(combo, popup, extraWidth)) { return $.getLeftPosition(combo, popup, extraWidth); } return { left: 0 }; }, getRightAlignPosition: function (combo, popup, extraWidth) { var comboBounds = combo.element.bounds(), viewBounds = popup.element.bounds(); var left = combo.element.offset().left + comboBounds.width - viewBounds.width - extraWidth; if (left < 0) { left = 0; } return { left: left }; }, getRightAdaptPosition: function (combo, popup, extraWidth) { if ($.isRightSpaceEnough(combo, popup, extraWidth)) { return $.getRightPosition(combo, popup, extraWidth); } return { left: $("body").bounds().width - popup.element.bounds().width }; }, getTopAlignPosition: function (combo, popup, extraHeight, needAdaptHeight) { var comboOffset = combo.element.offset(); var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); var top, adaptHeight; if ($.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { top = comboOffset.top + extraHeight; } else if (needAdaptHeight) { top = comboOffset.top + extraHeight; adaptHeight = windowBounds.height - top; } else { top = windowBounds.height - popupBounds.height; if (top < extraHeight) { adaptHeight = windowBounds.height - extraHeight; } } if (top < extraHeight) { top = extraHeight; } return adaptHeight ? { top: top, adaptHeight: adaptHeight } : { top: top }; }, getTopAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { var popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); if ($.isTopSpaceEnough(combo, popup, extraHeight)) { return $.getTopPosition(combo, popup, extraHeight); } if (needAdaptHeight) { return { top: 0, adaptHeight: combo.element.offset().top - extraHeight }; } if (popupBounds.height + extraHeight > windowBounds.height) { return { top: 0, adaptHeight: windowBounds.height - extraHeight }; } return { top: 0 }; }, getBottomAlignPosition: function (combo, popup, extraHeight, needAdaptHeight) { var comboOffset = combo.element.offset(); var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); var top, adaptHeight; if ($.isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { top = comboOffset.top + comboBounds.height - popupBounds.height - extraHeight; } else if (needAdaptHeight) { top = 0; adaptHeight = comboOffset.top + comboBounds.height - extraHeight; } else { top = 0; if (popupBounds.height + extraHeight > windowBounds.height) { adaptHeight = windowBounds.height - extraHeight; } } if (top < 0) { top = 0; } return adaptHeight ? { top: top, adaptHeight: adaptHeight } : { top: top }; }, getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { var comboOffset = combo.element.offset(); var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); if ($.isBottomSpaceEnough(combo, popup, extraHeight)) { return $.getBottomPosition(combo, popup, extraHeight); } if (needAdaptHeight) { return { top: comboOffset.top + comboBounds.height + extraHeight, adaptHeight: windowBounds.height - comboOffset.top - comboBounds.height - extraHeight }; } if (popupBounds.height + extraHeight > windowBounds.height) { return { top: extraHeight, adaptHeight: windowBounds.height - extraHeight }; } return { top: windowBounds.height - popupBounds.height - extraHeight }; }, getCenterAdaptPosition: function (combo, popup) { var comboOffset = combo.element.offset(); var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); var left; if (comboOffset.left + comboBounds.width / 2 + popupBounds.width / 2 > windowBounds.width) { left = windowBounds.width - popupBounds.width; } else { left = comboOffset.left + comboBounds.width / 2 - popupBounds.width / 2; } if (left < 0) { left = 0; } return { left: left }; }, getMiddleAdaptPosition: function (combo, popup) { var comboOffset = combo.element.offset(); var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), windowBounds = $("body").bounds(); var top; if (comboOffset.top + comboBounds.height / 2 + popupBounds.height / 2 > windowBounds.height) { top = windowBounds.height - popupBounds.height; } else { top = comboOffset.top + comboBounds.height / 2 - popupBounds.height / 2; } if (top < 0) { top = 0; } return { top: top }; }, getComboPositionByDirections: function (combo, popup, extraWidth, extraHeight, needAdaptHeight, directions) { extraWidth || (extraWidth = 0); extraHeight || (extraHeight = 0); var i, direct; var leftRight = [], topBottom = []; var isNeedAdaptHeight = false, tbFirst = false, lrFirst = false; var left, top, pos; for (i = 0; i < directions.length; i++) { direct = directions[i]; switch (direct) { case "left": leftRight.push(direct); break; case "right": leftRight.push(direct); break; case "top": topBottom.push(direct); break; case "bottom": topBottom.push(direct); break; } } for (i = 0; i < directions.length; i++) { direct = directions[i]; switch (direct) { case "left": if (!isNeedAdaptHeight) { var tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight; if ($.isLeftSpaceEnough(combo, popup, tW)) { left = $.getLeftPosition(combo, popup, tW).left; if (topBottom[0] === "bottom") { pos = $.getTopAlignPosition(combo, popup, tH, needAdaptHeight); pos.dir = "left,bottom"; } else { pos = $.getBottomAlignPosition(combo, popup, tH, needAdaptHeight); pos.dir = "left,top"; } if (tbFirst) { pos.change = "left"; } pos.left = left; return pos; } } lrFirst = true; break; case "right": if (!isNeedAdaptHeight) { var tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight; if ($.isRightSpaceEnough(combo, popup, tW)) { left = $.getRightPosition(combo, popup, tW).left; if (topBottom[0] === "bottom") { pos = $.getTopAlignPosition(combo, popup, tH, needAdaptHeight); pos.dir = "right,bottom"; } else { pos = $.getBottomAlignPosition(combo, popup, tH, needAdaptHeight); pos.dir = "right,top"; } if (tbFirst) { pos.change = "right"; } pos.left = left; return pos; } } lrFirst = true; break; case "top": var tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; if ($.isTopSpaceEnough(combo, popup, tH)) { top = $.getTopPosition(combo, popup, tH).top; if (leftRight[0] === "right") { pos = $.getLeftAlignPosition(combo, popup, tW, needAdaptHeight); pos.dir = "top,right"; } else { pos = $.getRightAlignPosition(combo, popup, tW); pos.dir = "top,left"; } if (lrFirst) { pos.change = "top"; } pos.top = top; return pos; } if (needAdaptHeight) { isNeedAdaptHeight = true; } tbFirst = true; break; case "bottom": var tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; if ($.isBottomSpaceEnough(combo, popup, tH)) { top = $.getBottomPosition(combo, popup, tH).top; if (leftRight[0] === "right") { pos = $.getLeftAlignPosition(combo, popup, tW, needAdaptHeight); pos.dir = "bottom,right"; } else { pos = $.getRightAlignPosition(combo, popup, tW); pos.dir = "bottom,left"; } if (lrFirst) { pos.change = "bottom"; } pos.top = top; return pos; } if (needAdaptHeight) { isNeedAdaptHeight = true; } tbFirst = true; break; } } switch (directions[0]) { case "left": case "right": if ($.isRightSpaceLarger(combo)) { left = $.getRightAdaptPosition(combo, popup, extraWidth).left; } else { left = $.getLeftAdaptPosition(combo, popup, extraWidth).left; } if (topBottom[0] === "bottom") { pos = $.getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight); pos.left = left; pos.dir = directions[0] + ",bottom"; return pos; } pos = $.getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight); pos.left = left; pos.dir = directions[0] + ",top"; return pos; default : if ($.isBottomSpaceLarger(combo)) { pos = $.getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight); } else { pos = $.getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight); } if (leftRight[0] === "right") { left = $.getLeftAlignPosition(combo, popup, extraWidth, needAdaptHeight).left; pos.left = left; pos.dir = directions[0] + ",right"; return pos; } left = $.getRightAlignPosition(combo, popup, extraWidth).left; pos.left = left; pos.dir = directions[0] + ",left"; return pos; } }, getComboPosition: function (combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, offsetStyle) { extraWidth || (extraWidth = 0); extraHeight || (extraHeight = 0); var bodyHeight = $("body").bounds().height - extraHeight; var maxHeight = Math.min(popup.attr("maxHeight") || bodyHeight, bodyHeight); popup.resetHeight && popup.resetHeight(maxHeight); var position = $.getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions || ["bottom", "top", "right", "left"]); switch (offsetStyle) { case "center": if (position.change) { var p = $.getMiddleAdaptPosition(combo, popup); position.top = p.top; } else { var p = $.getCenterAdaptPosition(combo, popup); position.left = p.left; } break; case "middle": if (position.change) { var p = $.getCenterAdaptPosition(combo, popup); position.left = p.left; } else { var p = $.getMiddleAdaptPosition(combo, popup); position.top = p.top; } break; } if (needAdaptHeight === true) { popup.resetHeight && popup.resetHeight(Math.min(bodyHeight - position.top, maxHeight)); } return position; } });