///import core ///import plugins/undo.js ///commands 设置回车标签p或br ///commandsName EnterKey ///commandsTitle 设置回车标签p或br /** * @description 处理回车 * @author zhanyi */ UE.plugins["enterkey"] = function() { var hTag, me = this, tag = me.options.enterTag; me.addListener("keyup", function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 13) { var range = me.selection.getRange(), start = range.startContainer, doSave; //修正在h1-h6里边回车后不能嵌套p的问题 if (!browser.ie) { if (/h\d/i.test(hTag)) { if (browser.gecko) { var h = domUtils.findParentByTagName( start, [ "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption", "table" ], true ); if (!h) { me.document.execCommand("formatBlock", false, "

"); doSave = 1; } } else { //chrome remove div if (start.nodeType == 1) { var tmp = me.document.createTextNode(""), div; range.insertNode(tmp); div = domUtils.findParentByTagName(tmp, "div", true); if (div) { var p = me.document.createElement("p"); while (div.firstChild) { p.appendChild(div.firstChild); } div.parentNode.insertBefore(p, div); domUtils.remove(div); range.setStartBefore(tmp).setCursor(); doSave = 1; } domUtils.remove(tmp); } } if (me.undoManger && doSave) { me.undoManger.save(); } } //没有站位符,会出现多行的问题 browser.opera && range.select(); } else { me.fireEvent("saveScene", true, true); } } }); me.addListener("keydown", function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 13) { //回车 if (me.fireEvent("beforeenterkeydown")) { domUtils.preventDefault(evt); return; } me.fireEvent("saveScene", true, true); hTag = ""; var range = me.selection.getRange(); if (!range.collapsed) { //跨td不能删 var start = range.startContainer, end = range.endContainer, startTd = domUtils.findParentByTagName(start, "td", true), endTd = domUtils.findParentByTagName(end, "td", true); if ( (startTd && endTd && startTd !== endTd) || (!startTd && endTd) || (startTd && !endTd) ) { evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); return; } } if (tag == "p") { if (!browser.ie) { start = domUtils.findParentByTagName( range.startContainer, [ "ol", "ul", "p", "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption" ], true ); //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command //trace:2431 if (!start && !browser.opera) { me.document.execCommand("formatBlock", false, "

"); if (browser.gecko) { range = me.selection.getRange(); start = domUtils.findParentByTagName( range.startContainer, "p", true ); start && domUtils.removeDirtyAttr(start); } } else { hTag = start.tagName; start.tagName.toLowerCase() == "p" && browser.gecko && domUtils.removeDirtyAttr(start); } } } else { evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); if (!range.collapsed) { range.deleteContents(); start = range.startContainer; if ( start.nodeType == 1 && (start = start.childNodes[range.startOffset]) ) { while (start.nodeType == 1) { if (dtd.$empty[start.tagName]) { range.setStartBefore(start).setCursor(); if (me.undoManger) { me.undoManger.save(); } return false; } if (!start.firstChild) { var br = range.document.createElement("br"); start.appendChild(br); range.setStart(start, 0).setCursor(); if (me.undoManger) { me.undoManger.save(); } return false; } start = start.firstChild; } if (start === range.startContainer.childNodes[range.startOffset]) { br = range.document.createElement("br"); range.insertNode(br).setCursor(); } else { range.setStart(start, 0).setCursor(); } } else { br = range.document.createElement("br"); range.insertNode(br).setStartAfter(br).setCursor(); } } else { br = range.document.createElement("br"); range.insertNode(br); var parent = br.parentNode; if (parent.lastChild === br) { br.parentNode.insertBefore(br.cloneNode(true), br); range.setStartBefore(br); } else { range.setStartAfter(br); } range.setCursor(); } } } }); };