/** * 清除格式 * @file * @since 1.2.6.1 */ /** * 清除文字样式 * @command removeformat * @method execCommand * @param { String } cmd 命令字符串 * @param {String} tags 以逗号隔开的标签。如:strong * @param {String} style 样式如:color * @param {String} attrs 属性如:width * @example * ```javascript * editor.execCommand( 'removeformat', 'strong','color','width' ); * ``` */ UE.plugins["removeformat"] = function() { var me = this; me.setOpt({ removeFormatTags: "b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var", removeFormatAttributes: "class,style,lang,width,height,align,hspace,valign" }); me.commands["removeformat"] = { execCommand: function(cmdName, tags, style, attrs, notIncludeA) { var tagReg = new RegExp( "^(?:" + (tags || this.options.removeFormatTags).replace(/,/g, "|") + ")$", "i" ), removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split(","), range = new dom.Range(this.document), bookmark, node, parent, filter = function(node) { return node.nodeType == 1; }; function isRedundantSpan(node) { if (node.nodeType == 3 || node.tagName.toLowerCase() != "span") { return 0; } if (browser.ie) { //ie 下判断实效,所以只能简单用style来判断 //return node.style.cssText == '' ? 1 : 0; var attrs = node.attributes; if (attrs.length) { for (var i = 0, l = attrs.length; i < l; i++) { if (attrs[i].specified) { return 0; } } return 1; } } return !node.attributes.length; } function doRemove(range) { var bookmark1 = range.createBookmark(); if (range.collapsed) { range.enlarge(true); } //不能把a标签切了 if (!notIncludeA) { var aNode = domUtils.findParentByTagName( range.startContainer, "a", true ); if (aNode) { range.setStartBefore(aNode); } aNode = domUtils.findParentByTagName(range.endContainer, "a", true); if (aNode) { range.setEndAfter(aNode); } } bookmark = range.createBookmark(); node = bookmark.start; //切开始 while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { domUtils.breakParent(node, parent); domUtils.clearEmptySibling(node); } if (bookmark.end) { //切结束 node = bookmark.end; while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) { domUtils.breakParent(node, parent); domUtils.clearEmptySibling(node); } //开始去除样式 var current = domUtils.getNextDomNode(bookmark.start, false, filter), next; while (current) { if (current == bookmark.end) { break; } next = domUtils.getNextDomNode(current, true, filter); if ( !dtd.$empty[current.tagName.toLowerCase()] && !domUtils.isBookmarkNode(current) ) { if (tagReg.test(current.tagName)) { if (style) { domUtils.removeStyle(current, style); if (isRedundantSpan(current) && style != "text-decoration") { domUtils.remove(current, true); } } else { domUtils.remove(current, true); } } else { //trace:939 不能把list上的样式去掉 if ( !dtd.$tableContent[current.tagName] && !dtd.$list[current.tagName] ) { domUtils.removeAttributes(current, removeFormatAttributes); if (isRedundantSpan(current)) { domUtils.remove(current, true); } } } } current = next; } } //trace:1035 //trace:1096 不能把td上的样式去掉,比如边框 var pN = bookmark.start.parentNode; if ( domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName] ) { domUtils.removeAttributes(pN, removeFormatAttributes); } pN = bookmark.end.parentNode; if ( bookmark.end && domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName] ) { domUtils.removeAttributes(pN, removeFormatAttributes); } range.moveToBookmark(bookmark).moveToBookmark(bookmark1); //清除冗余的代码 var node = range.startContainer, tmp, collapsed = range.collapsed; while ( node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName] ) { tmp = node.parentNode; range.setStartBefore(node); //trace:937 //更新结束边界 if (range.startContainer === range.endContainer) { range.endOffset--; } domUtils.remove(node); node = tmp; } if (!collapsed) { node = range.endContainer; while ( node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName] ) { tmp = node.parentNode; range.setEndBefore(node); domUtils.remove(node); node = tmp; } } } range = this.selection.getRange(); doRemove(range); range.select(); } }; };