/* 处理特殊键的兼容性问题 */
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]
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 = "
" + (browser.ie ? "" : "
") + "
";
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 : "
"
});
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();
}
}
}
});
};