| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | /** * 清除格式 * @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);                //清除冗余的代码 <b><bookmark></b>                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();        }    };};
 |