enterkey.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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(
  25. start,
  26. [
  27. "h1",
  28. "h2",
  29. "h3",
  30. "h4",
  31. "h5",
  32. "h6",
  33. "blockquote",
  34. "caption",
  35. "table"
  36. ],
  37. true
  38. );
  39. if (!h) {
  40. me.document.execCommand("formatBlock", false, "<p>");
  41. doSave = 1;
  42. }
  43. } else {
  44. //chrome remove div
  45. if (start.nodeType == 1) {
  46. var tmp = me.document.createTextNode(""),
  47. div;
  48. range.insertNode(tmp);
  49. div = domUtils.findParentByTagName(tmp, "div", true);
  50. if (div) {
  51. var p = me.document.createElement("p");
  52. while (div.firstChild) {
  53. p.appendChild(div.firstChild);
  54. }
  55. div.parentNode.insertBefore(p, div);
  56. domUtils.remove(div);
  57. range.setStartBefore(tmp).setCursor();
  58. doSave = 1;
  59. }
  60. domUtils.remove(tmp);
  61. }
  62. }
  63. if (me.undoManger && doSave) {
  64. me.undoManger.save();
  65. }
  66. }
  67. //没有站位符,会出现多行的问题
  68. browser.opera && range.select();
  69. } else {
  70. me.fireEvent("saveScene", true, true);
  71. }
  72. }
  73. });
  74. me.addListener("keydown", function(type, evt) {
  75. var keyCode = evt.keyCode || evt.which;
  76. if (keyCode == 13) {
  77. //回车
  78. if (me.fireEvent("beforeenterkeydown")) {
  79. domUtils.preventDefault(evt);
  80. return;
  81. }
  82. me.fireEvent("saveScene", true, true);
  83. hTag = "";
  84. var range = me.selection.getRange();
  85. if (!range.collapsed) {
  86. //跨td不能删
  87. var start = range.startContainer,
  88. end = range.endContainer,
  89. startTd = domUtils.findParentByTagName(start, "td", true),
  90. endTd = domUtils.findParentByTagName(end, "td", true);
  91. if (
  92. (startTd && endTd && startTd !== endTd) ||
  93. (!startTd && endTd) ||
  94. (startTd && !endTd)
  95. ) {
  96. evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
  97. return;
  98. }
  99. }
  100. if (tag == "p") {
  101. if (!browser.ie) {
  102. start = domUtils.findParentByTagName(
  103. range.startContainer,
  104. [
  105. "ol",
  106. "ul",
  107. "p",
  108. "h1",
  109. "h2",
  110. "h3",
  111. "h4",
  112. "h5",
  113. "h6",
  114. "blockquote",
  115. "caption"
  116. ],
  117. true
  118. );
  119. //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command
  120. //trace:2431
  121. if (!start && !browser.opera) {
  122. me.document.execCommand("formatBlock", false, "<p>");
  123. if (browser.gecko) {
  124. range = me.selection.getRange();
  125. start = domUtils.findParentByTagName(
  126. range.startContainer,
  127. "p",
  128. true
  129. );
  130. start && domUtils.removeDirtyAttr(start);
  131. }
  132. } else {
  133. hTag = start.tagName;
  134. start.tagName.toLowerCase() == "p" &&
  135. browser.gecko &&
  136. domUtils.removeDirtyAttr(start);
  137. }
  138. }
  139. } else {
  140. evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
  141. if (!range.collapsed) {
  142. range.deleteContents();
  143. start = range.startContainer;
  144. if (
  145. start.nodeType == 1 &&
  146. (start = start.childNodes[range.startOffset])
  147. ) {
  148. while (start.nodeType == 1) {
  149. if (dtd.$empty[start.tagName]) {
  150. range.setStartBefore(start).setCursor();
  151. if (me.undoManger) {
  152. me.undoManger.save();
  153. }
  154. return false;
  155. }
  156. if (!start.firstChild) {
  157. var br = range.document.createElement("br");
  158. start.appendChild(br);
  159. range.setStart(start, 0).setCursor();
  160. if (me.undoManger) {
  161. me.undoManger.save();
  162. }
  163. return false;
  164. }
  165. start = start.firstChild;
  166. }
  167. if (start === range.startContainer.childNodes[range.startOffset]) {
  168. br = range.document.createElement("br");
  169. range.insertNode(br).setCursor();
  170. } else {
  171. range.setStart(start, 0).setCursor();
  172. }
  173. } else {
  174. br = range.document.createElement("br");
  175. range.insertNode(br).setStartAfter(br).setCursor();
  176. }
  177. } else {
  178. br = range.document.createElement("br");
  179. range.insertNode(br);
  180. var parent = br.parentNode;
  181. if (parent.lastChild === br) {
  182. br.parentNode.insertBefore(br.cloneNode(true), br);
  183. range.setStartBefore(br);
  184. } else {
  185. range.setStartAfter(br);
  186. }
  187. range.setCursor();
  188. }
  189. }
  190. }
  191. });
  192. };