inserthtml.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. tds = me.currentSelectedArr;
  15. range = me.selection.getRange();
  16. div = range.document.createElement( 'div' );
  17. div.style.display = 'inline';
  18. var serialize = me.serialize;
  19. if (!notSerialize && serialize) {
  20. var node = serialize.parseHTML(html);
  21. node = serialize.transformInput(node);
  22. node = serialize.filter(node);
  23. html = serialize.toHTML(node);
  24. }
  25. div.innerHTML = utils.trim( html );
  26. try{
  27. me.adjustTable && me.adjustTable(div);
  28. }catch(e){}
  29. if(tds && tds.length){
  30. for(var i=0,ti;ti=tds[i++];){
  31. ti.className = ''
  32. }
  33. tds[0].innerHTML = '';
  34. range.setStart(tds[0],0).collapse(true);
  35. me.currentSelectedArr = [];
  36. }
  37. if ( !range.collapsed ) {
  38. range.deleteContents();
  39. if(range.startContainer.nodeType == 1){
  40. var child = range.startContainer.childNodes[range.startOffset],pre;
  41. if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){
  42. range.setEnd(pre,pre.childNodes.length).collapse();
  43. while(child.firstChild){
  44. pre.appendChild(child.firstChild);
  45. }
  46. domUtils.remove(child);
  47. }
  48. }
  49. }
  50. var child,parent,pre,tmp,hadBreak = 0;
  51. while ( child = div.firstChild ) {
  52. range.insertNode( child );
  53. if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){
  54. parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } );
  55. if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){
  56. if(!dtd[parent.tagName][child.nodeName]){
  57. pre = parent;
  58. }else{
  59. tmp = child.parentNode;
  60. while (tmp !== parent){
  61. pre = tmp;
  62. tmp = tmp.parentNode;
  63. }
  64. }
  65. domUtils.breakParent( child, pre || tmp );
  66. //去掉break后前一个多余的节点 <p>|<[p> ==> <p></p><div></div><p>|</p>
  67. var pre = child.previousSibling;
  68. domUtils.trimWhiteTextNode(pre);
  69. if(!pre.childNodes.length){
  70. domUtils.remove(pre);
  71. }
  72. //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位
  73. if(!browser.ie &&
  74. (next = child.nextSibling) &&
  75. domUtils.isBlockElm(next) &&
  76. next.lastChild &&
  77. !domUtils.isBr(next.lastChild)){
  78. next.appendChild(me.document.createElement('br'))
  79. }
  80. hadBreak = 1;
  81. }
  82. }
  83. var next = child.nextSibling;
  84. if(!div.firstChild && next && domUtils.isBlockElm(next)){
  85. range.setStart(next,0).collapse(true);
  86. break;
  87. }
  88. range.setEndAfter( child ).collapse();
  89. }
  90. child = range.startContainer;
  91. //用chrome可能有空白展位符
  92. if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){
  93. child.innerHTML = browser.ie ? '' : '<br/>'
  94. }
  95. //加上true因为在删除表情等时会删两次,第一次是删的fillData
  96. range.select(true);
  97. setTimeout(function(){
  98. range = me.selection.getRange();
  99. range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0);
  100. },200)
  101. }
  102. };