inserthtml.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. ///import core
  2. /**
  3. * @description 插入内容
  4. * @name baidu.editor.execCommand
  5. * @param {String} cmdName inserthtml插入内容的命令
  6. * @param {String} html 要插入的内容
  7. * @author zhanyi
  8. */
  9. UE.commands['inserthtml'] = {
  10. execCommand: function (command,html,notSerialize){
  11. var me = this,
  12. range,
  13. div;
  14. if(!html){
  15. return;
  16. }
  17. range = me.selection.getRange();
  18. div = range.document.createElement( 'div' );
  19. div.style.display = 'inline';
  20. var serialize = me.serialize;
  21. if (!notSerialize && serialize) {
  22. var node = serialize.parseHTML(html);
  23. node = serialize.transformInput(node);
  24. node = serialize.filter(node);
  25. html = serialize.toHTML(node);
  26. }
  27. div.innerHTML = utils.trim( html );
  28. if ( !range.collapsed ) {
  29. var tmpNode = range.startContainer;
  30. if(domUtils.isFillChar(tmpNode)){
  31. range.setStartBefore(tmpNode)
  32. }
  33. tmpNode = range.endContainer;
  34. if(domUtils.isFillChar(tmpNode)){
  35. range.setEndAfter(tmpNode)
  36. }
  37. range.txtToElmBoundary();
  38. //结束边界可能放到了br的前边,要把br包含进来
  39. // x[xxx]<br/>
  40. if(range.endContainer && range.endContainer.nodeType == 1){
  41. tmpNode = range.endContainer.childNodes[range.endOffset];
  42. if(tmpNode && domUtils.isBr(tmpNode)){
  43. range.setEndAfter(tmpNode);
  44. }
  45. }
  46. if(range.startOffset == 0){
  47. tmpNode = range.startContainer;
  48. if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){
  49. tmpNode = range.endContainer;
  50. if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){
  51. me.body.innerHTML = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
  52. range.setStart(me.body.firstChild,0).collapse(true)
  53. }
  54. }
  55. }
  56. !range.collapsed && range.deleteContents();
  57. if(range.startContainer.nodeType == 1){
  58. var child = range.startContainer.childNodes[range.startOffset],pre;
  59. if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){
  60. range.setEnd(pre,pre.childNodes.length).collapse();
  61. while(child.firstChild){
  62. pre.appendChild(child.firstChild);
  63. }
  64. domUtils.remove(child);
  65. }
  66. }
  67. }
  68. var child,parent,pre,tmp,hadBreak = 0, nextNode;
  69. //如果当前位置选中了fillchar要干掉,要不会产生空行
  70. if(range.inFillChar()){
  71. child = range.startContainer;
  72. range.setStartBefore(child).collapse(true);
  73. domUtils.remove(child);
  74. }
  75. while ( child = div.firstChild ) {
  76. range.insertNode( child );
  77. nextNode = child.nextSibling;
  78. if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){
  79. parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } );
  80. if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){
  81. if(!dtd[parent.tagName][child.nodeName]){
  82. pre = parent;
  83. }else{
  84. tmp = child.parentNode;
  85. while (tmp !== parent){
  86. pre = tmp;
  87. tmp = tmp.parentNode;
  88. }
  89. }
  90. domUtils.breakParent( child, pre || tmp );
  91. //去掉break后前一个多余的节点 <p>|<[p> ==> <p></p><div></div><p>|</p>
  92. var pre = child.previousSibling;
  93. domUtils.trimWhiteTextNode(pre);
  94. if(!pre.childNodes.length){
  95. domUtils.remove(pre);
  96. }
  97. //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位
  98. if(!browser.ie &&
  99. (next = child.nextSibling) &&
  100. domUtils.isBlockElm(next) &&
  101. next.lastChild &&
  102. !domUtils.isBr(next.lastChild)){
  103. next.appendChild(me.document.createElement('br'));
  104. }
  105. hadBreak = 1;
  106. }
  107. }
  108. var next = child.nextSibling;
  109. if(!div.firstChild && next && domUtils.isBlockElm(next)){
  110. range.setStart(next,0).collapse(true);
  111. break;
  112. }
  113. range.setEndAfter( child ).collapse();
  114. }
  115. child = range.startContainer;
  116. if(nextNode && domUtils.isBr(nextNode)){
  117. domUtils.remove(nextNode)
  118. }
  119. //用chrome可能有空白展位符
  120. if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){
  121. if(nextNode = child.nextSibling){
  122. domUtils.remove(child);
  123. if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){
  124. range.setStart(nextNode,0).collapse(true).shrinkBoundary()
  125. }
  126. }else{
  127. child.innerHTML = browser.ie ? domUtils.fillChar : '<br/>';
  128. }
  129. }
  130. //加上true因为在删除表情等时会删两次,第一次是删的fillData
  131. range.select(true);
  132. setTimeout(function(){
  133. range = me.selection.getRange();
  134. range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0);
  135. me.fireEvent('afterinserthtml');
  136. },200);
  137. }
  138. };