link.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. ///import core
  2. ///commands 超链接,取消链接
  3. ///commandsName Link,Unlink
  4. ///commandsTitle 超链接,取消链接
  5. ///commandsDialog dialogs\link\link.html
  6. /**
  7. * 超链接
  8. * @function
  9. * @name baidu.editor.execCommand
  10. * @param {String} cmdName link插入超链接
  11. * @param {Object} options url地址,title标题,target是否打开新页
  12. * @author zhanyi
  13. */
  14. /**
  15. * 取消链接
  16. * @function
  17. * @name baidu.editor.execCommand
  18. * @param {String} cmdName unlink取消链接
  19. * @author zhanyi
  20. */
  21. (function() {
  22. function optimize( range ) {
  23. var start = range.startContainer,end = range.endContainer;
  24. if ( start = domUtils.findParentByTagName( start, 'a', true ) ) {
  25. range.setStartBefore( start )
  26. }
  27. if ( end = domUtils.findParentByTagName( end, 'a', true ) ) {
  28. range.setEndAfter( end )
  29. }
  30. }
  31. UE.commands['unlink'] = {
  32. execCommand : function() {
  33. var as,
  34. range = new dom.Range(this.document),
  35. tds = this.currentSelectedArr,
  36. bookmark;
  37. if(tds && tds.length >0){
  38. for(var i=0,ti;ti=tds[i++];){
  39. as = domUtils.getElementsByTagName(ti,'a');
  40. for(var j=0,aj;aj=as[j++];){
  41. domUtils.remove(aj,true);
  42. }
  43. }
  44. if(domUtils.isEmptyNode(tds[0])){
  45. range.setStart(tds[0],0).setCursor();
  46. }else{
  47. range.selectNodeContents(tds[0]).select()
  48. }
  49. }else{
  50. range = this.selection.getRange();
  51. if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){
  52. return;
  53. }
  54. bookmark = range.createBookmark();
  55. optimize( range );
  56. range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select();
  57. }
  58. },
  59. queryCommandState : function(){
  60. return !this.highlight && this.queryCommandValue('link') ? 0 : -1;
  61. }
  62. };
  63. function doLink(range,opt){
  64. optimize( range = range.adjustmentBoundary() );
  65. var start = range.startContainer;
  66. if(start.nodeType == 1){
  67. start = start.childNodes[range.startOffset];
  68. if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){
  69. start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue||opt.href);
  70. }
  71. }
  72. range.removeInlineStyle( 'a' );
  73. if ( range.collapsed ) {
  74. var a = range.document.createElement( 'a'),
  75. text = '';
  76. if(opt.textValue){
  77. text = utils.html(opt.textValue);
  78. delete opt.textValue;
  79. }else{
  80. text = utils.html(opt.href);
  81. }
  82. domUtils.setAttributes( a, opt );
  83. range.insertNode( a );
  84. a[browser.ie ? 'innerText' : 'textContent'] = text;
  85. range.selectNode( a );
  86. } else {
  87. range.applyInlineStyle( 'a', opt )
  88. }
  89. }
  90. UE.commands['link'] = {
  91. queryCommandState : function(){
  92. return this.highlight ? -1 :0;
  93. },
  94. execCommand : function( cmdName, opt ) {
  95. var range = new dom.Range(this.document),
  96. tds = this.currentSelectedArr;
  97. opt.data_ue_src && (opt.data_ue_src = utils.unhtml(opt.data_ue_src));
  98. opt.href && (opt.href = utils.unhtml(opt.href));
  99. opt.textValue && (opt.textValue = utils.unhtml(opt.textValue));
  100. if(tds && tds.length){
  101. for(var i=0,ti;ti=tds[i++];){
  102. if(domUtils.isEmptyNode(ti)){
  103. ti[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue || opt.href)
  104. }
  105. doLink(range.selectNodeContents(ti),opt)
  106. }
  107. range.selectNodeContents(tds[0]).select()
  108. }else{
  109. doLink(range=this.selection.getRange(),opt);
  110. //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题
  111. range.collapse().select(true);
  112. }
  113. },
  114. queryCommandValue : function() {
  115. var range = new dom.Range(this.document),
  116. tds = this.currentSelectedArr,
  117. as,
  118. node;
  119. if(tds && tds.length){
  120. for(var i=0,ti;ti=tds[i++];){
  121. as = ti.getElementsByTagName('a');
  122. if(as[0])
  123. return as[0]
  124. }
  125. }else{
  126. range = this.selection.getRange();
  127. if ( range.collapsed ) {
  128. node = this.selection.getStart();
  129. if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) ) {
  130. return node;
  131. }
  132. } else {
  133. //trace:1111 如果是<p><a>xx</a></p> startContainer是p就会找不到a
  134. range.shrinkBoundary();
  135. var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset],
  136. end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1],
  137. common = range.getCommonAncestor();
  138. node = domUtils.findParentByTagName( common, 'a', true );
  139. if ( !node && common.nodeType == 1){
  140. var as = common.getElementsByTagName( 'a' ),
  141. ps,pe;
  142. for ( var i = 0,ci; ci = as[i++]; ) {
  143. ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end);
  144. if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS)
  145. &&
  146. (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS)
  147. ) {
  148. node = ci;
  149. break;
  150. }
  151. }
  152. }
  153. return node;
  154. }
  155. }
  156. }
  157. };
  158. })();