| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | /** * 超链接 * @file * @since 1.2.6.1 *//** * 插入超链接 * @command link * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } options   设置自定义属性,例如:url、title、target * @example * ```javascript * editor.execCommand( 'link', '{ *     url:'ueditor.baidu.com', *     title:'ueditor', *     target:'_blank' * }' ); * ``` *//** * 返回当前选中的第一个超链接节点 * @command link * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { Element } 超链接节点 * @example * ```javascript * editor.queryCommandValue( 'link' ); * ``` *//** * 取消超链接 * @command unlink * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'unlink'); * ``` */UE.plugins['link'] = function(){    function optimize( range ) {        var start = range.startContainer,end = range.endContainer;        if ( start = domUtils.findParentByTagName( start, 'a', true ) ) {            range.setStartBefore( start );        }        if ( end = domUtils.findParentByTagName( end, 'a', true ) ) {            range.setEndAfter( end );        }    }    UE.commands['unlink'] = {        execCommand : function() {            var range = this.selection.getRange(),                bookmark;            if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){                return;            }            bookmark = range.createBookmark();            optimize( range );            range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select();        },        queryCommandState : function(){            return !this.highlight && this.queryCommandValue('link') ?  0 : -1;        }    };    function doLink(range,opt,me){        var rngClone = range.cloneRange(),            link = me.queryCommandValue('link');        optimize( range = range.adjustmentBoundary() );        var start = range.startContainer;        if(start.nodeType == 1 && link){            start = start.childNodes[range.startOffset];            if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){                start[browser.ie ? 'innerText' : 'textContent'] =  utils.html(opt.textValue||opt.href);            }        }        if( !rngClone.collapsed || link){            range.removeInlineStyle( 'a' );            rngClone = range.cloneRange();        }        if ( rngClone.collapsed ) {            var a = range.document.createElement( 'a'),                text = '';            if(opt.textValue){                text =   utils.html(opt.textValue);                delete opt.textValue;            }else{                text =   utils.html(opt.href);            }            domUtils.setAttributes( a, opt );            start =  domUtils.findParentByTagName( rngClone.startContainer, 'a', true );            if(start && domUtils.isInNodeEndBoundary(rngClone,start)){                range.setStartAfter(start).collapse(true);            }            a[browser.ie ? 'innerText' : 'textContent'] = text;            range.insertNode(a).selectNode( a );        } else {            range.applyInlineStyle( 'a', opt );        }    }    UE.commands['link'] = {        execCommand : function( cmdName, opt ) {            var range;            opt._href && (opt._href = utils.unhtml(opt._href,/[<">]/g));            opt.href && (opt.href = utils.unhtml(opt.href,/[<">]/g));            opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<">]/g));            doLink(range=this.selection.getRange(),opt,this);            //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题            range.collapse().select(true);        },        queryCommandValue : function() {            var range = this.selection.getRange(),                node;            if ( range.collapsed ) {//                    node = this.selection.getStart();                //在ie下getstart()取值偏上了                node = range.startContainer;                node = node.nodeType == 1 ? node : node.parentNode;                if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) {                    return node;                }            } else {                //trace:1111  如果是<p><a>xx</a></p> startContainer是p就会找不到a                range.shrinkBoundary();                var start = range.startContainer.nodeType  == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset],                    end =  range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1],                    common = range.getCommonAncestor();                node = domUtils.findParentByTagName( common, 'a', true );                if ( !node && common.nodeType == 1){                    var as = common.getElementsByTagName( 'a' ),                        ps,pe;                    for ( var i = 0,ci; ci = as[i++]; ) {                        ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end);                        if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS)                            &&                            (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS)                            ) {                            node = ci;                            break;                        }                    }                }                return node;            }        },        queryCommandState : function() {            //判断如果是视频的话连接不可用            //fix 853            var img = this.selection.getRange().getClosedNode(),                flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1);            return flag ? -1 : 0;        }    };};
 |