enterkey.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. ///import core
  2. ///import plugins/undo.js
  3. ///commands 设置回车标签p或br
  4. ///commandsName EnterKey
  5. ///commandsTitle 设置回车标签p或br
  6. /**
  7. * @description 处理回车
  8. * @author zhanyi
  9. */
  10. UE.plugins['enterkey'] = function() {
  11. var hTag,
  12. me = this,
  13. tag = me.options.enterTag;
  14. me.addListener('keyup', function(type, evt) {
  15. var keyCode = evt.keyCode || evt.which;
  16. if (keyCode == 13) {
  17. var range = me.selection.getRange(),
  18. start = range.startContainer,
  19. doSave;
  20. //修正在h1-h6里边回车后不能嵌套p的问题
  21. if (!browser.ie) {
  22. if (/h\d/i.test(hTag)) {
  23. if (browser.gecko) {
  24. var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true);
  25. if (!h) {
  26. me.document.execCommand('formatBlock', false, '<p>');
  27. doSave = 1;
  28. }
  29. } else {
  30. //chrome remove div
  31. if (start.nodeType == 1) {
  32. var tmp = me.document.createTextNode(''),div;
  33. range.insertNode(tmp);
  34. div = domUtils.findParentByTagName(tmp, 'div', true);
  35. if (div) {
  36. var p = me.document.createElement('p');
  37. while (div.firstChild) {
  38. p.appendChild(div.firstChild);
  39. }
  40. div.parentNode.insertBefore(p, div);
  41. domUtils.remove(div);
  42. range.setStartBefore(tmp).setCursor();
  43. doSave = 1;
  44. }
  45. domUtils.remove(tmp);
  46. }
  47. }
  48. if (me.undoManger && doSave) {
  49. me.undoManger.save();
  50. }
  51. }
  52. //没有站位符,会出现多行的问题
  53. browser.opera && range.select();
  54. }
  55. // if(browser.ie){
  56. // range = me.selection.getRange();
  57. // start = range.startContainer;
  58. // while(start){
  59. // if(start.nodeType == 1 && start.tagName == 'P'){
  60. // break;
  61. // }
  62. // start = start.parentNode;
  63. // }
  64. // if(start && domUtils.isEmptyBlock(start)){
  65. // start.innerHTML = '&nbsp;';
  66. // var rng = me.selection.getRange();
  67. // rng.setStart(start,0).setCursor(false,true);
  68. // }
  69. // }
  70. setTimeout(function() {
  71. me.selection.getRange().scrollToView(me.autoHeightEnabled, me.autoHeightEnabled ? domUtils.getXY(me.iframe).y : 0);
  72. }, 50);
  73. }
  74. });
  75. me.addListener('keydown', function(type, evt) {
  76. var keyCode = evt.keyCode || evt.which;
  77. if (keyCode == 13) {//回车
  78. if (me.undoManger) {
  79. me.undoManger.save();
  80. }
  81. hTag = '';
  82. var range = me.selection.getRange();
  83. if (!range.collapsed) {
  84. //跨td不能删
  85. var start = range.startContainer,
  86. end = range.endContainer,
  87. startTd = domUtils.findParentByTagName(start, 'td', true),
  88. endTd = domUtils.findParentByTagName(end, 'td', true);
  89. if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) {
  90. evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);
  91. return;
  92. }
  93. }
  94. if (tag == 'p') {
  95. if (!browser.ie) {
  96. start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true);
  97. //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command
  98. //trace:2431
  99. if (!start && !browser.opera) {
  100. me.document.execCommand('formatBlock', false, '<p>');
  101. if (browser.gecko) {
  102. range = me.selection.getRange();
  103. start = domUtils.findParentByTagName(range.startContainer, 'p', true);
  104. start && domUtils.removeDirtyAttr(start);
  105. }
  106. } else {
  107. hTag = start.tagName;
  108. start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start);
  109. }
  110. }
  111. } else {
  112. evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);
  113. if (!range.collapsed) {
  114. range.deleteContents();
  115. start = range.startContainer;
  116. if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) {
  117. while (start.nodeType == 1) {
  118. if (dtd.$empty[start.tagName]) {
  119. range.setStartBefore(start).setCursor();
  120. if (me.undoManger) {
  121. me.undoManger.save();
  122. }
  123. return false;
  124. }
  125. if (!start.firstChild) {
  126. var br = range.document.createElement('br');
  127. start.appendChild(br);
  128. range.setStart(start, 0).setCursor();
  129. if (me.undoManger) {
  130. me.undoManger.save();
  131. }
  132. return false;
  133. }
  134. start = start.firstChild;
  135. }
  136. if (start === range.startContainer.childNodes[range.startOffset]) {
  137. br = range.document.createElement('br');
  138. range.insertNode(br).setCursor();
  139. } else {
  140. range.setStart(start, 0).setCursor();
  141. }
  142. } else {
  143. br = range.document.createElement('br');
  144. range.insertNode(br).setStartAfter(br).setCursor();
  145. }
  146. } else {
  147. br = range.document.createElement('br');
  148. range.insertNode(br);
  149. var parent = br.parentNode;
  150. if (parent.lastChild === br) {
  151. br.parentNode.insertBefore(br.cloneNode(true), br);
  152. range.setStartBefore(br);
  153. } else {
  154. range.setStartAfter(br);
  155. }
  156. range.setCursor();
  157. }
  158. }
  159. }
  160. });
  161. };