123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- /* 处理特殊键的兼容性问题 */
- UE.plugins["keystrokes"] = function() {
- var me = this;
- var collapsed = true;
- me.addListener("keydown", function(type, evt) {
- var keyCode = evt.keyCode || evt.which,
- rng = me.selection.getRange();
- //处理全选的情况
- if (
- !rng.collapsed &&
- !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) &&
- ((keyCode >= 65 && keyCode <= 90) ||
- (keyCode >= 48 && keyCode <= 57) ||
- (keyCode >= 96 && keyCode <= 111) ||
- {
- 13: 1,
- 8: 1,
- 46: 1
- }[keyCode])
- ) {
- var tmpNode = rng.startContainer;
- if (domUtils.isFillChar(tmpNode)) {
- rng.setStartBefore(tmpNode);
- }
- tmpNode = rng.endContainer;
- if (domUtils.isFillChar(tmpNode)) {
- rng.setEndAfter(tmpNode);
- }
- rng.txtToElmBoundary();
- //结束边界可能放到了br的前边,要把br包含进来
- // x[xxx]<br/>
- if (rng.endContainer && rng.endContainer.nodeType == 1) {
- tmpNode = rng.endContainer.childNodes[rng.endOffset];
- if (tmpNode && domUtils.isBr(tmpNode)) {
- rng.setEndAfter(tmpNode);
- }
- }
- if (rng.startOffset == 0) {
- tmpNode = rng.startContainer;
- if (domUtils.isBoundaryNode(tmpNode, "firstChild")) {
- tmpNode = rng.endContainer;
- if (
- rng.endOffset ==
- (tmpNode.nodeType == 3
- ? tmpNode.nodeValue.length
- : tmpNode.childNodes.length) &&
- domUtils.isBoundaryNode(tmpNode, "lastChild")
- ) {
- me.fireEvent("saveScene");
- me.body.innerHTML = "<p>" + (browser.ie ? "" : "<br/>") + "</p>";
- rng.setStart(me.body.firstChild, 0).setCursor(false, true);
- me._selectionChange();
- return;
- }
- }
- }
- }
- //处理backspace
- if (keyCode == keymap.Backspace) {
- rng = me.selection.getRange();
- collapsed = rng.collapsed;
- if (me.fireEvent("delkeydown", evt)) {
- return;
- }
- var start, end;
- //避免按两次删除才能生效的问题
- if (rng.collapsed && rng.inFillChar()) {
- start = rng.startContainer;
- if (domUtils.isFillChar(start)) {
- rng.setStartBefore(start).shrinkBoundary(true).collapse(true);
- domUtils.remove(start);
- } else {
- start.nodeValue = start.nodeValue.replace(
- new RegExp("^" + domUtils.fillChar),
- ""
- );
- rng.startOffset--;
- rng.collapse(true).select(true);
- }
- }
- //解决选中control元素不能删除的问题
- if ((start = rng.getClosedNode())) {
- me.fireEvent("saveScene");
- rng.setStartBefore(start);
- domUtils.remove(start);
- rng.setCursor();
- me.fireEvent("saveScene");
- domUtils.preventDefault(evt);
- return;
- }
- //阻止在table上的删除
- if (!browser.ie) {
- start = domUtils.findParentByTagName(rng.startContainer, "table", true);
- end = domUtils.findParentByTagName(rng.endContainer, "table", true);
- if ((start && !end) || (!start && end) || start !== end) {
- evt.preventDefault();
- return;
- }
- }
- }
- //处理tab键的逻辑
- if (keyCode == keymap.Tab) {
- //不处理以下标签
- var excludeTagNameForTabKey = {
- ol: 1,
- ul: 1,
- table: 1
- };
- //处理组件里的tab按下事件
- if (me.fireEvent("tabkeydown", evt)) {
- domUtils.preventDefault(evt);
- return;
- }
- var range = me.selection.getRange();
- me.fireEvent("saveScene");
- for (
- var i = 0,
- txt = "",
- tabSize = me.options.tabSize || 4,
- tabNode = me.options.tabNode || " ";
- i < tabSize;
- i++
- ) {
- txt += tabNode;
- }
- var span = me.document.createElement("span");
- span.innerHTML = txt + domUtils.fillChar;
- if (range.collapsed) {
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true);
- } else {
- var filterFn = function(node) {
- return (
- domUtils.isBlockElm(node) &&
- !excludeTagNameForTabKey[node.tagName.toLowerCase()]
- );
- };
- //普通的情况
- start = domUtils.findParent(range.startContainer, filterFn, true);
- end = domUtils.findParent(range.endContainer, filterFn, true);
- if (start && end && start === end) {
- range.deleteContents();
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true);
- } else {
- var bookmark = range.createBookmark();
- range.enlarge(true);
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(bookmark2.start, false, filterFn);
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- current.insertBefore(
- span.cloneNode(true).firstChild,
- current.firstChild
- );
- current = domUtils.getNextDomNode(current, false, filterFn);
- }
- range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select();
- }
- }
- domUtils.preventDefault(evt);
- }
- //trace:1634
- //ff的del键在容器空的时候,也会删除
- if (browser.gecko && keyCode == 46) {
- range = me.selection.getRange();
- if (range.collapsed) {
- start = range.startContainer;
- if (domUtils.isEmptyBlock(start)) {
- var parent = start.parentNode;
- while (
- domUtils.getChildCount(parent) == 1 &&
- !domUtils.isBody(parent)
- ) {
- start = parent;
- parent = parent.parentNode;
- }
- if (start === parent.lastChild) evt.preventDefault();
- return;
- }
- }
- }
- /* 修复在编辑区域快捷键 (Mac:meta+alt+I; Win:ctrl+shift+I) 打不开 chrome 控制台的问题 */
- browser.chrome &&
- me.on("keydown", function(type, e) {
- var keyCode = e.keyCode || e.which;
- if (
- ((e.metaKey && e.altKey) || (e.ctrlKey && e.shiftKey)) &&
- keyCode == 73
- ) {
- return true;
- }
- });
- });
- me.addListener("keyup", function(type, evt) {
- var keyCode = evt.keyCode || evt.which,
- rng,
- me = this;
- if (keyCode == keymap.Backspace) {
- if (me.fireEvent("delkeyup")) {
- return;
- }
- rng = me.selection.getRange();
- if (rng.collapsed) {
- var tmpNode,
- autoClearTagName = ["h1", "h2", "h3", "h4", "h5", "h6"];
- if (
- (tmpNode = domUtils.findParentByTagName(
- rng.startContainer,
- autoClearTagName,
- true
- ))
- ) {
- if (domUtils.isEmptyBlock(tmpNode)) {
- var pre = tmpNode.previousSibling;
- if (pre && pre.nodeName != "TABLE") {
- domUtils.remove(tmpNode);
- rng.setStartAtLast(pre).setCursor(false, true);
- return;
- } else {
- var next = tmpNode.nextSibling;
- if (next && next.nodeName != "TABLE") {
- domUtils.remove(tmpNode);
- rng.setStartAtFirst(next).setCursor(false, true);
- return;
- }
- }
- }
- }
- //处理当删除到body时,要重新给p标签展位
- if (domUtils.isBody(rng.startContainer)) {
- var tmpNode = domUtils.createElement(me.document, "p", {
- innerHTML: browser.ie ? domUtils.fillChar : "<br/>"
- });
- rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true);
- }
- }
- //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了
- if (
- !collapsed &&
- (rng.startContainer.nodeType == 3 ||
- (rng.startContainer.nodeType == 1 &&
- domUtils.isEmptyBlock(rng.startContainer)))
- ) {
- if (browser.ie) {
- var span = rng.document.createElement("span");
- rng.insertNode(span).setStartBefore(span).collapse(true);
- rng.select();
- domUtils.remove(span);
- } else {
- rng.select();
- }
- }
- }
- });
- };
|