From 2e0c93ceb7c6ac43df02a2b88b2dffbf69827204 Mon Sep 17 00:00:00 2001
From: "lj7788@126.com"
+ * console.log( wrapNode.innerHTML );
+ *
+ *
+ * UE.dom.domUtils.breakParent( node, parent );
+ * //鎷嗗垎鍚
+ * //output:
+ * console.log( wrapNode.innerHTML );
+ *
+ * ```
+ */
+ breakParent:function (node, parent) {
+ var tmpNode,
+ parentClone = node,
+ clone = node,
+ leftNodes,
+ rightNodes;
+ do {
+ parentClone = parentClone.parentNode;
+ if (leftNodes) {
+ tmpNode = parentClone.cloneNode(false);
+ tmpNode.appendChild(leftNodes);
+ leftNodes = tmpNode;
+ tmpNode = parentClone.cloneNode(false);
+ tmpNode.appendChild(rightNodes);
+ rightNodes = tmpNode;
+ } else {
+ leftNodes = parentClone.cloneNode(false);
+ rightNodes = leftNodes.cloneNode(false);
+ }
+ while (tmpNode = clone.previousSibling) {
+ leftNodes.insertBefore(tmpNode, leftNodes.firstChild);
+ }
+ while (tmpNode = clone.nextSibling) {
+ rightNodes.appendChild(tmpNode);
+ }
+ clone = parentClone;
+ } while (parent !== parentClone);
+ tmpNode = parent.parentNode;
+ tmpNode.insertBefore(leftNodes, parent);
+ tmpNode.insertBefore(rightNodes, parent);
+ tmpNode.insertBefore(node, rightNodes);
+ domUtils.remove(parent);
+ return node;
+ },
+ /**
+ * 妫鏌ヨ妭鐐筺ode鏄惁鏄┖inline鑺傜偣
+ * @method isEmptyInlineElement
+ * @param { Node } node 闇瑕佹娴嬬殑鑺傜偣瀵硅薄
+ * @return { Number } 濡傛灉缁欏畾鐨勮妭鐐规槸绌虹殑inline鑺傜偣锛 鍒欒繑鍥1, 鍚﹀垯杩斿洖0銆
+ * @example
+ * ```html
+ * => 1
+ * => 1
+ * => 1
+ * xx => 0
+ * ```
+ */
+ isEmptyInlineElement:function (node) {
+ if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) {
+ return 0;
+ }
+ node = node.firstChild;
+ while (node) {
+ //濡傛灉鏄垱寤虹殑bookmark灏辫烦杩
+ if (domUtils.isBookmarkNode(node)) {
+ return 0;
+ }
+ if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) ||
+ node.nodeType == 3 && !domUtils.isWhitespace(node)
+ ) {
+ return 0;
+ }
+ node = node.nextSibling;
+ }
+ return 1;
+
+ },
+
+ /**
+ * 鍒犻櫎node鑺傜偣涓嬮灏句袱绔殑绌虹櫧鏂囨湰瀛愯妭鐐
+ * @method trimWhiteTextNode
+ * @param { Element } node 闇瑕佹墽琛屽垹闄ゆ搷浣滅殑鍏冪礌瀵硅薄
+ * @example
+ * ```javascript
+ * var node = document.createElement("div");
+ *
+ * node.appendChild( document.createTextNode( "" ) );
+ *
+ * node.appendChild( document.createElement("div") );
+ *
+ * node.appendChild( document.createTextNode( "" ) );
+ *
+ * //3
+ * console.log( node.childNodes.length );
+ *
+ * UE.dom.domUtils.trimWhiteTextNode( node );
+ *
+ * //1
+ * console.log( node.childNodes.length );
+ * ```
+ */
+ trimWhiteTextNode:function (node) {
+ function remove(dir) {
+ var child;
+ while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) {
+ node.removeChild(child);
+ }
+ }
+ remove('firstChild');
+ remove('lastChild');
+ },
+
+ /**
+ * 鍚堝苟node鑺傜偣涓嬬浉鍚岀殑瀛愯妭鐐
+ * @name mergeChild
+ * @desc
+ * UE.dom.domUtils.mergeChild(node,tagName) //tagName瑕佸悎骞剁殑瀛愯妭鐐圭殑鏍囩
+ * @example
+ * xxaaxx xxaaxx xxxx[xxxx]x xxxx[xxxx]x xxxx[xxxx]x xxxx[xxxx]x
+ * aaaa
+ *
+ *
+ * bbbb
+ *
+ *
+ *
+ * aaaa
+ *
+ *
+ * bbbb
+ *
+ *
+ *
+ *
+ * @example
+ * ```javascript
+ * console.log( '褰撳墠娴忚鍣ㄧ増鏈彿鏄細 ' + UE.browser.version );
+ * ```
+ */
+ browser.version = version;
+
+ /**
+ * @property { boolean } isCompatible 妫娴嬪綋鍓嶆祻瑙堝櫒鏄惁鑳藉涓嶶Editor鑹ソ鍏煎
+ * @example
+ * ```javascript
+ * if ( UE.browser.isCompatible ) {
+ * console.log( '娴忚鍣ㄤ笌UEditor鑳藉鑹ソ鍏煎' );
+ * }
+ * ```
+ */
+ browser.isCompatible =
+ !browser.mobile && (
+ ( browser.ie && version >= 6 ) ||
+ ( browser.gecko && version >= 10801 ) ||
+ ( browser.opera && version >= 9.5 ) ||
+ ( browser.air && version >= 1 ) ||
+ ( browser.webkit && version >= 522 ) ||
+ false );
+ return browser;
+}();
+//蹇嵎鏂瑰紡
+var ie = browser.ie,
+ webkit = browser.webkit,
+ gecko = browser.gecko,
+ opera = browser.opera;
+
+// core/utils.js
+/**
+ * 宸ュ叿鍑芥暟鍖
+ * @file
+ * @module UE.utils
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor灏佽浣跨敤鐨勯潤鎬佸伐鍏峰嚱鏁
+ * @module UE.utils
+ * @unfile
+ */
+
+var utils = UE.utils = {
+
+ /**
+ * 鐢ㄧ粰瀹氱殑杩唬鍣ㄩ亶鍘嗗璞
+ * @method each
+ * @param { Object } obj 闇瑕侀亶鍘嗙殑瀵硅薄
+ * @param { Function } iterator 杩唬鍣紝 璇ユ柟娉曟帴鍙椾袱涓弬鏁帮紝 绗竴涓弬鏁版槸褰撳墠鎵澶勭悊鐨剉alue锛 绗簩涓弬鏁版槸褰撳墠閬嶅巻瀵硅薄鐨刱ey
+ * @example
+ * ```javascript
+ * var demoObj = {
+ * key1: 1,
+ * key2: 2
+ * };
+ *
+ * //output: key1: 1, key2: 2
+ * UE.utils.each( demoObj, funciton ( value, key ) {
+ *
+ * console.log( key + ":" + value );
+ *
+ * } );
+ * ```
+ */
+
+ /**
+ * 鐢ㄧ粰瀹氱殑杩唬鍣ㄩ亶鍘嗘暟缁勬垨绫绘暟缁勫璞
+ * @method each
+ * @param { Array } array 闇瑕侀亶鍘嗙殑鏁扮粍鎴栬呯被鏁扮粍
+ * @param { Function } iterator 杩唬鍣紝 璇ユ柟娉曟帴鍙椾袱涓弬鏁帮紝 绗竴涓弬鏁版槸褰撳墠鎵澶勭悊鐨剉alue锛 绗簩涓弬鏁版槸褰撳墠閬嶅巻瀵硅薄鐨刱ey
+ * @example
+ * ```javascript
+ * var divs = document.getElmentByTagNames( "div" );
+ *
+ * //output: 0: DIV, 1: DIV ...
+ * UE.utils.each( divs, funciton ( value, key ) {
+ *
+ * console.log( key + ":" + value.tagName );
+ *
+ * } );
+ * ```
+ */
+ each : function(obj, iterator, context) {
+ if (obj == null) return;
+ if (obj.length === +obj.length) {
+ for (var i = 0, l = obj.length; i < l; i++) {
+ if(iterator.call(context, obj[i], i, obj) === false)
+ return false;
+ }
+ } else {
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ if(iterator.call(context, obj[key], key, obj) === false)
+ return false;
+ }
+ }
+ }
+ },
+
+ /**
+ * 浠ョ粰瀹氬璞′綔涓哄師鍨嬪垱寤轰竴涓柊瀵硅薄
+ * @method makeInstance
+ * @param { Object } protoObject 璇ュ璞″皢浣滀负鏂板垱寤哄璞$殑鍘熷瀷
+ * @return { Object } 鏂扮殑瀵硅薄锛 璇ュ璞$殑鍘熷瀷鏄粰瀹氱殑protoObject瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } };
+ *
+ * var newObject = UE.utils.makeInstance( protoObject );
+ * //output: Hello UEditor!
+ * newObject.sayHello();
+ * ```
+ */
+ makeInstance:function (obj) {
+ var noop = new Function();
+ noop.prototype = obj;
+ obj = new noop;
+ noop.prototype = null;
+ return obj;
+ },
+
+ /**
+ * 灏唖ource瀵硅薄涓殑灞炴ф墿灞曞埌target瀵硅薄涓
+ * @method extend
+ * @remind 璇ユ柟娉曞皢寮哄埗鎶妔ource瀵硅薄涓婄殑灞炴у鍒跺埌target瀵硅薄涓
+ * @see UE.utils.extend(Object,Object,Boolean)
+ * @param { Object } target 鐩爣瀵硅薄锛 鏂扮殑灞炴у皢闄勫姞鍒拌瀵硅薄涓
+ * @param { Object } source 婧愬璞★紝 璇ュ璞$殑灞炴т細琚檮鍔犲埌target瀵硅薄涓
+ * @return { Object } 杩斿洖target瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * var target = { name: 'target', sex: 1 },
+ * source = { name: 'source', age: 17 };
+ *
+ * UE.utils.extend( target, source );
+ *
+ * //output: { name: 'source', sex: 1, age: 17 }
+ * console.log( target );
+ *
+ * ```
+ */
+
+ /**
+ * 灏唖ource瀵硅薄涓殑灞炴ф墿灞曞埌target瀵硅薄涓婏紝 鏍规嵁鎸囧畾鐨刬sKeepTarget鍊煎喅瀹氭槸鍚︿繚鐣欑洰鏍囧璞′腑涓
+ * 婧愬璞″睘鎬у悕鐩稿悓鐨勫睘鎬у笺
+ * @method extend
+ * @param { Object } target 鐩爣瀵硅薄锛 鏂扮殑灞炴у皢闄勫姞鍒拌瀵硅薄涓
+ * @param { Object } source 婧愬璞★紝 璇ュ璞$殑灞炴т細琚檮鍔犲埌target瀵硅薄涓
+ * @param { Boolean } isKeepTarget 鏄惁淇濈暀鐩爣瀵硅薄涓笌婧愬璞′腑灞炴у悕鐩稿悓鐨勫睘鎬
+ * @return { Object } 杩斿洖target瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * var target = { name: 'target', sex: 1 },
+ * source = { name: 'source', age: 17 };
+ *
+ * UE.utils.extend( target, source, true );
+ *
+ * //output: { name: 'target', sex: 1, age: 17 }
+ * console.log( target );
+ *
+ * ```
+ */
+ extend:function (t, s, b) {
+ if (s) {
+ for (var k in s) {
+ if (!b || !t.hasOwnProperty(k)) {
+ t[k] = s[k];
+ }
+ }
+ }
+ return t;
+ },
+
+ /**
+ * 灏嗙粰瀹氱殑澶氫釜瀵硅薄鐨勫睘鎬у鍒跺埌鐩爣瀵硅薄target涓
+ * @method extend2
+ * @remind 璇ユ柟娉曞皢寮哄埗鎶婃簮瀵硅薄涓婄殑灞炴у鍒跺埌target瀵硅薄涓
+ * @remind 璇ユ柟娉曟敮鎸佷袱涓強浠ヤ笂鐨勫弬鏁帮紝 浠庣浜屼釜鍙傛暟寮濮嬶紝 鍏跺睘鎬ч兘浼氳澶嶅埗鍒扮涓涓弬鏁颁笂銆 濡傛灉閬囧埌鍚屽悕鐨勫睘鎬э紝
+ * 灏嗕細瑕嗙洊鎺変箣鍓嶇殑鍊笺
+ * @param { Object } target 鐩爣瀵硅薄锛 鏂扮殑灞炴у皢闄勫姞鍒拌瀵硅薄涓
+ * @param { Object... } source 婧愬璞★紝 鏀寔澶氫釜瀵硅薄锛 璇ュ璞$殑灞炴т細琚檮鍔犲埌target瀵硅薄涓
+ * @return { Object } 杩斿洖target瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * var target = {},
+ * source1 = { name: 'source', age: 17 },
+ * source2 = { title: 'dev' };
+ *
+ * UE.utils.extend2( target, source1, source2 );
+ *
+ * //output: { name: 'source', age: 17, title: 'dev' }
+ * console.log( target );
+ *
+ * ```
+ */
+ extend2:function (t) {
+ var a = arguments;
+ for (var i = 1; i < a.length; i++) {
+ var x = a[i];
+ for (var k in x) {
+ if (!t.hasOwnProperty(k)) {
+ t[k] = x[k];
+ }
+ }
+ }
+ return t;
+ },
+
+ /**
+ * 妯℃嫙缁ф壙鏈哄埗锛 浣垮緱subClass缁ф壙鑷猻uperClass
+ * @method inherits
+ * @param { Object } subClass 瀛愮被瀵硅薄
+ * @param { Object } superClass 瓒呯被瀵硅薄
+ * @warning 璇ユ柟娉曞彧鑳借subClass缁ф壙瓒呯被鐨勫師鍨嬶紝 subClass瀵硅薄鑷韩鐨勫睘鎬у拰鏂规硶涓嶄細琚户鎵
+ * @return { Object } 缁ф壙superClass鍚庣殑瀛愮被瀵硅薄
+ * @example
+ * ```javascript
+ * function SuperClass(){
+ * this.name = "灏忔潕";
+ * }
+ *
+ * SuperClass.prototype = {
+ * hello:function(str){
+ * console.log(this.name + str);
+ * }
+ * }
+ *
+ * function SubClass(){
+ * this.name = "灏忓紶";
+ * }
+ *
+ * UE.utils.inherits(SubClass,SuperClass);
+ *
+ * var sub = new SubClass();
+ * //output: '灏忓紶鏃╀笂濂!
+ * sub.hello("鏃╀笂濂!");
+ * ```
+ */
+ inherits:function (subClass, superClass) {
+ var oldP = subClass.prototype,
+ newP = utils.makeInstance(superClass.prototype);
+ utils.extend(newP, oldP, true);
+ subClass.prototype = newP;
+ return (newP.constructor = subClass);
+ },
+
+ /**
+ * 鐢ㄦ寚瀹氱殑context瀵硅薄浣滀负鍑芥暟fn鐨勪笂涓嬫枃
+ * @method bind
+ * @param { Function } fn 闇瑕佺粦瀹氫笂涓嬫枃鐨勫嚱鏁板璞
+ * @param { Object } content 鍑芥暟fn鏂扮殑涓婁笅鏂囧璞
+ * @return { Function } 涓涓柊鐨勫嚱鏁帮紝 璇ュ嚱鏁颁綔涓哄師濮嬪嚱鏁癴n鐨勪唬鐞嗭紝 灏嗗畬鎴恌n鐨勪笂涓嬫枃璋冩崲宸ヤ綔銆
+ * @example
+ * ```javascript
+ *
+ * var name = 'window',
+ * newTest = null;
+ *
+ * function test () {
+ * console.log( this.name );
+ * }
+ *
+ * newTest = UE.utils.bind( test, { name: 'object' } );
+ *
+ * //output: object
+ * newTest();
+ *
+ * //output: window
+ * test();
+ *
+ * ```
+ */
+ bind:function (fn, context) {
+ return function () {
+ return fn.apply(context, arguments);
+ };
+ },
+
+ /**
+ * 鍒涘缓寤惰繜鎸囧畾鏃堕棿鍚庢墽琛岀殑鍑芥暟fn
+ * @method defer
+ * @param { Function } fn 闇瑕佸欢杩熸墽琛岀殑鍑芥暟瀵硅薄
+ * @param { int } delay 寤惰繜鐨勬椂闂达紝 鍗曚綅鏄绉
+ * @warning 璇ユ柟娉曠殑鏃堕棿鎺у埗鏄笉绮剧‘鐨勶紝浠呬粎鍙兘淇濊瘉鍑芥暟鐨勬墽琛屾槸鍦ㄧ粰瀹氱殑鏃堕棿涔嬪悗锛
+ * 鑰屼笉鑳戒繚璇佸垰濂藉埌杈惧欢杩熸椂闂存椂鎵ц銆
+ * @return { Function } 鐩爣鍑芥暟fn鐨勪唬鐞嗗嚱鏁帮紝 鍙湁鎵ц璇ュ嚱鏁版墠鑳借捣鍒板欢鏃舵晥鏋
+ * @example
+ * ```javascript
+ * var start = 0;
+ *
+ * function test(){
+ * console.log( new Date() - start );
+ * }
+ *
+ * var testDefer = UE.utils.defer( test, 1000 );
+ * //
+ * start = new Date();
+ * //output: (澶х害鍦1000姣涔嬪悗杈撳嚭) 1000
+ * testDefer();
+ * ```
+ */
+
+ /**
+ * 鍒涘缓寤惰繜鎸囧畾鏃堕棿鍚庢墽琛岀殑鍑芥暟fn, 濡傛灉鍦ㄥ欢杩熸椂闂村唴鍐嶆鎵ц璇ユ柟娉曪紝 灏嗕細鏍规嵁鎸囧畾鐨別xclusion鐨勫硷紝
+ * 鍐冲畾鏄惁鍙栨秷鍓嶄竴娆″嚱鏁扮殑鎵ц锛 濡傛灉exclusion鐨勫间负true锛 鍒欏彇娑堟墽琛岋紝鍙嶄箣锛屽皢缁х画鎵ц鍓嶄竴涓柟娉曘
+ * @method defer
+ * @param { Function } fn 闇瑕佸欢杩熸墽琛岀殑鍑芥暟瀵硅薄
+ * @param { int } delay 寤惰繜鐨勬椂闂达紝 鍗曚綅鏄绉
+ * @param { Boolean } exclusion 濡傛灉鍦ㄥ欢杩熸椂闂村唴鍐嶆鎵ц璇ュ嚱鏁帮紝璇ュ煎皢鍐冲畾鏄惁鍙栨秷鎵ц鍓嶄竴娆″嚱鏁扮殑鎵ц锛
+ * 鍊间负true琛ㄧず鍙栨秷鎵ц锛 鍙嶄箣鍒欏皢鍦ㄦ墽琛屽墠涓娆″嚱鏁颁箣鍚庢墠鎵ц鏈鍑芥暟璋冪敤銆
+ * @warning 璇ユ柟娉曠殑鏃堕棿鎺у埗鏄笉绮剧‘鐨勶紝浠呬粎鍙兘淇濊瘉鍑芥暟鐨勬墽琛屾槸鍦ㄧ粰瀹氱殑鏃堕棿涔嬪悗锛
+ * 鑰屼笉鑳戒繚璇佸垰濂藉埌杈惧欢杩熸椂闂存椂鎵ц銆
+ * @return { Function } 鐩爣鍑芥暟fn鐨勪唬鐞嗗嚱鏁帮紝 鍙湁鎵ц璇ュ嚱鏁版墠鑳借捣鍒板欢鏃舵晥鏋
+ * @example
+ * ```javascript
+ *
+ * function test(){
+ * console.log(1);
+ * }
+ *
+ * var testDefer = UE.utils.defer( test, 1000, true );
+ *
+ * //output: (涓ゆ璋冪敤浠呮湁涓娆¤緭鍑) 1
+ * testDefer();
+ * testDefer();
+ * ```
+ */
+ defer:function (fn, delay, exclusion) {
+ var timerID;
+ return function () {
+ if (exclusion) {
+ clearTimeout(timerID);
+ }
+ timerID = setTimeout(fn, delay);
+ };
+ },
+
+ /**
+ * 鑾峰彇鍏冪礌item鍦ㄦ暟缁刟rray涓娆″嚭鐜扮殑浣嶇疆, 濡傛灉鏈壘鍒癷tem锛 鍒欒繑鍥-1
+ * @method indexOf
+ * @remind 璇ユ柟娉曠殑鍖归厤杩囩▼浣跨敤鐨勬槸鎭掔瓑鈥===鈥
+ * @param { Array } array 闇瑕佹煡鎵剧殑鏁扮粍瀵硅薄
+ * @param { * } item 闇瑕佸湪鐩爣鏁扮粍涓煡鎵剧殑鍊
+ * @return { int } 杩斿洖item鍦ㄧ洰鏍囨暟缁刟rray涓娆″嚭鐜扮殑浣嶇疆锛 濡傛灉鍦ㄦ暟缁勪腑鏈壘鍒癷tem锛 鍒欒繑鍥-1
+ * @example
+ * ```javascript
+ * var item = 1,
+ * arr = [ 3, 4, 6, 8, 1, 1, 2 ];
+ *
+ * //output: 4
+ * console.log( UE.utils.indexOf( arr, item ) );
+ * ```
+ */
+
+ /**
+ * 鑾峰彇鍏冪礌item鏁扮粍array涓娆″嚭鐜扮殑浣嶇疆, 濡傛灉鏈壘鍒癷tem锛 鍒欒繑鍥-1銆傞氳繃start鐨勫煎彲浠ユ寚瀹氭悳绱㈢殑璧峰浣嶇疆銆
+ * @method indexOf
+ * @remind 璇ユ柟娉曠殑鍖归厤杩囩▼浣跨敤鐨勬槸鎭掔瓑鈥===鈥
+ * @param { Array } array 闇瑕佹煡鎵剧殑鏁扮粍瀵硅薄
+ * @param { * } item 闇瑕佸湪鐩爣鏁扮粍涓煡鎵剧殑鍊
+ * @param { int } start 鎼滅储鐨勮捣濮嬩綅缃
+ * @return { int } 杩斿洖item鍦ㄧ洰鏍囨暟缁刟rray涓殑start浣嶇疆涔嬪悗棣栨鍑虹幇鐨勪綅缃紝 濡傛灉鍦ㄦ暟缁勪腑鏈壘鍒癷tem锛 鍒欒繑鍥-1
+ * @example
+ * ```javascript
+ * var item = 1,
+ * arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ];
+ *
+ * //output: 9
+ * console.log( UE.utils.indexOf( arr, item, 5 ) );
+ * ```
+ */
+ indexOf:function (array, item, start) {
+ var index = -1;
+ start = this.isNumber(start) ? start : 0;
+ this.each(array, function (v, i) {
+ if (i >= start && v === item) {
+ index = i;
+ return false;
+ }
+ });
+ return index;
+ },
+
+ /**
+ * 绉婚櫎鏁扮粍array涓墍鏈夌殑鍏冪礌item
+ * @method removeItem
+ * @param { Array } array 瑕佺Щ闄ゅ厓绱犵殑鐩爣鏁扮粍
+ * @param { * } item 灏嗚琚Щ闄ょ殑鍏冪礌
+ * @remind 璇ユ柟娉曠殑鍖归厤杩囩▼浣跨敤鐨勬槸鎭掔瓑鈥===鈥
+ * @example
+ * ```javascript
+ * var arr = [ 4, 5, 7, 1, 3, 4, 6 ];
+ *
+ * UE.utils.removeItem( arr, 4 );
+ * //output: [ 5, 7, 1, 3, 6 ]
+ * console.log( arr );
+ *
+ * ```
+ */
+ removeItem:function (array, item) {
+ for (var i = 0, l = array.length; i < l; i++) {
+ if (array[i] === item) {
+ array.splice(i, 1);
+ i--;
+ }
+ }
+ },
+
+ /**
+ * 鍒犻櫎瀛楃涓瞫tr鐨勯灏剧┖鏍
+ * @method trim
+ * @param { String } str 闇瑕佸垹闄ら灏剧┖鏍肩殑瀛楃涓
+ * @return { String } 鍒犻櫎浜嗛灏剧殑绌烘牸鍚庣殑瀛楃涓
+ * @example
+ * ```javascript
+ *
+ * var str = " UEdtior ";
+ *
+ * //output: 9
+ * console.log( str.length );
+ *
+ * //output: 7
+ * console.log( UE.utils.trim( " UEdtior " ).length );
+ *
+ * //output: 9
+ * console.log( str.length );
+ *
+ * ```
+ */
+ trim:function (str) {
+ return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
+ },
+
+ /**
+ * 灏嗗瓧绗︿覆str浠','鍒嗛殧鎴愭暟缁勫悗锛屽皢璇ユ暟缁勮浆鎹㈡垚鍝堝笇瀵硅薄锛 鍏剁敓鎴愮殑hash瀵硅薄鐨刱ey涓烘暟缁勪腑鐨勫厓绱狅紝 value涓1
+ * @method listToMap
+ * @warning 璇ユ柟娉曞湪鐢熸垚鐨刪ash瀵硅薄涓紝浼氫负姣忎竴涓猭ey鍚屾椂鐢熸垚涓涓彟涓涓叏澶у啓鐨刱ey銆
+ * @param { String } str 璇ュ瓧绗︿覆灏嗚浠','鍒嗗壊涓烘暟缁勶紝 鐒跺悗杩涜杞寲
+ * @return { Object } 杞寲涔嬪悗鐨刪ash瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+ * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) );
+ *
+ * ```
+ */
+
+ /**
+ * 灏嗗瓧绗︿覆鏁扮粍杞崲鎴愬搱甯屽璞★紝 鍏剁敓鎴愮殑hash瀵硅薄鐨刱ey涓烘暟缁勪腑鐨勫厓绱狅紝 value涓1
+ * @method listToMap
+ * @warning 璇ユ柟娉曞湪鐢熸垚鐨刪ash瀵硅薄涓紝浼氫负姣忎竴涓猭ey鍚屾椂鐢熸垚涓涓彟涓涓叏澶у啓鐨刱ey銆
+ * @param { Array } arr 瀛楃涓叉暟缁
+ * @return { Object } 杞寲涔嬪悗鐨刪ash瀵硅薄
+ * @example
+ * ```javascript
+ *
+ * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+ * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) );
+ *
+ * ```
+ */
+ listToMap:function (list) {
+ if (!list)return {};
+ list = utils.isArray(list) ? list : list.split(',');
+ for (var i = 0, ci, obj = {}; ci = list[i++];) {
+ obj[ci.toUpperCase()] = obj[ci] = 1;
+ }
+ return obj;
+ },
+
+ /**
+ * 灏唖tr涓殑html绗﹀彿杞箟,灏嗚浆涔夆'锛&锛<锛"锛>鈥濅簲涓瓧绗
+ * @method unhtml
+ * @param { String } str 闇瑕佽浆涔夌殑瀛楃涓
+ * @return { String } 杞箟鍚庣殑瀛楃涓
+ * @example
+ * ```javascript
+ * var html = '&';
+ *
+ * //output: <body>&</body>
+ * console.log( UE.utils.unhtml( html ) );
+ *
+ * ```
+ */
+ unhtml:function (str, reg) {
+ return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) {
+ if (b) {
+ return a;
+ } else {
+ return {
+ '<':'<',
+ '&':'&',
+ '"':'"',
+ '>':'>',
+ "'":'''
+ }[a]
+ }
+
+ }) : '';
+ },
+ /**
+ * 灏唘rl涓殑html瀛楃杞箟锛 浠呰浆涔 ', ", <, > 鍥涗釜瀛楃
+ * @param { String } str 闇瑕佽浆涔夌殑瀛楃涓
+ * @param { RegExp } reg 鑷畾涔夌殑姝e垯
+ * @return { String } 杞箟鍚庣殑瀛楃涓
+ */
+ unhtmlForUrl:function (str, reg) {
+ return str ? str.replace(reg || /[<">']/g, function (a) {
+ return {
+ '<':'<',
+ '&':'&',
+ '"':'"',
+ '>':'>',
+ "'":'''
+ }[a]
+
+ }) : '';
+ },
+
+ /**
+ * 灏唖tr涓殑杞箟瀛楃杩樺師鎴恏tml瀛楃
+ * @see UE.utils.unhtml(String);
+ * @method html
+ * @param { String } str 闇瑕侀嗚浆涔夌殑瀛楃涓
+ * @return { String } 閫嗚浆涔夊悗鐨勫瓧绗︿覆
+ * @example
+ * ```javascript
+ *
+ * var str = '<body>&</body>';
+ *
+ * //output: &
+ * console.log( UE.utils.html( str ) );
+ *
+ * ```
+ */
+ html:function (str) {
+ return str ? str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (m) {
+ return {
+ '<':'<',
+ '&':'&',
+ '"':'"',
+ '>':'>',
+ ''':"'",
+ ' ':' '
+ }[m]
+ }) : '';
+ },
+
+ /**
+ * 灏哻ss鏍峰紡杞崲涓洪┘宄扮殑褰㈠紡
+ * @method cssStyleToDomStyle
+ * @param { String } cssName 闇瑕佽浆鎹㈢殑css鏍峰紡鍚
+ * @return { String } 杞崲鎴愰┘宄板舰寮忓悗鐨刢ss鏍峰紡鍚
+ * @example
+ * ```javascript
+ *
+ * var str = 'border-top';
+ *
+ * //output: borderTop
+ * console.log( UE.utils.cssStyleToDomStyle( str ) );
+ *
+ * ```
+ */
+ cssStyleToDomStyle:function () {
+ var test = document.createElement('div').style,
+ cache = {
+ 'float':test.cssFloat != undefined ? 'cssFloat' : test.styleFloat != undefined ? 'styleFloat' : 'float'
+ };
+
+ return function (cssName) {
+ return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) {
+ return match.charAt(1).toUpperCase();
+ }));
+ };
+ }(),
+
+ /**
+ * 鍔ㄦ佸姞杞芥枃浠跺埌doc涓
+ * @method loadFile
+ * @param { DomDocument } document 闇瑕佸姞杞借祫婧愭枃浠剁殑鏂囨。瀵硅薄
+ * @param { Object } options 鍔犺浇璧勬簮鏂囦欢鐨勫睘鎬ч泦鍚堬紝 鍙栧艰鍙傝冧唬鐮佺ず渚
+ * @example
+ * ```javascript
+ *
+ * UE.utils.loadFile( document, {
+ * src:"test.js",
+ * tag:"script",
+ * type:"text/javascript",
+ * defer:"defer"
+ * } );
+ *
+ * ```
+ */
+
+ /**
+ * 鍔ㄦ佸姞杞芥枃浠跺埌doc涓紝鍔犺浇鎴愬姛鍚庢墽琛岀殑鍥炶皟鍑芥暟fn
+ * @method loadFile
+ * @param { DomDocument } document 闇瑕佸姞杞借祫婧愭枃浠剁殑鏂囨。瀵硅薄
+ * @param { Object } options 鍔犺浇璧勬簮鏂囦欢鐨勫睘鎬ч泦鍚堬紝 璇ラ泦鍚堟敮鎸佺殑鍊兼槸script鏍囩鍜宻tyle鏍囩鏀寔鐨勬墍鏈夊睘鎬с
+ * @param { Function } fn 璧勬簮鏂囦欢鍔犺浇鎴愬姛涔嬪悗鎵ц鐨勫洖璋
+ * @warning 瀵逛簬鍦ㄥ悓涓涓枃妗d腑澶氭鍔犺浇鍚屼竴URL鐨勬枃浠讹紝 璇ユ柟娉曚細鍦ㄧ涓娆″姞杞戒箣鍚庣紦瀛樿璇锋眰锛
+ * 鍦ㄦ涔嬪悗鐨勬墍鏈夊悓涓URL鐨勮姹傦紝 灏嗕細鐩存帴瑙﹀彂鍥炶皟銆
+ * @example
+ * ```javascript
+ *
+ * UE.utils.loadFile( document, {
+ * src:"test.js",
+ * tag:"script",
+ * type:"text/javascript",
+ * defer:"defer"
+ * }, function () {
+ * console.log('鍔犺浇鎴愬姛');
+ * } );
+ *
+ * ```
+ */
+ loadFile:function () {
+ var tmpList = [];
+
+ function getItem(doc, obj) {
+ try {
+ for (var i = 0, ci; ci = tmpList[i++];) {
+ if (ci.doc === doc && ci.url == (obj.src || obj.href)) {
+ return ci;
+ }
+ }
+ } catch (e) {
+ return null;
+ }
+
+ }
+
+ return function (doc, obj, fn) {
+ var item = getItem(doc, obj);
+ if (item) {
+ if (item.ready) {
+ fn && fn();
+ } else {
+ item.funs.push(fn)
+ }
+ return;
+ }
+ tmpList.push({
+ doc:doc,
+ url:obj.src || obj.href,
+ funs:[fn]
+ });
+ if (!doc.body) {
+ var html = [];
+ for (var p in obj) {
+ if (p == 'tag')continue;
+ html.push(p + '="' + obj[p] + '"')
+ }
+ doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >' + obj.tag + '>');
+ return;
+ }
+ if (obj.id && doc.getElementById(obj.id)) {
+ return;
+ }
+ var element = doc.createElement(obj.tag);
+ delete obj.tag;
+ for (var p in obj) {
+ element.setAttribute(p, obj[p]);
+ }
+ element.onload = element.onreadystatechange = function () {
+ if (!this.readyState || /loaded|complete/.test(this.readyState)) {
+ item = getItem(doc, obj);
+ if (item.funs.length > 0) {
+ item.ready = 1;
+ for (var fi; fi = item.funs.pop();) {
+ fi();
+ }
+ }
+ element.onload = element.onreadystatechange = null;
+ }
+ };
+ element.onerror = function () {
+ throw Error('The load ' + (obj.href || obj.src) + ' fails,check the url settings of file ueditor.config.js ')
+ };
+ doc.getElementsByTagName("head")[0].appendChild(element);
+ }
+ }(),
+
+ /**
+ * 鍒ゆ柇obj瀵硅薄鏄惁涓虹┖
+ * @method isEmptyObject
+ * @param { * } obj 闇瑕佸垽鏂殑瀵硅薄
+ * @remind 濡傛灉鍒ゆ柇鐨勫璞℃槸NULL锛 灏嗙洿鎺ヨ繑鍥瀟rue锛 濡傛灉鏄暟缁勪笖涓虹┖锛 杩斿洖true锛 濡傛灉鏄瓧绗︿覆锛 涓斿瓧绗︿覆涓虹┖锛
+ * 杩斿洖true锛 濡傛灉鏄櫘閫氬璞★紝 涓旇瀵硅薄娌℃湁浠讳綍瀹炰緥灞炴э紝 杩斿洖true
+ * @return { Boolean } 瀵硅薄鏄惁涓虹┖
+ * @example
+ * ```javascript
+ *
+ * //output: true
+ * console.log( UE.utils.isEmptyObject( {} ) );
+ *
+ * //output: true
+ * console.log( UE.utils.isEmptyObject( [] ) );
+ *
+ * //output: true
+ * console.log( UE.utils.isEmptyObject( "" ) );
+ *
+ * //output: false
+ * console.log( UE.utils.isEmptyObject( { key: 1 } ) );
+ *
+ * //output: false
+ * console.log( UE.utils.isEmptyObject( [1] ) );
+ *
+ * //output: false
+ * console.log( UE.utils.isEmptyObject( "1" ) );
+ *
+ * ```
+ */
+ isEmptyObject:function (obj) {
+ if (obj == null) return true;
+ if (this.isArray(obj) || this.isString(obj)) return obj.length === 0;
+ for (var key in obj) if (obj.hasOwnProperty(key)) return false;
+ return true;
+ },
+
+ /**
+ * 鎶妑gb鏍煎紡鐨勯鑹插艰浆鎹㈡垚16杩涘埗鏍煎紡
+ * @method fixColor
+ * @param { String } rgb鏍煎紡鐨勯鑹插
+ * @param { String }
+ * @example
+ * rgb(255,255,255) => "#ffffff"
+ */
+ fixColor:function (name, value) {
+ if (/color/i.test(name) && /rgba?/.test(value)) {
+ var array = value.split(",");
+ if (array.length > 3)
+ return "";
+ value = "#";
+ for (var i = 0, color; color = array[i++];) {
+ color = parseInt(color.replace(/[^\d]/gi, ''), 10).toString(16);
+ value += color.length == 1 ? "0" + color : color;
+ }
+ value = value.toUpperCase();
+ }
+ return value;
+ },
+ /**
+ * 鍙拡瀵筨order,padding,margin鍋氫簡澶勭悊锛屽洜涓烘ц兘闂
+ * @public
+ * @function
+ * @param {String} val style瀛楃涓
+ */
+ optCss:function (val) {
+ var padding, margin, border;
+ val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function (str, key, name, val) {
+ if (val.split(' ').length == 1) {
+ switch (key) {
+ case 'padding':
+ !padding && (padding = {});
+ padding[name] = val;
+ return '';
+ case 'margin':
+ !margin && (margin = {});
+ margin[name] = val;
+ return '';
+ case 'border':
+ return val == 'initial' ? '' : str;
+ }
+ }
+ return str;
+ });
+
+ function opt(obj, name) {
+ if (!obj) {
+ return '';
+ }
+ var t = obj.top , b = obj.bottom, l = obj.left, r = obj.right, val = '';
+ if (!t || !l || !b || !r) {
+ for (var p in obj) {
+ val += ';' + name + '-' + p + ':' + obj[p] + ';';
+ }
+ } else {
+ val += ';' + name + ':' +
+ (t == b && b == l && l == r ? t :
+ t == b && l == r ? (t + ' ' + l) :
+ l == r ? (t + ' ' + l + ' ' + b) : (t + ' ' + r + ' ' + b + ' ' + l)) + ';'
+ }
+ return val;
+ }
+
+ val += opt(padding, 'padding') + opt(margin, 'margin');
+ return val.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, '').replace(/;([ \n\r\t]+)|\1;/g, ';')
+ .replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (a, b) {
+ return b ? b + ";;" : ';'
+ });
+ },
+
+ /**
+ * 鍏嬮殕瀵硅薄
+ * @method clone
+ * @param { Object } source 婧愬璞
+ * @return { Object } source鐨勪竴涓壇鏈
+ */
+
+ /**
+ * 娣卞害鍏嬮殕瀵硅薄锛屽皢source鐨勫睘鎬у厠闅嗗埌target瀵硅薄锛 浼氳鐩杢arget閲嶅悕鐨勫睘鎬с
+ * @method clone
+ * @param { Object } source 婧愬璞
+ * @param { Object } target 鐩爣瀵硅薄
+ * @return { Object } 闄勫姞浜唖ource瀵硅薄鎵鏈夊睘鎬х殑target瀵硅薄
+ */
+ clone:function (source, target) {
+ var tmp;
+ target = target || {};
+ for (var i in source) {
+ if (source.hasOwnProperty(i)) {
+ tmp = source[i];
+ if (typeof tmp == 'object') {
+ target[i] = utils.isArray(tmp) ? [] : {};
+ utils.clone(source[i], target[i])
+ } else {
+ target[i] = tmp;
+ }
+ }
+ }
+ return target;
+ },
+
+ /**
+ * 鎶奵m锛弍t涓哄崟浣嶇殑鍊艰浆鎹负px涓哄崟浣嶇殑鍊
+ * @method transUnitToPx
+ * @param { String } 寰呰浆鎹㈢殑甯﹀崟浣嶇殑瀛楃涓
+ * @return { String } 杞崲涓簆x涓鸿閲忓崟浣嶇殑鍊肩殑瀛楃涓
+ * @example
+ * ```javascript
+ *
+ * //output: 500px
+ * console.log( UE.utils.transUnitToPx( '20cm' ) );
+ *
+ * //output: 27px
+ * console.log( UE.utils.transUnitToPx( '20pt' ) );
+ *
+ * ```
+ */
+ transUnitToPx:function (val) {
+ if (!/(pt|cm)/.test(val)) {
+ return val
+ }
+ var unit;
+ val.replace(/([\d.]+)(\w+)/, function (str, v, u) {
+ val = v;
+ unit = u;
+ });
+ switch (unit) {
+ case 'cm':
+ val = parseFloat(val) * 25;
+ break;
+ case 'pt':
+ val = Math.round(parseFloat(val) * 96 / 72);
+ }
+ return val + (val ? 'px' : '');
+ },
+
+ /**
+ * 鍦╠om鏍憆eady涔嬪悗鎵ц缁欏畾鐨勫洖璋冨嚱鏁
+ * @method domReady
+ * @remind 濡傛灉鍦ㄦ墽琛岃鏂规硶鐨勬椂鍊欙紝 dom鏍戝凡缁弐eady锛 閭d箞鍥炶皟鍑芥暟灏嗙珛鍒绘墽琛
+ * @param { Function } fn dom鏍憆eady涔嬪悗鐨勫洖璋冨嚱鏁
+ * @example
+ * ```javascript
+ *
+ * UE.utils.domReady( function () {
+ *
+ * console.log('123');
+ *
+ * } );
+ *
+ * ```
+ */
+ domReady:function () {
+
+ var fnArr = [];
+
+ function doReady(doc) {
+ //纭繚onready鍙墽琛屼竴娆
+ doc.isReady = true;
+ for (var ci; ci = fnArr.pop(); ci()) {
+ }
+ }
+
+ return function (onready, win) {
+ win = win || window;
+ var doc = win.document;
+ onready && fnArr.push(onready);
+ if (doc.readyState === "complete") {
+ doReady(doc);
+ } else {
+ doc.isReady && doReady(doc);
+ if (browser.ie && browser.version != 11) {
+ (function () {
+ if (doc.isReady) return;
+ try {
+ doc.documentElement.doScroll("left");
+ } catch (error) {
+ setTimeout(arguments.callee, 0);
+ return;
+ }
+ doReady(doc);
+ })();
+ win.attachEvent('onload', function () {
+ doReady(doc)
+ });
+ } else {
+ doc.addEventListener("DOMContentLoaded", function () {
+ doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
+ doReady(doc);
+ }, false);
+ win.addEventListener('load', function () {
+ doReady(doc)
+ }, false);
+ }
+ }
+
+ }
+ }(),
+
+ /**
+ * 鍔ㄦ佹坊鍔燾ss鏍峰紡
+ * @method cssRule
+ * @param { String } 鑺傜偣鍚嶇О
+ * @grammar UE.utils.cssRule('娣诲姞鐨勬牱寮忕殑鑺傜偣鍚嶇О',['鏍峰紡'锛'鏀惧埌鍝釜document涓'])
+ * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null //缁檅ody娣诲姞鑳屾櫙棰滆壊
+ * @grammar UE.utils.cssRule('body') =>鏍峰紡鐨勫瓧绗︿覆 //鍙栧緱key鍊间负body鐨勬牱寮忕殑鍐呭,濡傛灉娌℃湁鎵惧埌key鍊煎厛鍏崇殑鏍峰紡灏嗚繑鍥炵┖锛屼緥濡傚垰鎵嶉偅涓儗鏅鑹诧紝灏嗚繑鍥 body{background:#ccc}
+ * @grammar UE.utils.cssRule('body',document) => 杩斿洖鎸囧畾key鐨勬牱寮忥紝骞朵笖鎸囧畾鏄摢涓猟ocument
+ * @grammar UE.utils.cssRule('body','') =>null //娓呯┖缁欏畾鐨刱ey鍊肩殑鑳屾櫙棰滆壊
+ */
+ cssRule:browser.ie && browser.version != 11 ? function (key, style, doc) {
+ var indexList, index;
+ if(style === undefined || style && style.nodeType && style.nodeType == 9){
+ //鑾峰彇鏍峰紡
+ doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+ indexList = doc.indexList || (doc.indexList = {});
+ index = indexList[key];
+ if(index !== undefined){
+ return doc.styleSheets[index].cssText
+ }
+ return undefined;
+ }
+ doc = doc || document;
+ indexList = doc.indexList || (doc.indexList = {});
+ index = indexList[key];
+ //娓呴櫎鏍峰紡
+ if(style === ''){
+ if(index!== undefined){
+ doc.styleSheets[index].cssText = '';
+ delete indexList[key];
+ return true
+ }
+ return false;
+ }
+
+ //娣诲姞鏍峰紡
+ if(index!== undefined){
+ sheetStyle = doc.styleSheets[index];
+ }else{
+ sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length);
+ indexList[key] = index;
+ }
+ sheetStyle.cssText = style;
+ }: function (key, style, doc) {
+ var head, node;
+ if(style === undefined || style && style.nodeType && style.nodeType == 9){
+ //鑾峰彇鏍峰紡
+ doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+ node = doc.getElementById(key);
+ return node ? node.innerHTML : undefined;
+ }
+ doc = doc || document;
+ node = doc.getElementById(key);
+
+ //娓呴櫎鏍峰紡
+ if(style === ''){
+ if(node){
+ node.parentNode.removeChild(node);
+ return true
+ }
+ return false;
+ }
+
+ //娣诲姞鏍峰紡
+ if(node){
+ node.innerHTML = style;
+ }else{
+ node = doc.createElement('style');
+ node.id = key;
+ node.innerHTML = style;
+ doc.getElementsByTagName('head')[0].appendChild(node);
+ }
+ },
+ sort:function(array,compareFn){
+ compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);};
+ for(var i= 0,len = array.length; i
'
+};
+var fillCharReg = new RegExp(domUtils.fillChar, 'g');
+
+// core/Range.js
+/**
+ * Range灏佽
+ * @file
+ * @module UE.dom
+ * @class Range
+ * @since 1.2.6.1
+ */
+
+/**
+ * dom鎿嶄綔灏佽
+ * @unfile
+ * @module UE.dom
+ */
+
+/**
+ * Range瀹炵幇绫伙紝鏈被鏄疷Editor搴曞眰鏍稿績绫伙紝灏佽涓嶅悓娴忚鍣ㄤ箣闂寸殑Range鎿嶄綔銆
+ * @unfile
+ * @module UE.dom
+ * @class Range
+ */
+
+
+(function () {
+ var guid = 0,
+ fillChar = domUtils.fillChar,
+ fillData;
+
+ /**
+ * 鏇存柊range鐨刢ollapse鐘舵
+ * @param {Range} range range瀵硅薄
+ */
+ function updateCollapse(range) {
+ range.collapsed =
+ range.startContainer && range.endContainer &&
+ range.startContainer === range.endContainer &&
+ range.startOffset == range.endOffset;
+ }
+
+ function selectOneNode(rng){
+ return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1
+ }
+ function setEndPoint(toStart, node, offset, range) {
+ //濡傛灉node鏄嚜闂悎鏍囩瑕佸鐞
+ if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) {
+ offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1);
+ node = node.parentNode;
+ }
+ if (toStart) {
+ range.startContainer = node;
+ range.startOffset = offset;
+ if (!range.endContainer) {
+ range.collapse(true);
+ }
+ } else {
+ range.endContainer = node;
+ range.endOffset = offset;
+ if (!range.startContainer) {
+ range.collapse(false);
+ }
+ }
+ updateCollapse(range);
+ return range;
+ }
+
+ function execContentsAction(range, action) {
+ //璋冩暣杈圭晫
+ //range.includeBookmark();
+ var start = range.startContainer,
+ end = range.endContainer,
+ startOffset = range.startOffset,
+ endOffset = range.endOffset,
+ doc = range.document,
+ frag = doc.createDocumentFragment(),
+ tmpStart, tmpEnd;
+ if (start.nodeType == 1) {
+ start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode('')));
+ }
+ if (end.nodeType == 1) {
+ end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode('')));
+ }
+ if (start === end && start.nodeType == 3) {
+ frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset)));
+ //is not clone
+ if (action) {
+ start.deleteData(startOffset, endOffset - startOffset);
+ range.collapse(true);
+ }
+ return frag;
+ }
+ var current, currentLevel, clone = frag,
+ startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true);
+ for (var i = 0; startParents[i] == endParents[i];) {
+ i++;
+ }
+ for (var j = i, si; si = startParents[j]; j++) {
+ current = si.nextSibling;
+ if (si == start) {
+ if (!tmpStart) {
+ if (range.startContainer.nodeType == 3) {
+ clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset)));
+ //is not clone
+ if (action) {
+ start.deleteData(startOffset, start.nodeValue.length - startOffset);
+ }
+ } else {
+ clone.appendChild(!action ? start.cloneNode(true) : start);
+ }
+ }
+ } else {
+ currentLevel = si.cloneNode(false);
+ clone.appendChild(currentLevel);
+ }
+ while (current) {
+ if (current === end || current === endParents[j]) {
+ break;
+ }
+ si = current.nextSibling;
+ clone.appendChild(!action ? current.cloneNode(true) : current);
+ current = si;
+ }
+ clone = currentLevel;
+ }
+ clone = frag;
+ if (!startParents[i]) {
+ clone.appendChild(startParents[i - 1].cloneNode(false));
+ clone = clone.firstChild;
+ }
+ for (var j = i, ei; ei = endParents[j]; j++) {
+ current = ei.previousSibling;
+ if (ei == end) {
+ if (!tmpEnd && range.endContainer.nodeType == 3) {
+ clone.appendChild(doc.createTextNode(end.substringData(0, endOffset)));
+ //is not clone
+ if (action) {
+ end.deleteData(0, endOffset);
+ }
+ }
+ } else {
+ currentLevel = ei.cloneNode(false);
+ clone.appendChild(currentLevel);
+ }
+ //濡傛灉涓ょ鍚岀骇锛屽彸杈圭涓娆″凡缁忚寮濮嬪仛浜
+ if (j != i || !startParents[i]) {
+ while (current) {
+ if (current === start) {
+ break;
+ }
+ ei = current.previousSibling;
+ clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild);
+ current = ei;
+ }
+ }
+ clone = currentLevel;
+ }
+ if (action) {
+ range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true);
+ }
+ tmpStart && domUtils.remove(tmpStart);
+ tmpEnd && domUtils.remove(tmpEnd);
+ return frag;
+ }
+
+ /**
+ * 鍒涘缓涓涓窡document缁戝畾鐨勭┖鐨凴ange瀹炰緥
+ * @constructor
+ * @param { Document } document 鏂板缓鐨勯夊尯鎵灞炵殑鏂囨。瀵硅薄
+ */
+
+ /**
+ * @property { Node } startContainer 褰撳墠Range鐨勫紑濮嬭竟鐣岀殑瀹瑰櫒鑺傜偣, 鍙互鏄竴涓厓绱犺妭鐐规垨鑰呮槸鏂囨湰鑺傜偣
+ */
+
+ /**
+ * @property { Node } startOffset 褰撳墠Range鐨勫紑濮嬭竟鐣屽鍣ㄨ妭鐐圭殑鍋忕Щ閲, 濡傛灉鏄厓绱犺妭鐐癸紝
+ * 璇ュ煎氨鏄痗hildNodes涓殑绗嚑涓妭鐐癸紝 濡傛灉鏄枃鏈妭鐐瑰氨鏄枃鏈唴瀹圭殑绗嚑涓瓧绗
+ */
+
+ /**
+ * @property { Node } endContainer 褰撳墠Range鐨勭粨鏉熻竟鐣岀殑瀹瑰櫒鑺傜偣, 鍙互鏄竴涓厓绱犺妭鐐规垨鑰呮槸鏂囨湰鑺傜偣
+ */
+
+ /**
+ * @property { Node } endOffset 褰撳墠Range鐨勭粨鏉熻竟鐣屽鍣ㄨ妭鐐圭殑鍋忕Щ閲, 濡傛灉鏄厓绱犺妭鐐癸紝
+ * 璇ュ煎氨鏄痗hildNodes涓殑绗嚑涓妭鐐癸紝 濡傛灉鏄枃鏈妭鐐瑰氨鏄枃鏈唴瀹圭殑绗嚑涓瓧绗
+ */
+
+ /**
+ * @property { Boolean } collapsed 褰撳墠Range鏄惁闂悎
+ * @default true
+ * @remind Range鏄棴鍚堢殑鏃跺欙紝 startContainer === endContainer && startOffset === endOffset
+ */
+
+ /**
+ * @property { Document } document 褰撳墠Range鎵灞炵殑Document瀵硅薄
+ * @remind 涓嶅悓range鐨勭殑document灞炴у彲浠ユ槸涓嶅悓鐨
+ */
+ var Range = dom.Range = function (document) {
+ var me = this;
+ me.startContainer =
+ me.startOffset =
+ me.endContainer =
+ me.endOffset = null;
+ me.document = document;
+ me.collapsed = true;
+ };
+
+ /**
+ * 鍒犻櫎fillData
+ * @param doc
+ * @param excludeNode
+ */
+ function removeFillData(doc, excludeNode) {
+ try {
+ if (fillData && domUtils.inDoc(fillData, doc)) {
+ if (!fillData.nodeValue.replace(fillCharReg, '').length) {
+ var tmpNode = fillData.parentNode;
+ domUtils.remove(fillData);
+ while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) &&
+ //safari鐨刢ontains鏈塨ug
+ (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode))
+ ) {
+ fillData = tmpNode.parentNode;
+ domUtils.remove(tmpNode);
+ tmpNode = fillData;
+ }
+ } else {
+ fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, '');
+ }
+ }
+ } catch (e) {
+ }
+ }
+
+ /**
+ * @param node
+ * @param dir
+ */
+ function mergeSibling(node, dir) {
+ var tmpNode;
+ node = node[dir];
+ while (node && domUtils.isFillChar(node)) {
+ tmpNode = node[dir];
+ domUtils.remove(node);
+ node = tmpNode;
+ }
+ }
+
+ Range.prototype = {
+
+ /**
+ * 鍏嬮殕閫夊尯鐨勫唴瀹瑰埌涓涓狣ocumentFragment閲
+ * @method cloneContents
+ * @return { DocumentFragment | NULL } 濡傛灉閫夊尯鏄棴鍚堢殑灏嗚繑鍥瀗ull锛 鍚﹀垯锛 杩斿洖鍖呭惈鎵clone鍐呭鐨凞ocumentFragment鍏冪礌
+ * @example
+ * ```html
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ * ```
+ */
+ cloneContents:function () {
+ return this.collapsed ? null : execContentsAction(this, 0);
+ },
+
+ /**
+ * 鍒犻櫎褰撳墠閫夊尯鑼冨洿涓殑鎵鏈夊唴瀹
+ * @method deleteContents
+ * @remind 鎵ц瀹岃鎿嶄綔鍚庯紝 褰撳墠Range瀵硅薄鍙樻垚浜嗛棴鍚堢姸鎬
+ * @return { UE.dom.Range } 褰撳墠鎿嶄綔鐨凴ange瀵硅薄
+ * @example
+ * ```html
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ * ```
+ */
+ deleteContents:function () {
+ var txt;
+ if (!this.collapsed) {
+ execContentsAction(this, 1);
+ }
+ if (browser.webkit) {
+ txt = this.startContainer;
+ if (txt.nodeType == 3 && !txt.nodeValue.length) {
+ this.setStartBefore(txt).collapse(true);
+ domUtils.remove(txt);
+ }
+ }
+ return this;
+ },
+
+ /**
+ * 灏嗗綋鍓嶉夊尯鐨勫唴瀹规彁鍙栧埌涓涓狣ocumentFragment閲
+ * @method extractContents
+ * @remind 鎵ц璇ユ搷浣滃悗锛 閫夊尯灏嗗彉鎴愰棴鍚堢姸鎬
+ * @warning 鎵ц璇ユ搷浣滃悗锛 鍘熸潵閫夊尯鎵閫変腑鐨勫唴瀹瑰皢浠巇om鏍戜笂鍓ョ鍑烘潵
+ * @return { DocumentFragment } 杩斿洖鍖呭惈鎵鎻愬彇鍐呭鐨凞ocumentFragment瀵硅薄
+ * @example
+ * ```html
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ */
+ extractContents:function () {
+ return this.collapsed ? null : execContentsAction(this, 2);
+ },
+
+ /**
+ * 璁剧疆Range鐨勫紑濮嬪鍣ㄨ妭鐐瑰拰鍋忕Щ閲
+ * @method setStart
+ * @remind 濡傛灉缁欏畾鐨勮妭鐐规槸鍏冪礌鑺傜偣锛岄偅涔坥ffset鎸囩殑鏄叾瀛愬厓绱犱腑绱㈠紩涓簅ffset鐨勫厓绱狅紝
+ * 濡傛灉鏄枃鏈妭鐐癸紝閭d箞offset鎸囩殑鏄叾鏂囨湰鍐呭鐨勭offset涓瓧绗
+ * @remind 濡傛灉鎻愪緵鐨勫鍣ㄨ妭鐐规槸涓涓笉鑳藉寘鍚瓙鍏冪礌鐨勮妭鐐癸紝 鍒欒閫夊尯鐨勫紑濮嬪鍣ㄥ皢琚缃
+ * 涓鸿鑺傜偣鐨勭埗鑺傜偣锛 姝ゆ椂锛 鍏惰窛绂诲紑濮嬪鍣ㄧ殑鍋忕Щ閲忎篃鍙樻垚浜嗚鑺傜偣鍦ㄥ叾鐖惰妭鐐
+ * 涓殑绱㈠紩
+ * @param { Node } node 灏嗚璁句负褰撳墠閫夊尯寮濮嬭竟鐣屽鍣ㄧ殑鑺傜偣瀵硅薄
+ * @param { int } offset 閫夊尯鐨勫紑濮嬩綅缃亸绉婚噺
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * xxxxxxxxxxxxx[xxx]
+ *
+ *
+ * ```
+ * @example
+ * ```html
+ *
+ * xxx[xx]x
+ *
+ *
+ * ```
+ */
+ setStart:function (node, offset) {
+ return setEndPoint(true, node, offset, this);
+ },
+
+ /**
+ * 璁剧疆Range鐨勭粨鏉熷鍣ㄥ拰鍋忕Щ閲
+ * @method setEnd
+ * @param { Node } node 浣滀负褰撳墠閫夊尯缁撴潫杈圭晫瀹瑰櫒鐨勮妭鐐瑰璞
+ * @param { int } offset 缁撴潫杈圭晫鐨勫亸绉婚噺
+ * @see UE.dom.Range:setStart(Node,int)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setEnd:function (node, offset) {
+ return setEndPoint(false, node, offset, this);
+ },
+
+ /**
+ * 灏哛ange寮濮嬩綅缃缃埌node鑺傜偣涔嬪悗
+ * @method setStartAfter
+ * @remind 璇ユ搷浣滃皢浼氭妸缁欏畾鑺傜偣鐨勭埗鑺傜偣浣滀负range鐨勫紑濮嬪鍣紝 涓斿亸绉婚噺鏄鑺傜偣鍦ㄥ叾鐖惰妭鐐逛腑鐨勪綅缃储寮+1
+ * @param { Node } node 閫夊尯鐨勫紑濮嬭竟鐣屽皢绱ф帴鐫璇ヨ妭鐐逛箣鍚
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * xxxxxxx[xxxx]
+ *
+ *
+ * ```
+ */
+ setStartAfter:function (node) {
+ return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1);
+ },
+
+ /**
+ * 灏哛ange寮濮嬩綅缃缃埌node鑺傜偣涔嬪墠
+ * @method setStartBefore
+ * @remind 璇ユ搷浣滃皢浼氭妸缁欏畾鑺傜偣鐨勭埗鑺傜偣浣滀负range鐨勫紑濮嬪鍣紝 涓斿亸绉婚噺鏄鑺傜偣鍦ㄥ叾鐖惰妭鐐逛腑鐨勪綅缃储寮
+ * @param { Node } node 鏂扮殑閫夊尯寮濮嬩綅缃湪璇ヨ妭鐐逛箣鍓
+ * @see UE.dom.Range:setStartAfter(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setStartBefore:function (node) {
+ return this.setStart(node.parentNode, domUtils.getNodeIndex(node));
+ },
+
+ /**
+ * 灏哛ange缁撴潫浣嶇疆璁剧疆鍒皀ode鑺傜偣涔嬪悗
+ * @method setEndAfter
+ * @remind 璇ユ搷浣滃皢浼氭妸缁欏畾鑺傜偣鐨勭埗鑺傜偣浣滀负range鐨勭粨鏉熷鍣紝 涓斿亸绉婚噺鏄鑺傜偣鍦ㄥ叾鐖惰妭鐐逛腑鐨勪綅缃储寮+1
+ * @param { Node } node 鐩爣鑺傜偣
+ * @see UE.dom.Range:setStartAfter(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * [xxxxxxx]xxxx
+ *
+ *
+ * ```
+ */
+ setEndAfter:function (node) {
+ return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1);
+ },
+
+ /**
+ * 灏哛ange缁撴潫浣嶇疆璁剧疆鍒皀ode鑺傜偣涔嬪墠
+ * @method setEndBefore
+ * @remind 璇ユ搷浣滃皢浼氭妸缁欏畾鑺傜偣鐨勭埗鑺傜偣浣滀负range鐨勭粨鏉熷鍣紝 涓斿亸绉婚噺鏄鑺傜偣鍦ㄥ叾鐖惰妭鐐逛腑鐨勪綅缃储寮
+ * @param { Node } node 鐩爣鑺傜偣
+ * @see UE.dom.Range:setEndAfter(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setEndBefore:function (node) {
+ return this.setEnd(node.parentNode, domUtils.getNodeIndex(node));
+ },
+
+ /**
+ * 璁剧疆Range鐨勫紑濮嬩綅缃埌node鑺傜偣鍐呯殑绗竴涓瓙鑺傜偣涔嬪墠
+ * @method setStartAtFirst
+ * @remind 閫夊尯鐨勫紑濮嬪鍣ㄥ皢鍙樻垚缁欏畾鐨勮妭鐐癸紝 涓斿亸绉婚噺涓0
+ * @remind 濡傛灉缁欏畾鐨勮妭鐐规槸鍏冪礌鑺傜偣锛 鍒欒鑺傜偣蹇呴』鏄厑璁稿寘鍚瓙鑺傜偣鐨勫厓绱犮
+ * @param { Node } node 鐩爣鑺傜偣
+ * @see UE.dom.Range:setStartBefore(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * xxxxx[xx]xxxx
+ *
+ *
+ * ```
+ */
+ setStartAtFirst:function (node) {
+ return this.setStart(node, 0);
+ },
+
+ /**
+ * 璁剧疆Range鐨勫紑濮嬩綅缃埌node鑺傜偣鍐呯殑鏈鍚庝竴涓妭鐐逛箣鍚
+ * @method setStartAtLast
+ * @remind 閫夊尯鐨勫紑濮嬪鍣ㄥ皢鍙樻垚缁欏畾鐨勮妭鐐癸紝 涓斿亸绉婚噺涓鸿鑺傜偣鐨勫瓙鑺傜偣鏁
+ * @remind 濡傛灉缁欏畾鐨勮妭鐐规槸鍏冪礌鑺傜偣锛 鍒欒鑺傜偣蹇呴』鏄厑璁稿寘鍚瓙鑺傜偣鐨勫厓绱犮
+ * @param { Node } node 鐩爣鑺傜偣
+ * @see UE.dom.Range:setStartAtFirst(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setStartAtLast:function (node) {
+ return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);
+ },
+
+ /**
+ * 璁剧疆Range鐨勭粨鏉熶綅缃埌node鑺傜偣鍐呯殑绗竴涓妭鐐逛箣鍓
+ * @method setEndAtFirst
+ * @param { Node } node 鐩爣鑺傜偣
+ * @remind 閫夊尯鐨勭粨鏉熷鍣ㄥ皢鍙樻垚缁欏畾鐨勮妭鐐癸紝 涓斿亸绉婚噺涓0
+ * @remind node蹇呴』鏄竴涓厓绱犺妭鐐癸紝 涓斿繀椤绘槸鍏佽鍖呭惈瀛愯妭鐐圭殑鍏冪礌銆
+ * @see UE.dom.Range:setStartAtFirst(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setEndAtFirst:function (node) {
+ return this.setEnd(node, 0);
+ },
+
+ /**
+ * 璁剧疆Range鐨勭粨鏉熶綅缃埌node鑺傜偣鍐呯殑鏈鍚庝竴涓妭鐐逛箣鍚
+ * @method setEndAtLast
+ * @param { Node } node 鐩爣鑺傜偣
+ * @remind 閫夊尯鐨勭粨鏉熷鍣ㄥ皢鍙樻垚缁欏畾鐨勮妭鐐癸紝 涓斿亸绉婚噺涓鸿鑺傜偣鐨勫瓙鑺傜偣鏁伴噺
+ * @remind node蹇呴』鏄竴涓厓绱犺妭鐐癸紝 涓斿繀椤绘槸鍏佽鍖呭惈瀛愯妭鐐圭殑鍏冪礌銆
+ * @see UE.dom.Range:setStartAtFirst(Node)
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ setEndAtLast:function (node) {
+ return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);
+ },
+
+ /**
+ * 閫変腑缁欏畾鑺傜偣
+ * @method selectNode
+ * @remind 姝ゆ椂锛 閫夊尯鐨勫紑濮嬪鍣ㄥ拰缁撴潫瀹瑰櫒閮芥槸璇ヨ妭鐐圭殑鐖惰妭鐐癸紝 鍏秙tartOffset鏄鑺傜偣鍦ㄧ埗鑺傜偣涓殑浣嶇疆绱㈠紩锛
+ * 鑰宔ndOffset涓簊tartOffset+1
+ * @param { Node } node 闇瑕侀変腑鐨勮妭鐐
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄锛屾鏃剁殑range浠呭寘鍚綋鍓嶇粰瀹氱殑鑺傜偣瀵硅薄
+ * @example
+ * ```html
+ *
+ * xxxxx[xx]xxxx
+ *
+ *
+ * ```
+ */
+ selectNode:function (node) {
+ return this.setStartBefore(node).setEndAfter(node);
+ },
+
+ /**
+ * 閫変腑缁欏畾鑺傜偣鍐呴儴鐨勬墍鏈夎妭鐐
+ * @method selectNodeContents
+ * @remind 姝ゆ椂锛 閫夊尯鐨勫紑濮嬪鍣ㄥ拰缁撴潫瀹瑰櫒閮芥槸璇ヨ妭鐐癸紝 鍏秙tartOffset涓0锛
+ * 鑰宔ndOffset鏄鑺傜偣鐨勫瓙鑺傜偣鏁般
+ * @param { Node } node 鐩爣鑺傜偣锛 褰撳墠range灏嗗寘鍚鑺傜偣鍐呯殑鎵鏈夎妭鐐
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄锛 姝ゆ椂range浠呭寘鍚粰瀹氳妭鐐圭殑鎵鏈夊瓙鑺傜偣
+ * @example
+ * ```html
+ *
+ * xxxxx[xx]xxxx
+ *
+ *
+ * ```
+ */
+ selectNodeContents:function (node) {
+ return this.setStart(node, 0).setEndAtLast(node);
+ },
+
+ /**
+ * clone褰撳墠Range瀵硅薄
+ * @method cloneRange
+ * @remind 杩斿洖鐨剅ange鏄竴涓叏鏂扮殑range瀵硅薄锛 鍏跺唴閮ㄦ墍鏈夊睘鎬т笌褰撳墠琚玞lone鐨剅ange鐩稿悓銆
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄鐨勪竴涓壇鏈
+ */
+ cloneRange:function () {
+ var me = this;
+ return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset);
+
+ },
+
+ /**
+ * 鍚戝綋鍓嶉夊尯鐨勭粨鏉熷闂悎閫夊尯
+ * @method collapse
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * xxxxx[xx]xxxx
+ *
+ *
+ * ```
+ */
+
+ /**
+ * 闂悎褰撳墠閫夊尯锛屾牴鎹粰瀹氱殑toStart鍙傛暟椤瑰喅瀹氭槸鍚戝綋鍓嶉夊尯寮濮嬪闂悎杩樻槸鍚戠粨鏉熷闂悎锛
+ * 濡傛灉toStart鐨勫间负true锛屽垯鍚戝紑濮嬩綅缃棴鍚堬紝 鍙嶄箣锛屽悜缁撴潫浣嶇疆闂悎銆
+ * @method collapse
+ * @param { Boolean } toStart 鏄惁鍚戦夊尯寮濮嬪闂悎
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄锛屾鏃秗ange瀵硅薄澶勪簬闂悎鐘舵
+ * @see UE.dom.Range:collapse()
+ * @example
+ * ```html
+ *
+ * xxxxx[xx]xxxx
+ *
+ *
+ * ```
+ */
+ collapse:function (toStart) {
+ var me = this;
+ if (toStart) {
+ me.endContainer = me.startContainer;
+ me.endOffset = me.startOffset;
+ } else {
+ me.startContainer = me.endContainer;
+ me.startOffset = me.endOffset;
+ }
+ me.collapsed = true;
+ return me;
+ },
+
+ /**
+ * 璋冩暣range鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆锛屼娇鍏"鏀剁缉"鍒版渶灏忕殑浣嶇疆
+ * @method shrinkBoundary
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ * xxxx[xxxxx] => xxxx[xxxxx]
+ * ```
+ *
+ * @example
+ * ```html
+ *
+ * x[xx]xxx
+ *
+ *
+ * ```
+ *
+ * @example
+ * ```html
+ * [xxxxxxxxxxx] => [xxxxxxxxxxx]
+ * ```
+ */
+
+ /**
+ * 璋冩暣range鐨勫紑濮嬩綅缃拰缁撴潫浣嶇疆锛屼娇鍏"鏀剁缉"鍒版渶灏忕殑浣嶇疆锛
+ * 濡傛灉ignoreEnd鐨勫间负true锛屽垯蹇界暐瀵圭粨鏉熶綅缃殑璋冩暣
+ * @method shrinkBoundary
+ * @param { Boolean } ignoreEnd 鏄惁蹇界暐瀵圭粨鏉熶綅缃殑璋冩暣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @see UE.dom.domUtils.Range:shrinkBoundary()
+ */
+ shrinkBoundary:function (ignoreEnd) {
+ var me = this, child,
+ collapsed = me.collapsed;
+ function check(node){
+ return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName]
+ }
+ while (me.startContainer.nodeType == 1 //鏄痚lement
+ && (child = me.startContainer.childNodes[me.startOffset]) //瀛愯妭鐐逛篃鏄痚lement
+ && check(child)) {
+ me.setStart(child, 0);
+ }
+ if (collapsed) {
+ return me.collapse(true);
+ }
+ if (!ignoreEnd) {
+ while (me.endContainer.nodeType == 1//鏄痚lement
+ && me.endOffset > 0 //濡傛灉鏄┖鍏冪礌灏遍鍑 endOffset=0閭d箞endOffst-1涓鸿礋鍊硷紝childNodes[endOffset]鎶ラ敊
+ && (child = me.endContainer.childNodes[me.endOffset - 1]) //瀛愯妭鐐逛篃鏄痚lement
+ && check(child)) {
+ me.setEnd(child, child.childNodes.length);
+ }
+ }
+ return me;
+ },
+
+ /**
+ * 鑾峰彇绂诲綋鍓嶉夊尯鍐呭寘鍚殑鎵鏈夎妭鐐规渶杩戠殑鍏叡绁栧厛鑺傜偣锛
+ * @method getCommonAncestor
+ * @remind 杩斿洖鐨勫叕鍏辩鍏堣妭鐐逛竴瀹氫笉鏄痳ange鑷韩鐨勫鍣ㄨ妭鐐癸紝 浣嗘湁鍙兘鏄竴涓枃鏈妭鐐
+ * @return { Node } 褰撳墠range瀵硅薄鍐呮墍鏈夎妭鐐圭殑鍏叡绁栧厛鑺傜偣
+ * @example
+ * ```html
+ * //閫夊尯绀轰緥
+ * xxxx[xxx]xxxxxx
+ *
+ * ```
+ */
+
+ /**
+ * 鑾峰彇褰撳墠閫夊尯鎵鍖呭惈鐨勬墍鏈夎妭鐐圭殑鍏叡绁栧厛鑺傜偣锛 鍙互鏍规嵁缁欏畾鐨勫弬鏁 includeSelf 鍐冲畾鑾峰彇鍒
+ * 鐨勫叕鍏辩鍏堣妭鐐规槸鍚﹀彲浠ユ槸褰撳墠閫夊尯鐨剆tartContainer鎴杄ndContainer鑺傜偣锛 濡傛灉 includeSelf
+ * 鐨勫彇鍊间负true锛 鍒欒繑鍥炵殑鑺傜偣鍙互鏄嚜韬殑瀹瑰櫒鑺傜偣锛 鍚﹀垯锛 鍒欎笉鑳芥槸瀹瑰櫒鑺傜偣
+ * @method getCommonAncestor
+ * @param { Boolean } includeSelf 鏄惁鍏佽鑾峰彇鍒扮殑鍏叡绁栧厛鑺傜偣鏄綋鍓峳ange瀵硅薄鐨勫鍣ㄨ妭鐐
+ * @return { Node } 褰撳墠range瀵硅薄鍐呮墍鏈夎妭鐐圭殑鍏叡绁栧厛鑺傜偣
+ * @see UE.dom.Range:getCommonAncestor()
+ * @example
+ * ```html
+ *
+ *
+ *
+ * xxxxxxxxx[xxx]xxxxxxxx
+ *
+ *
+ *
+ *
+ * ```
+ */
+
+ /**
+ * 鑾峰彇褰撳墠閫夊尯鎵鍖呭惈鐨勬墍鏈夎妭鐐圭殑鍏叡绁栧厛鑺傜偣锛 鍙互鏍规嵁缁欏畾鐨勫弬鏁 includeSelf 鍐冲畾鑾峰彇鍒
+ * 鐨勫叕鍏辩鍏堣妭鐐规槸鍚﹀彲浠ユ槸褰撳墠閫夊尯鐨剆tartContainer鎴杄ndContainer鑺傜偣锛 濡傛灉 includeSelf
+ * 鐨勫彇鍊间负true锛 鍒欒繑鍥炵殑鑺傜偣鍙互鏄嚜韬殑瀹瑰櫒鑺傜偣锛 鍚﹀垯锛 鍒欎笉鑳芥槸瀹瑰櫒鑺傜偣锛 鍚屾椂鍙互鏍规嵁
+ * ignoreTextNode 鍙傛暟鐨勫彇鍊煎喅瀹氭槸鍚﹀拷鐣ョ被鍨嬩负鏂囨湰鑺傜偣鐨勭鍏堣妭鐐广
+ * @method getCommonAncestor
+ * @param { Boolean } includeSelf 鏄惁鍏佽鑾峰彇鍒扮殑鍏叡绁栧厛鑺傜偣鏄綋鍓峳ange瀵硅薄鐨勫鍣ㄨ妭鐐
+ * @param { Boolean } ignoreTextNode 鑾峰彇绁栧厛鑺傜偣鐨勮繃绋嬩腑鏄惁蹇界暐绫诲瀷涓烘枃鏈妭鐐圭殑绁栧厛鑺傜偣
+ * @return { Node } 褰撳墠range瀵硅薄鍐呮墍鏈夎妭鐐圭殑鍏叡绁栧厛鑺傜偣
+ * @see UE.dom.Range:getCommonAncestor()
+ * @see UE.dom.Range:getCommonAncestor(Boolean)
+ * @example
+ * ```html
+ *
+ *
+ *
+ * xxxxxxxx[x]xxxxxxxxxxx
+ *
+ *
+ *
+ *
+ * ```
+ */
+ getCommonAncestor:function (includeSelf, ignoreTextNode) {
+ var me = this,
+ start = me.startContainer,
+ end = me.endContainer;
+ if (start === end) {
+ if (includeSelf && selectOneNode(this)) {
+ start = start.childNodes[me.startOffset];
+ if(start.nodeType == 1)
+ return start;
+ }
+ //鍙湁鍦ㄤ笂鏉ュ氨鐩哥瓑鐨勬儏鍐典笅鎵嶄細鍑虹幇鏄枃鏈殑鎯呭喌
+ return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start;
+ }
+ return domUtils.getCommonAncestor(start, end);
+ },
+
+ /**
+ * 璋冩暣褰撳墠Range鐨勫紑濮嬪拰缁撴潫杈圭晫瀹瑰櫒锛屽鏋滄槸瀹瑰櫒鑺傜偣鏄枃鏈妭鐐,灏辫皟鏁村埌鍖呭惈璇ユ枃鏈妭鐐圭殑鐖惰妭鐐逛笂
+ * @method trimBoundary
+ * @remind 璇ユ搷浣滄湁鍙兘浼氬紩璧锋枃鏈妭鐐硅鍒囧紑
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * //閫夊尯绀轰緥
+ * xxx[xxxxx]xxx
+ *
+ *
+ * ```
+ */
+
+ /**
+ * 璋冩暣褰撳墠Range鐨勫紑濮嬪拰缁撴潫杈圭晫瀹瑰櫒锛屽鏋滄槸瀹瑰櫒鑺傜偣鏄枃鏈妭鐐,灏辫皟鏁村埌鍖呭惈璇ユ枃鏈妭鐐圭殑鐖惰妭鐐逛笂锛
+ * 鍙互鏍规嵁 ignoreEnd 鍙傛暟鐨勫煎喅瀹氭槸鍚﹁皟鏁村缁撴潫杈圭晫鐨勮皟鏁
+ * @method trimBoundary
+ * @param { Boolean } ignoreEnd 鏄惁蹇界暐瀵圭粨鏉熻竟鐣岀殑璋冩暣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @example
+ * ```html
+ *
+ * //閫夊尯绀轰緥
+ * xxx[xxxxx]xxx
+ *
+ *
+ * ```
+ */
+ trimBoundary:function (ignoreEnd) {
+ this.txtToElmBoundary();
+ var start = this.startContainer,
+ offset = this.startOffset,
+ collapsed = this.collapsed,
+ end = this.endContainer;
+ if (start.nodeType == 3) {
+ if (offset == 0) {
+ this.setStartBefore(start);
+ } else {
+ if (offset >= start.nodeValue.length) {
+ this.setStartAfter(start);
+ } else {
+ var textNode = domUtils.split(start, offset);
+ //璺熸柊缁撴潫杈圭晫
+ if (start === end) {
+ this.setEnd(textNode, this.endOffset - offset);
+ } else if (start.parentNode === end) {
+ this.endOffset += 1;
+ }
+ this.setStartBefore(textNode);
+ }
+ }
+ if (collapsed) {
+ return this.collapse(true);
+ }
+ }
+ if (!ignoreEnd) {
+ offset = this.endOffset;
+ end = this.endContainer;
+ if (end.nodeType == 3) {
+ if (offset == 0) {
+ this.setEndBefore(end);
+ } else {
+ offset < end.nodeValue.length && domUtils.split(end, offset);
+ this.setEndAfter(end);
+ }
+ }
+ }
+ return this;
+ },
+
+ /**
+ * 濡傛灉閫夊尯鍦ㄦ枃鏈殑杈圭晫涓婏紝灏辨墿灞曢夊尯鍒版枃鏈殑鐖惰妭鐐逛笂, 濡傛灉褰撳墠閫夊尯鏄棴鍚堢殑锛 鍒欎粈涔堜篃涓嶅仛
+ * @method txtToElmBoundary
+ * @remind 璇ユ搷浣滀笉浼氫慨鏀筪om鑺傜偣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+
+ /**
+ * 濡傛灉閫夊尯鍦ㄦ枃鏈殑杈圭晫涓婏紝灏辨墿灞曢夊尯鍒版枃鏈殑鐖惰妭鐐逛笂, 濡傛灉褰撳墠閫夊尯鏄棴鍚堢殑锛 鍒欐牴鎹弬鏁伴」
+ * ignoreCollapsed 鐨勫煎喅瀹氭槸鍚︽墽琛岃璋冩暣
+ * @method txtToElmBoundary
+ * @param { Boolean } ignoreCollapsed 鏄惁蹇界暐閫夊尯鐨勯棴鍚堢姸鎬侊紝 濡傛灉璇ュ弬鏁板彇鍊间负true锛 鍒
+ * 涓嶈閫夊尯鏄惁闂悎锛 閮戒細鎵ц璇ユ搷浣滐紝 鍙嶄箣锛 鍒欎笉浼氬闂悎鐨勯夊尯鎵ц璇ユ搷浣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ txtToElmBoundary:function (ignoreCollapsed) {
+ function adjust(r, c) {
+ var container = r[c + 'Container'],
+ offset = r[c + 'Offset'];
+ if (container.nodeType == 3) {
+ if (!offset) {
+ r['set' + c.replace(/(\w)/, function (a) {
+ return a.toUpperCase();
+ }) + 'Before'](container);
+ } else if (offset >= container.nodeValue.length) {
+ r['set' + c.replace(/(\w)/, function (a) {
+ return a.toUpperCase();
+ }) + 'After' ](container);
+ }
+ }
+ }
+
+ if (ignoreCollapsed || !this.collapsed) {
+ adjust(this, 'start');
+ adjust(this, 'end');
+ }
+ return this;
+ },
+
+ /**
+ * 鍦ㄥ綋鍓嶉夊尯鐨勫紑濮嬩綅缃墠鎻掑叆鑺傜偣锛屾柊鎻掑叆鐨勮妭鐐逛細琚range鍖呭惈
+ * @method insertNode
+ * @param { Node } node 闇瑕佹彃鍏ョ殑鑺傜偣
+ * @remind 鎻掑叆鐨勮妭鐐瑰彲浠ユ槸涓涓狣ocumentFragment渚濇鎻掑叆澶氫釜鑺傜偣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ insertNode:function (node) {
+ var first = node, length = 1;
+ if (node.nodeType == 11) {
+ first = node.firstChild;
+ length = node.childNodes.length;
+ }
+ this.trimBoundary(true);
+ var start = this.startContainer,
+ offset = this.startOffset;
+ var nextNode = start.childNodes[ offset ];
+ if (nextNode) {
+ start.insertBefore(node, nextNode);
+ } else {
+ start.appendChild(node);
+ }
+ if (first.parentNode === this.endContainer) {
+ this.endOffset = this.endOffset + length;
+ }
+ return this.setStartBefore(first);
+ },
+
+ /**
+ * 闂悎閫夊尯鍒板綋鍓嶉夊尯鐨勫紑濮嬩綅缃紝 骞朵笖瀹氫綅鍏夋爣鍒伴棴鍚堝悗鐨勪綅缃
+ * @method setCursor
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @see UE.dom.Range:collapse()
+ */
+
+ /**
+ * 闂悎閫夊尯锛屽彲浠ユ牴鎹弬鏁皌oEnd鐨勫兼帶鍒堕夊尯鏄悜鍓嶉棴鍚堣繕鏄悜鍚庨棴鍚堬紝 骞朵笖瀹氫綅鍏夋爣鍒伴棴鍚堝悗鐨勪綅缃
+ * @method setCursor
+ * @param { Boolean } toEnd 鏄惁鍚戝悗闂悎锛 濡傛灉涓簍rue锛 鍒欓棴鍚堥夊尯鏃讹紝 灏嗗悜缁撴潫瀹瑰櫒鏂瑰悜闂悎锛
+ * 鍙嶄箣锛屽垯鍚戝紑濮嬪鍣ㄦ柟鍚戦棴鍚
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @see UE.dom.Range:collapse(Boolean)
+ */
+ setCursor:function (toEnd, noFillData) {
+ return this.collapse(!toEnd).select(noFillData);
+ },
+
+ /**
+ * 鍒涘缓褰撳墠range鐨勪竴涓功绛撅紝璁板綍涓嬪綋鍓峳ange鐨勪綅缃紝鏂逛究褰揹om鏍戞敼鍙樻椂锛岃繕鑳芥壘鍥炲師鏉ョ殑閫夊尯浣嶇疆
+ * @method createBookmark
+ * @param { Boolean } serialize 鎺у埗杩斿洖鐨勬爣璁颁綅缃槸瀵瑰綋鍓嶄綅缃殑寮曠敤杩樻槸ID锛屽鏋滆鍊间负true锛屽垯
+ * 杩斿洖鏍囪浣嶇疆鐨処D锛 鍙嶄箣鍒欒繑鍥炴爣璁颁綅缃妭鐐圭殑寮曠敤
+ * @return { Object } 杩斿洖涓涓功绛捐褰曢敭鍊煎锛 鍏跺寘鍚殑key鏈夛細 start => 寮濮嬫爣璁扮殑ID鎴栬呭紩鐢紝
+ * end => 缁撴潫鏍囪鐨処D鎴栧紩鐢紝 id => 褰撳墠鏍囪鐨勭被鍨嬶紝 濡傛灉涓簍rue锛屽垯琛ㄧず
+ * 杩斿洖鐨勮褰曠殑绫诲瀷涓篒D锛 鍙嶄箣鍒欎负寮曠敤
+ */
+ createBookmark:function (serialize, same) {
+ var endNode,
+ startNode = this.document.createElement('span');
+ startNode.style.cssText = 'display:none;line-height:0px;';
+ startNode.appendChild(this.document.createTextNode('\u200D'));
+ startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++);
+
+ if (!this.collapsed) {
+ endNode = startNode.cloneNode(true);
+ endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++);
+ }
+ this.insertNode(startNode);
+ if (endNode) {
+ this.collapse().insertNode(endNode).setEndBefore(endNode);
+ }
+ this.setStartAfter(startNode);
+ return {
+ start:serialize ? startNode.id : startNode,
+ end:endNode ? serialize ? endNode.id : endNode : null,
+ id:serialize
+ }
+ },
+
+ /**
+ * 璋冩暣褰撳墠range鐨勮竟鐣屽埌涔︾浣嶇疆锛屽苟鍒犻櫎璇ヤ功绛惧璞℃墍鏍囪鐨勪綅缃唴鐨勮妭鐐
+ * @method moveToBookmark
+ * @param { BookMark } bookmark createBookmark鎵鍒涘缓鐨勬爣绛惧璞
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @see UE.dom.Range:createBookmark(Boolean)
+ */
+ moveToBookmark:function (bookmark) {
+ var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start,
+ end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end;
+ this.setStartBefore(start);
+ domUtils.remove(start);
+ if (end) {
+ this.setEndBefore(end);
+ domUtils.remove(end);
+ } else {
+ this.collapse(true);
+ }
+ return this;
+ },
+
+ /**
+ * 璋冩暣range鐨勮竟鐣岋紝浣垮叾"鏀惧ぇ"鍒版渶杩戠殑鐖惰妭鐐
+ * @method enlarge
+ * @remind 浼氬紩璧烽夊尯鐨勫彉鍖
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+
+ /**
+ * 璋冩暣range鐨勮竟鐣岋紝浣垮叾"鏀惧ぇ"鍒版渶杩戠殑鐖惰妭鐐癸紝鏍规嵁鍙傛暟 toBlock 鐨勫彇鍊硷紝 鍙互
+ * 瑕佹眰鎵╁ぇ涔嬪悗鐨勭埗鑺傜偣鏄痓lock鑺傜偣
+ * @method enlarge
+ * @param { Boolean } toBlock 鏄惁瑕佹眰鎵╁ぇ涔嬪悗鐨勭埗鑺傜偣蹇呴』鏄痓lock鑺傜偣
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ */
+ enlarge:function (toBlock, stopFn) {
+ var isBody = domUtils.isBody,
+ pre, node, tmp = this.document.createTextNode('');
+ if (toBlock) {
+ node = this.startContainer;
+ if (node.nodeType == 1) {
+ if (node.childNodes[this.startOffset]) {
+ pre = node = node.childNodes[this.startOffset]
+ } else {
+ node.appendChild(tmp);
+ pre = node = tmp;
+ }
+ } else {
+ pre = node;
+ }
+ while (1) {
+ if (domUtils.isBlockElm(node)) {
+ node = pre;
+ while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) {
+ node = pre;
+ }
+ this.setStartBefore(node);
+ break;
+ }
+ pre = node;
+ node = node.parentNode;
+ }
+ node = this.endContainer;
+ if (node.nodeType == 1) {
+ if (pre = node.childNodes[this.endOffset]) {
+ node.insertBefore(tmp, pre);
+ } else {
+ node.appendChild(tmp);
+ }
+ pre = node = tmp;
+ } else {
+ pre = node;
+ }
+ while (1) {
+ if (domUtils.isBlockElm(node)) {
+ node = pre;
+ while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) {
+ node = pre;
+ }
+ this.setEndAfter(node);
+ break;
+ }
+ pre = node;
+ node = node.parentNode;
+ }
+ if (tmp.parentNode === this.endContainer) {
+ this.endOffset--;
+ }
+ domUtils.remove(tmp);
+ }
+
+ // 鎵╁睍杈圭晫鍒版渶澶
+ if (!this.collapsed) {
+ while (this.startOffset == 0) {
+ if (stopFn && stopFn(this.startContainer)) {
+ break;
+ }
+ if (isBody(this.startContainer)) {
+ break;
+ }
+ this.setStartBefore(this.startContainer);
+ }
+ while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) {
+ if (stopFn && stopFn(this.endContainer)) {
+ break;
+ }
+ if (isBody(this.endContainer)) {
+ break;
+ }
+ this.setEndAfter(this.endContainer);
+ }
+ }
+ return this;
+ },
+ enlargeToBlockElm:function(ignoreEnd){
+ while(!domUtils.isBlockElm(this.startContainer)){
+ this.setStartBefore(this.startContainer);
+ }
+ if(!ignoreEnd){
+ while(!domUtils.isBlockElm(this.endContainer)){
+ this.setEndAfter(this.endContainer);
+ }
+ }
+ return this;
+ },
+ /**
+ * 璋冩暣Range鐨勮竟鐣岋紝浣垮叾"缂╁皬"鍒版渶鍚堥傜殑浣嶇疆
+ * @method adjustmentBoundary
+ * @return { UE.dom.Range } 褰撳墠range瀵硅薄
+ * @see UE.dom.Range:shrinkBoundary()
+ */
+ adjustmentBoundary:function () {
+ if (!this.collapsed) {
+ while (!domUtils.isBody(this.startContainer) &&
+ this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length &&
+ this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length
+ ) {
+
+ this.setStartAfter(this.startContainer);
+ }
+ while (!domUtils.isBody(this.endContainer) && !this.endOffset &&
+ this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length
+ ) {
+ this.setEndBefore(this.endContainer);
+ }
+ }
+ return this;
+ },
+
+ /**
+ * 缁檙ange閫夊尯涓殑鍐呭娣诲姞缁欏畾鐨刬nline鏍囩
+ * @method applyInlineStyle
+ * @param { String } tagName 闇瑕佹坊鍔犵殑鏍囩鍚
+ * @example
+ * ```html
+ *
+ * + * + * ``` + */ + + /** + * 閬嶅巻range鍐呯殑鑺傜偣銆 + * 姣忓綋閬嶅巻涓涓妭鐐规椂锛 閮戒細鎵ц鍙傛暟椤 doFn 鎸囧畾鐨勫嚱鏁帮紝 璇ュ嚱鏁扮殑鎺ュ彈褰撳墠閬嶅巻鐨勮妭鐐 + * 浣滀负鍏跺弬鏁般 + * 鍙互閫氳繃鍙傛暟椤 filterFn 鏉ユ寚瀹氫竴涓繃婊ゅ櫒锛 鍙湁绗﹀悎璇ヨ繃婊ゅ櫒杩囨护瑙勫垯鐨勮妭鐐规墠浼氳Е + * 鍙慸oFn鍑芥暟鐨勬墽琛 + * @method traversal + * @param { Function } doFn 瀵规瘡涓亶鍘嗙殑鑺傜偣瑕佹墽琛岀殑鏂规硶锛 璇ユ柟娉曟帴鍙楀綋鍓嶉亶鍘嗙殑鑺傜偣浣滀负鍏跺弬鏁 + * @param { Function } filterFn 杩囨护鍣紝 璇ュ嚱鏁版帴鍙楀綋鍓嶉亶鍘嗙殑鑺傜偣浣滀负鍙傛暟锛 濡傛灉璇ヨ妭鐐规弧瓒宠繃婊 + * 瑙勫垯锛 璇疯繑鍥瀟rue锛 璇ヨ妭鐐逛細瑙﹀彂doFn锛 鍚﹀垯锛 璇疯繑鍥瀎alse锛 鍒欒鑺傜偣涓 + * 浼氳Е鍙慸oFn銆 + * @return { UE.dom.Range } 褰撳墠range瀵硅薄 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + *
+ * + * + * ``` + */ + traversal:function(doFn,filterFn){ + if (this.collapsed) + return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + var tmpNode = domUtils.getNextDomNode(current,false,filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; +})(); + +// core/Selection.js +/** + * 閫夐泦 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 閫夊尯闆嗗悎 + * @unfile + * @module UE.dom + * @class Selection + */ +(function () { + + function getBoundaryInformation( range, start ) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse( start ); + var parent = range.parentElement(); + //濡傛灉鑺傜偣閲屾病鏈夊瓙鑺傜偣锛岀洿鎺ラ鍑 + if ( !parent.hasChildNodes() ) { + return {container:parent, offset:0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, endIndex = siblings.length - 1, index = -1, + distance; + while ( startIndex <= endIndex ) { + index = Math.floor( (startIndex + endIndex) / 2 ); + child = siblings[index]; + testRange.moveToElementText( child ); + var position = testRange.compareEndPoints( 'StartToStart', range ); + if ( position > 0 ) { + endIndex = index - 1; + } else if ( position < 0 ) { + startIndex = index + 1; + } else { + //trace:1043 + return {container:parent, offset:getIndex( child )}; + } + } + if ( index == -1 ) { + testRange.moveToElementText( parent ); + testRange.setEndPoint( 'StartToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + siblings = parent.childNodes; + if ( !distance ) { + child = siblings[siblings.length - 1]; + return {container:child, offset:child.nodeValue.length}; + } + + var i = siblings.length; + while ( distance > 0 ){ + distance -= siblings[ --i ].nodeValue.length; + } + return {container:siblings[i], offset:-distance}; + } + testRange.collapse( position > 0 ); + testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + if ( !distance ) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? + {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} : + {container:child, offset:position > 0 ? 0 : child.childNodes.length} + } + while ( distance > 0 ) { + try { + var pre = child; + child = child[position > 0 ? 'previousSibling' : 'nextSibling']; + distance -= child.nodeValue.length; + } catch ( e ) { + return {container:parent, offset:getIndex( pre )}; + } + } + return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance} + } + + /** + * 灏唅eRange杞崲涓篟ange瀵硅薄 + * @param {Range} ieRange ieRange瀵硅薄 + * @param {Range} range Range瀵硅薄 + * @return {Range} range 杩斿洖杞崲鍚庣殑Range瀵硅薄 + */ + function transformIERangeToRange( ieRange, range ) { + if ( ieRange.item ) { + range.selectNode( ieRange.item( 0 ) ); + } else { + var bi = getBoundaryInformation( ieRange, true ); + range.setStart( bi.container, bi.offset ); + if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) { + bi = getBoundaryInformation( ieRange, false ); + range.setEnd( bi.container, bi.offset ); + } + } + return range; + } + + /** + * 鑾峰緱ieRange + * @param {Selection} sel Selection瀵硅薄 + * @return {ieRange} 寰楀埌ieRange + */ + function _getIERange( sel ) { + var ieRange; + //ie涓嬫湁鍙兘鎶ラ敊 + try { + ieRange = sel.getNative().createRange(); + } catch ( e ) { + return null; + } + var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement(); + if ( ( el.ownerDocument || el ) === sel.document ) { + return ieRange; + } + return null; + } + + var Selection = dom.Selection = function ( doc ) { + var me = this, iframe; + me.document = doc; + if ( browser.ie9below ) { + iframe = domUtils.getWindow( doc ).frameElement; + domUtils.on( iframe, 'beforedeactivate', function () { + me._bakIERange = me.getIERange(); + } ); + domUtils.on( iframe, 'activate', function () { + try { + if ( !_getIERange( me ) && me._bakIERange ) { + me._bakIERange.select(); + } + } catch ( ex ) { + } + me._bakIERange = null; + } ); + } + iframe = doc = null; + }; + + Selection.prototype = { + + rangeInBody : function(rng,txtRange){ + var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; + + return node === this.document.body || domUtils.inDoc(node,this.document); + }, + + /** + * 鑾峰彇鍘熺敓seleciton瀵硅薄 + * @method getNative + * @return { Object } 鑾峰緱selection瀵硅薄 + * @example + * ```javascript + * editor.selection.getNative(); + * ``` + */ + getNative:function () { + var doc = this.document; + try { + return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection(); + } catch ( e ) { + return null; + } + }, + + /** + * 鑾峰緱ieRange + * @method getIERange + * @return { Object } 杩斿洖ie鍘熺敓鐨凴ange + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + getIERange:function () { + var ieRange = _getIERange( this ); + if ( !ieRange ) { + if ( this._bakIERange ) { + return this._bakIERange; + } + } + return ieRange; + }, + + /** + * 缂撳瓨褰撳墠閫夊尯鐨剅ange鍜岄夊尯鐨勫紑濮嬭妭鐐 + * @method cache + */ + cache:function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, + + /** + * 鑾峰彇閫夊尯寮濮嬩綅缃殑鐖惰妭鐐瑰埌body + * @method getStartElementPath + * @return { Array } 杩斿洖鐖惰妭鐐归泦鍚 + * @example + * ```javascript + * editor.selection.getStartElementPath(); + * ``` + */ + getStartElementPath:function () { + if ( this._cachedStartElementPath ) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if ( start ) { + return domUtils.findParents( start, true, null, true ) + } + return []; + }, + + /** + * 娓呯┖缂撳瓨 + * @method clear + */ + clear:function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, + + /** + * 缂栬緫鍣ㄦ槸鍚﹀緱鍒颁簡閫夊尯 + * @method isFocus + */ + isFocus:function () { + try { + if(browser.ie9below){ + + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + }else{ + return !!this.getNative().rangeCount; + } + } catch ( e ) { + return false; + } + + }, + + /** + * 鑾峰彇閫夊尯瀵瑰簲鐨凴ange + * @method getRange + * @return { Object } 寰楀埌Range瀵硅薄 + * @example + * ```javascript + * editor.selection.getRange(); + * ``` + */ + getRange:function () { + var me = this; + function optimze( range ) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while ( child && child.firstChild ) { + range.setStart( child, 0 ); + child = child.firstChild; + } + if ( !range.startContainer ) { + range.setStart( me.document.body, 0 ) + } + if ( collapsed ) { + range.collapse( true ); + } + } + + if ( me._cachedRange != null ) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range( me.document ); + + if ( browser.ie9below ) { + var nativeRange = me.getIERange(); + if ( nativeRange ) { + //澶囦唤鐨刜bakIERange鍙兘宸茬粡瀹炴晥浜嗭紝dom鏍戝彂鐢熶簡鍙樺寲姣斿浠庢簮鐮佹ā寮忓垏鍥炴潵锛屾墍浠ry涓涓嬶紝瀹炴晥灏辨斁鍒癰ody寮濮嬩綅缃 + try{ + transformIERangeToRange( nativeRange, range ); + }catch(e){ + optimze( range ); + } + + } else { + optimze( range ); + } + } else { + var sel = me.getNative(); + if ( sel && sel.rangeCount ) { + var firstRange = sel.getRangeAt( 0 ); + var lastRange = sel.getRangeAt( sel.rangeCount - 1 ); + range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset ); + if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) { + optimze( range ); + } + } else { + //trace:1734 鏈夊彲鑳藉凡缁忎笉鍦╠om鏍戜笂浜嗭紝鏍囪瘑鐨勮妭鐐 + if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){ + return this._bakRange; + } + optimze( range ); + } + } + return this._bakRange = range; + }, + + /** + * 鑾峰彇寮濮嬪厓绱狅紝鐢ㄤ簬鐘舵佸弽灏 + * @method getStart + * @return { Element } 鑾峰緱寮濮嬪厓绱 + * @example + * ```javascript + * editor.selection.getStart(); + * ``` + */ + getStart:function () { + if ( this._cachedStartElement ) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, tmp, parent; + if ( browser.ie9below ) { + if ( !range ) { + //todo 缁欑涓涓煎彲鑳戒細鏈夐棶棰 + return this.document.body.firstChild; + } + //control鍏冪礌 + if ( range.item ){ + return range.item( 0 ); + } + tmpRange = range.duplicate(); + //淇ie涓x[xx] 闂悎鍚 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 ); + tmpRange.collapse( 1 ); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while ( tmp = tmp.parentNode ) { + if ( tmp == start ) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if ( start.nodeType == 1 && start.hasChildNodes() ){ + start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )]; + } + if ( start.nodeType == 3 ){ + return start.parentNode; + } + } + return start; + }, + + /** + * 寰楀埌閫夊尯涓殑鏂囨湰 + * @method getText + * @return { String } 閫夊尯涓寘鍚殑鏂囨湰 + * @example + * ```javascript + * editor.selection.getText(); + * ``` + */ + getText:function () { + var nativeSel, nativeRange; + if ( this.isFocus() && (nativeSel = this.getNative()) ) { + nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 ); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ''; + }, + + /** + * 娓呴櫎閫夊尯 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange : function(){ + this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + } + }; +})(); + +// core/Editor.js +/** + * 缂栬緫鍣ㄤ富绫伙紝鍖呭惈缂栬緫鍣ㄦ彁渚涚殑澶ч儴鍒嗗叕鐢ㄦ帴鍙 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor鍏敤绌洪棿锛孶Editor鎵鏈夌殑鍔熻兘閮芥寕杞藉湪璇ョ┖闂翠笅 + * @unfile + * @module UE + */ + +/** + * UEditor鐨勬牳蹇冪被锛屼负鐢ㄦ埛鎻愪緵涓庣紪杈戝櫒浜や簰鐨勬帴鍙c + * @unfile + * @module UE + * @class Editor + */ + +(function () { + var uid = 0, _selectionChangeTimer; + + /** + * 鑾峰彇缂栬緫鍣ㄧ殑html鍐呭锛岃祴鍊煎埌缂栬緫鍣ㄦ墍鍦ㄨ〃鍗曠殑textarea鏂囨湰鍩熼噷闈 + * @private + * @method setValue + * @param { UE.Editor } editor 缂栬緫鍣ㄤ簨渚 + */ + function setValue(form, editor) { + var textarea; + if (editor.textarea) { + if (utils.isString(editor.textarea)) { + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { + if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { + textarea = ti; + break; + } + } + } else { + textarea = editor.textarea; + } + } + if (!textarea) { + form.appendChild(textarea = domUtils.createElement(document, 'textarea', { + 'name': editor.options.textarea, + 'id': 'ueditor_textarea_' + editor.options.textarea, + 'style': "display:none" + })); + //涓嶈浜х敓澶氫釜textarea + editor.textarea = textarea; + } + !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea ); + textarea.value = editor.hasContents() ? + (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : + '' + } + function loadPlugins(me){ + //鍒濆鍖栨彃浠 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + + } + function checkCurLang(I18N){ + for(var lang in I18N){ + return lang + } + } + + function langReadied(me){ + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** + * 缂栬緫鍣ㄥ噯澶囧氨缁悗浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event ready + * @remind render鏂规硶鎵ц瀹屾垚涔嬪悗,浼氳Е鍙戣浜嬩欢 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //缂栬緫鍣ㄥ鍦ㄥ畬鎴愬悗锛岃缂栬緫鍣ㄦ嬁鍒扮劍鐐 + * } ); + * ``` + */ + /** + * 鎵цdestroy鏂规硶,浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event destroy + * @see UE.Editor:destroy() + */ + /** + * 鎵цreset鏂规硶,浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event reset + * @see UE.Editor:reset() + */ + /** + * 鎵цfocus鏂规硶,浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event focus + * @see UE.Editor:focus(Boolean) + */ + /** + * 璇█鍔犺浇瀹屾垚浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event langReady + */ + /** + * 杩愯鍛戒护涔嬪悗浼氳Е鍙戣鍛戒护 + * @module UE + * @class Editor + * @event beforeExecCommand + */ + /** + * 杩愯鍛戒护涔嬪悗浼氳Е鍙戣鍛戒护 + * @module UE + * @class Editor + * @event afterExecCommand + */ + /** + * 杩愯鍛戒护涔嬪墠浼氳Е鍙戣鍛戒护 + * @module UE + * @class Editor + * @event firstBeforeExecCommand + */ + /** + * 鍦╣etContent鏂规硶鎵ц涔嬪墠浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event beforeGetContent + * @see UE.Editor:getContent() + */ + /** + * 鍦╣etContent鏂规硶鎵ц涔嬪悗浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event afterGetContent + * @see UE.Editor:getContent() + */ + /** + * 鍦╣etAllHtml鏂规硶鎵ц鏃朵細瑙﹀彂璇ヤ簨浠 + * @module UE + * @class Editor + * @event getAllHtml + * @see UE.Editor:getAllHtml() + */ + /** + * 鍦╯etContent鏂规硶鎵ц涔嬪墠浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event beforeSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 鍦╯etContent鏂规硶鎵ц涔嬪悗浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event afterSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 姣忓綋缂栬緫鍣ㄥ唴閮ㄩ夊尯鍙戠敓鏀瑰彉鏃讹紝灏嗚Е鍙戣浜嬩欢 + * @event selectionchange + * @warning 璇ヤ簨浠剁殑瑙﹀彂闈炲父棰戠箒锛屼笉寤鸿鍦ㄨ浜嬩欢鐨勫鐞嗚繃绋嬩腑鍋氶噸閲忕骇鐨勫鐞 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * console.log('閫夊尯鍙戠敓鏀瑰彉'); + * } + */ + /** + * 鍦ㄦ墍鏈塻electionchange鐨勭洃鍚嚱鏁版墽琛屼箣鍓嶏紝浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event beforeSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 鍦ㄦ墍鏈塻electionchange鐨勭洃鍚嚱鏁版墽琛屽畬涔嬪悗锛屼細瑙﹀彂璇ヤ簨浠 + * @module UE + * @class Editor + * @event afterSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 缂栬緫鍣ㄥ唴瀹瑰彂鐢熸敼鍙樻椂浼氳Е鍙戣浜嬩欢 + * @module UE + * @class Editor + * @event contentChange + */ + + + /** + * 浠ラ粯璁ゅ弬鏁版瀯寤轰竴涓紪杈戝櫒瀹炰緥 + * @constructor + * @remind 閫氳繃 鏀规瀯閫犳柟娉曞疄渚嬪寲鐨勭紪杈戝櫒,涓嶅甫ui灞.闇瑕乺ender鍒颁竴涓鍣,缂栬緫鍣ㄥ疄渚嬫墠鑳芥甯告覆鏌撳埌椤甸潰 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 浠ョ粰瀹氱殑鍙傛暟闆嗗悎鍒涘缓涓涓紪杈戝櫒瀹炰緥锛屽浜庢湭鎸囧畾鐨勫弬鏁帮紝灏嗗簲鐢ㄩ粯璁ゅ弬鏁般 + * @constructor + * @remind 閫氳繃 鏀规瀯閫犳柟娉曞疄渚嬪寲鐨勭紪杈戝櫒,涓嶅甫ui灞.闇瑕乺ender鍒颁竴涓鍣,缂栬緫鍣ㄥ疄渚嬫墠鑳芥甯告覆鏌撳埌椤甸潰 + * @param { Object } setting 鍒涘缓缂栬緫鍣ㄧ殑鍙傛暟 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + var Editor = UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //璁剧疆榛樿鐨勫父鐢ㄥ睘鎬 + me.setOpt(Editor.defaultOptions(me)); + + /* 灏濊瘯寮傛鍔犺浇鍚庡彴閰嶇疆 */ + me.loadServerConfig(); + + if(!utils.isEmptyObject(UE.I18N)){ + //淇敼榛樿鐨勮瑷绫诲瀷 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + + }else{ + utils.loadFile(document, { + src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + UE.plugin.load(me); + langReadied(me); + }); + } + + UE.instants['ueditorInstant' + me.uid] = me; + }; + Editor.prototype = { + registerCommand : function(name,obj){ + this.commands[name] = obj; + }, + /** + * 缂栬緫鍣ㄥ澶栨彁渚涚殑鐩戝惉ready浜嬩欢鐨勬帴鍙o紝 閫氳繃璋冪敤璇ユ柟娉曪紝杈惧埌鐨勬晥鏋滀笌鐩戝惉ready浜嬩欢鏄竴鑷寸殑 + * @method ready + * @param { Function } fn 缂栬緫鍣╮eady涔嬪悗鎵鎵ц鐨勫洖璋, 濡傛灉鍦ㄦ敞鍐屼簨浠朵箣鍓嶇紪杈戝櫒宸茬粡ready锛屽皢浼 + * 绔嬪嵆瑙﹀彂璇ュ洖璋冦 + * @remind 闇瑕佺瓑寰呯紪杈戝櫒鍔犺浇瀹屾垚鍚庢墠鑳芥墽琛岀殑浠g爜,鍙互浣跨敤璇ユ柟娉曚紶鍏 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('鍒濆鍖栧畬姣'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener('ready', fn); + } + }, + + /** + * 璇ユ柟娉曟槸鎻愪緵缁欐彃浠堕噷闈娇鐢紝璁剧疆閰嶇疆椤归粯璁ゅ + * @method setOpt + * @warning 涓夊璁剧疆閰嶇疆椤圭殑浼樺厛绾: 瀹炰緥鍖栨椂浼犲叆鍙傛暟 > setOpt()璁剧疆 > config鏂囦欢閲岃缃 + * @warning 璇ユ柟娉曚粎渚涚紪杈戝櫒鎻掍欢鍐呴儴鍜岀紪杈戝櫒鍒濆鍖栨椂璋冪敤锛屽叾浠栧湴鏂逛笉鑳借皟鐢ㄣ + * @param { String } key 缂栬緫鍣ㄧ殑鍙帴鍙楃殑閫夐」鍚嶇О + * @param { * } val 璇ラ夐」鍙帴鍙楃殑鍊 + * @example + * ```javascript + * editor.setOpt( 'initContent', '娆㈣繋浣跨敤缂栬緫鍣' ); + * ``` + */ + + /** + * 璇ユ柟娉曟槸鎻愪緵缁欐彃浠堕噷闈娇鐢紝浠key:value}闆嗗悎鐨勬柟寮忚缃彃浠跺唴鐢ㄥ埌鐨勯厤缃」榛樿鍊 + * @method setOpt + * @warning 涓夊璁剧疆閰嶇疆椤圭殑浼樺厛绾: 瀹炰緥鍖栨椂浼犲叆鍙傛暟 > setOpt()璁剧疆 > config鏂囦欢閲岃缃 + * @warning 璇ユ柟娉曚粎渚涚紪杈戝櫒鎻掍欢鍐呴儴鍜岀紪杈戝櫒鍒濆鍖栨椂璋冪敤锛屽叾浠栧湴鏂逛笉鑳借皟鐢ㄣ + * @param { Object } options 灏嗚璁剧疆鐨勯夐」鐨勯敭鍊煎瀵硅薄 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '娆㈣繋浣跨敤缂栬緫鍣' + * } ); + * ``` + */ + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt:function(key){ + return this.options[key] + }, + /** + * 閿姣佺紪杈戝櫒瀹炰緥锛屼娇鐢╰extarea浠f浛 + * @method destroy + * @example + * ```javascript + * editor.destroy(); + * ``` + */ + destroy: function () { + + var me = this; + me.fireEvent('destroy'); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement('textarea'); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = '' + } + + textarea.style.width = me.iframe.offsetWidth + 'px'; + textarea.style.height = me.iframe.offsetHeight + 'px'; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ''; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, + + /** + * 娓叉煋缂栬緫鍣ㄧ殑DOM鍒版寚瀹氬鍣 + * @method render + * @param { String } containerId 鎸囧畾涓涓鍣↖D + * @remind 鎵ц璇ユ柟娉,浼氳Е鍙憆eady浜嬩欢 + * @warning 蹇呴』涓斿彧鑳借皟鐢ㄤ竴娆 + */ + + /** + * 娓叉煋缂栬緫鍣ㄧ殑DOM鍒版寚瀹氬鍣 + * @method render + * @param { Element } containerDom 鐩存帴鎸囧畾瀹瑰櫒瀵硅薄 + * @remind 鎵ц璇ユ柟娉,浼氳Е鍙憆eady浜嬩欢 + * @warning 蹇呴』涓斿彧鑳借皟鐢ㄤ竴娆 + */ + render: function (container) { + var me = this, + options = me.options, + getStyleValue=function(attr){ + return parseInt(domUtils.getComputedStyle(container,attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if(options.initialFrameWidth){ + options.minFrameWidth = options.initialFrameWidth + }else{ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + } + if(options.initialFrameHeight){ + options.minFrameHeight = options.initialFrameHeight + }else{ + options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; + } + + container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth- + getStyleValue("padding-left")- getStyleValue("padding-right") +'px'; + container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - + getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px'; + + container.style.zIndex = options.zIndex; + + var html = ( ie && browser.version < 9 ? '' : '') + + '
' + + '' + + ( options.iframeCssUrl ? '' : '' ) + + (options.initialStyle ? '' : '') + + '
' + + '