123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- (function() {
- var browser = baidu.editor.browser,
- domUtils = baidu.editor.dom.domUtils;
- var magic = "$EDITORUI";
- var root = (window[magic] = {});
- var uidMagic = "ID" + magic;
- var uidCount = 0;
- var uiUtils = (baidu.editor.ui.uiUtils = {
- uid: function(obj) {
- return obj ? obj[uidMagic] || (obj[uidMagic] = ++uidCount) : ++uidCount;
- },
- hook: function(fn, callback) {
- var dg;
- if (fn && fn._callbacks) {
- dg = fn;
- } else {
- dg = function() {
- var q;
- if (fn) {
- q = fn.apply(this, arguments);
- }
- var callbacks = dg._callbacks;
- var k = callbacks.length;
- while (k--) {
- var r = callbacks[k].apply(this, arguments);
- if (q === undefined) {
- q = r;
- }
- }
- return q;
- };
- dg._callbacks = [];
- }
- dg._callbacks.push(callback);
- return dg;
- },
- createElementByHtml: function(html) {
- var el = document.createElement("div");
- el.innerHTML = html;
- el = el.firstChild;
- el.parentNode.removeChild(el);
- return el;
- },
- getViewportElement: function() {
- return browser.ie && browser.quirks
- ? document.body
- : document.documentElement;
- },
- getClientRect: function(element) {
- var bcr;
- //trace IE6下在控制编辑器显隐时可能会报错,catch一下
- try {
- bcr = element.getBoundingClientRect();
- } catch (e) {
- bcr = { left: 0, top: 0, height: 0, width: 0 };
- }
- var rect = {
- left: Math.round(bcr.left),
- top: Math.round(bcr.top),
- height: Math.round(bcr.bottom - bcr.top),
- width: Math.round(bcr.right - bcr.left)
- };
- var doc;
- while (
- (doc = element.ownerDocument) !== document &&
- (element = domUtils.getWindow(doc).frameElement)
- ) {
- bcr = element.getBoundingClientRect();
- rect.left += bcr.left;
- rect.top += bcr.top;
- }
- rect.bottom = rect.top + rect.height;
- rect.right = rect.left + rect.width;
- return rect;
- },
- getViewportRect: function() {
- var viewportEl = uiUtils.getViewportElement();
- var width = (window.innerWidth || viewportEl.clientWidth) | 0;
- var height = (window.innerHeight || viewportEl.clientHeight) | 0;
- return {
- left: 0,
- top: 0,
- height: height,
- width: width,
- bottom: height,
- right: width
- };
- },
- setViewportOffset: function(element, offset) {
- var rect;
- var fixedLayer = uiUtils.getFixedLayer();
- if (element.parentNode === fixedLayer) {
- element.style.left = offset.left + "px";
- element.style.top = offset.top + "px";
- } else {
- domUtils.setViewportOffset(element, offset);
- }
- },
- getEventOffset: function(evt) {
- var el = evt.target || evt.srcElement;
- var rect = uiUtils.getClientRect(el);
- var offset = uiUtils.getViewportOffsetByEvent(evt);
- return {
- left: offset.left - rect.left,
- top: offset.top - rect.top
- };
- },
- getViewportOffsetByEvent: function(evt) {
- var el = evt.target || evt.srcElement;
- var frameEl = domUtils.getWindow(el).frameElement;
- var offset = {
- left: evt.clientX,
- top: evt.clientY
- };
- if (frameEl && el.ownerDocument !== document) {
- var rect = uiUtils.getClientRect(frameEl);
- offset.left += rect.left;
- offset.top += rect.top;
- }
- return offset;
- },
- setGlobal: function(id, obj) {
- root[id] = obj;
- return magic + '["' + id + '"]';
- },
- unsetGlobal: function(id) {
- delete root[id];
- },
- copyAttributes: function(tgt, src) {
- var attributes = src.attributes;
- var k = attributes.length;
- while (k--) {
- var attrNode = attributes[k];
- if (
- attrNode.nodeName != "style" &&
- attrNode.nodeName != "class" &&
- (!browser.ie || attrNode.specified)
- ) {
- tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue);
- }
- }
- if (src.className) {
- domUtils.addClass(tgt, src.className);
- }
- if (src.style.cssText) {
- tgt.style.cssText += ";" + src.style.cssText;
- }
- },
- removeStyle: function(el, styleName) {
- if (el.style.removeProperty) {
- el.style.removeProperty(styleName);
- } else if (el.style.removeAttribute) {
- el.style.removeAttribute(styleName);
- } else throw "";
- },
- contains: function(elA, elB) {
- return (
- elA &&
- elB &&
- (elA === elB
- ? false
- : elA.contains
- ? elA.contains(elB)
- : elA.compareDocumentPosition(elB) & 16)
- );
- },
- startDrag: function(evt, callbacks, doc) {
- var doc = doc || document;
- var startX = evt.clientX;
- var startY = evt.clientY;
- function handleMouseMove(evt) {
- var x = evt.clientX - startX;
- var y = evt.clientY - startY;
- callbacks.ondragmove(x, y, evt);
- if (evt.stopPropagation) {
- evt.stopPropagation();
- } else {
- evt.cancelBubble = true;
- }
- }
- if (doc.addEventListener) {
- function handleMouseUp(evt) {
- doc.removeEventListener("mousemove", handleMouseMove, true);
- doc.removeEventListener("mouseup", handleMouseUp, true);
- window.removeEventListener("mouseup", handleMouseUp, true);
- callbacks.ondragstop();
- }
- doc.addEventListener("mousemove", handleMouseMove, true);
- doc.addEventListener("mouseup", handleMouseUp, true);
- window.addEventListener("mouseup", handleMouseUp, true);
- evt.preventDefault();
- } else {
- var elm = evt.srcElement;
- elm.setCapture();
- function releaseCaptrue() {
- elm.releaseCapture();
- elm.detachEvent("onmousemove", handleMouseMove);
- elm.detachEvent("onmouseup", releaseCaptrue);
- elm.detachEvent("onlosecaptrue", releaseCaptrue);
- callbacks.ondragstop();
- }
- elm.attachEvent("onmousemove", handleMouseMove);
- elm.attachEvent("onmouseup", releaseCaptrue);
- elm.attachEvent("onlosecaptrue", releaseCaptrue);
- evt.returnValue = false;
- }
- callbacks.ondragstart();
- },
- getFixedLayer: function() {
- var layer = document.getElementById("edui_fixedlayer");
- if (layer == null) {
- layer = document.createElement("div");
- layer.id = "edui_fixedlayer";
- document.body.appendChild(layer);
- if (browser.ie && browser.version <= 8) {
- layer.style.position = "absolute";
- bindFixedLayer();
- setTimeout(updateFixedOffset);
- } else {
- layer.style.position = "fixed";
- }
- layer.style.left = "0";
- layer.style.top = "0";
- layer.style.width = "0";
- layer.style.height = "0";
- }
- return layer;
- },
- makeUnselectable: function(element) {
- if (browser.opera || (browser.ie && browser.version < 9)) {
- element.unselectable = "on";
- if (element.hasChildNodes()) {
- for (var i = 0; i < element.childNodes.length; i++) {
- if (element.childNodes[i].nodeType == 1) {
- uiUtils.makeUnselectable(element.childNodes[i]);
- }
- }
- }
- } else {
- if (element.style.MozUserSelect !== undefined) {
- element.style.MozUserSelect = "none";
- } else if (element.style.WebkitUserSelect !== undefined) {
- element.style.WebkitUserSelect = "none";
- } else if (element.style.KhtmlUserSelect !== undefined) {
- element.style.KhtmlUserSelect = "none";
- }
- }
- }
- });
- function updateFixedOffset() {
- var layer = document.getElementById("edui_fixedlayer");
- uiUtils.setViewportOffset(layer, {
- left: 0,
- top: 0
- });
- // layer.style.display = 'none';
- // layer.style.display = 'block';
- //#trace: 1354
- // setTimeout(updateFixedOffset);
- }
- function bindFixedLayer(adjOffset) {
- domUtils.on(window, "scroll", updateFixedOffset);
- domUtils.on(
- window,
- "resize",
- baidu.editor.utils.defer(updateFixedOffset, 0, true)
- );
- }
- })();
|