enterkey.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. }else{
  55. me.fireEvent('saveScene',true,true)
  56. }
  57. }
  58. });
  59. me.addListener('keydown', function(type, evt) {
  60. var keyCode = evt.keyCode || evt.which;
  61. if (keyCode == 13) {//回车
  62. if(me.fireEvent('beforeenterkeydown')){
  63. domUtils.preventDefault(evt);
  64. return;
  65. }
  66. me.fireEvent('saveScene',true,true);
  67. hTag = '';
  68. var range = me.selection.getRange();
  69. if (!range.collapsed) {
  70. //跨td不能删
  71. var start = range.startContainer,
  72. end = range.endContainer,
  73. startTd = domUtils.findParentByTagName(start, 'td', true),
  74. endTd = domUtils.findParentByTagName(end, 'td', true);
  75. if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) {
  76. evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);
  77. return;
  78. }
  79. }
  80. if (tag == 'p') {
  81. if (!browser.ie) {
  82. start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true);
  83. //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command
  84. //trace:2431
  85. if (!start && !browser.opera) {
  86. me.document.execCommand('formatBlock', false, '<p>');
  87. if (browser.gecko) {
  88. range = me.selection.getRange();
  89. start = domUtils.findParentByTagName(range.startContainer, 'p', true);
  90. start && domUtils.removeDirtyAttr(start);
  91. }
  92. } else {
  93. hTag = start.tagName;
  94. start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start);
  95. }
  96. }
  97. } else {
  98. evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);
  99. if (!range.collapsed) {
  100. range.deleteContents();
  101. start = range.startContainer;
  102. if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) {
  103. while (start.nodeType == 1) {
  104. if (dtd.$empty[start.tagName]) {
  105. range.setStartBefore(start).setCursor();
  106. if (me.undoManger) {
  107. me.undoManger.save();
  108. }
  109. return false;
  110. }
  111. if (!start.firstChild) {
  112. var br = range.document.createElement('br');
  113. start.appendChild(br);
  114. range.setStart(start, 0).setCursor();
  115. if (me.undoManger) {
  116. me.undoManger.save();
  117. }
  118. return false;
  119. }
  120. start = start.firstChild;
  121. }
  122. if (start === range.startContainer.childNodes[range.startOffset]) {
  123. br = range.document.createElement('br');
  124. range.insertNode(br).setCursor();
  125. } else {
  126. range.setStart(start, 0).setCursor();
  127. }
  128. } else {
  129. br = range.document.createElement('br');
  130. range.insertNode(br).setStartAfter(br).setCursor();
  131. }
  132. } else {
  133. br = range.document.createElement('br');
  134. range.insertNode(br);
  135. var parent = br.parentNode;
  136. if (parent.lastChild === br) {
  137. br.parentNode.insertBefore(br.cloneNode(true), br);
  138. range.setStartBefore(br);
  139. } else {
  140. range.setStartAfter(br);
  141. }
  142. range.setCursor();
  143. }
  144. }
  145. }
  146. });
  147. };