| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- ///import core
- ///commands 超链接,取消链接
- ///commandsName Link,Unlink
- ///commandsTitle 超链接,取消链接
- ///commandsDialog dialogs\link\link.html
- /**
- * 超链接
- * @function
- * @name baidu.editor.execCommand
- * @param {String} cmdName link插入超链接
- * @param {Object} options url地址,title标题,target是否打开新页
- * @author zhanyi
- */
- /**
- * 取消链接
- * @function
- * @name baidu.editor.execCommand
- * @param {String} cmdName unlink取消链接
- * @author zhanyi
- */
- (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 as,
- range = new dom.Range(this.document),
- tds = this.currentSelectedArr,
- bookmark;
- if(tds && tds.length >0){
- for(var i=0,ti;ti=tds[i++];){
- as = domUtils.getElementsByTagName(ti,'a');
- for(var j=0,aj;aj=as[j++];){
- domUtils.remove(aj,true);
- }
- }
- if(domUtils.isEmptyNode(tds[0])){
- range.setStart(tds[0],0).setCursor();
- }else{
- range.selectNodeContents(tds[0]).select()
- }
- }else{
- range = this.selection.getRange();
- 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){
- optimize( range = range.adjustmentBoundary() );
- var start = range.startContainer;
- if(start.nodeType == 1){
- 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);
- }
- }
- range.removeInlineStyle( 'a' );
- if ( range.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 );
- range.insertNode( a );
- a[browser.ie ? 'innerText' : 'textContent'] = text;
- range.selectNode( a );
- } else {
- range.applyInlineStyle( 'a', opt )
- }
- }
- UE.commands['link'] = {
- queryCommandState : function(){
- return this.highlight ? -1 :0;
- },
- execCommand : function( cmdName, opt ) {
- var range = new dom.Range(this.document),
- tds = this.currentSelectedArr;
- opt.data_ue_src && (opt.data_ue_src = utils.unhtml(opt.data_ue_src));
- opt.href && (opt.href = utils.unhtml(opt.href));
- opt.textValue && (opt.textValue = utils.unhtml(opt.textValue));
- if(tds && tds.length){
- for(var i=0,ti;ti=tds[i++];){
- if(domUtils.isEmptyNode(ti)){
- ti[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue || opt.href)
- }
- doLink(range.selectNodeContents(ti),opt)
- }
- range.selectNodeContents(tds[0]).select()
-
- }else{
- doLink(range=this.selection.getRange(),opt);
- //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题
- range.collapse().select(true);
- }
- },
- queryCommandValue : function() {
- var range = new dom.Range(this.document),
- tds = this.currentSelectedArr,
- as,
- node;
- if(tds && tds.length){
- for(var i=0,ti;ti=tds[i++];){
- as = ti.getElementsByTagName('a');
- if(as[0])
- return as[0]
- }
- }else{
- range = this.selection.getRange();
- if ( range.collapsed ) {
- node = this.selection.getStart();
- if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) ) {
- 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;
- }
- }
- }
- };
- })();
|