| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 |
- /*
- * 处理特殊键的兼容性问题
- */
- UE.plugins['keystrokes'] = function() {
- var me = this,
- flag = 0,
- keys = domUtils.keys,
- trans = {
- 'B' : 'strong',
- 'I' : 'em',
- 'FONT' : 'span'
- },
- sizeMap = [0, 10, 12, 16, 18, 24, 32, 48],
- listStyle = {
- 'OL':['decimal','lower-alpha','lower-roman','upper-alpha','upper-roman'],
- 'UL':[ 'circle','disc','square']
- };
- me.addListener('keydown', function(type, evt) {
- var keyCode = evt.keyCode || evt.which;
- if(this.selectAll){
- this.selectAll = false;
- if((keyCode == 8 || keyCode == 46)){
- me.undoManger && me.undoManger.save();
- //trace:1633
- me.body.innerHTML = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
- new dom.Range(me.document).setStart(me.body.firstChild,0).setCursor(false,true);
- me.undoManger && me.undoManger.save();
- //todo 对性能会有影响
- browser.ie && me._selectionChange();
- domUtils.preventDefault(evt);
- return;
- }
- }
- //处理backspace/del
- if (keyCode == 8 ) {//|| keyCode == 46
- var range = me.selection.getRange(),
- tmpRange,
- start,end;
- //当删除到body最开始的位置时,会删除到body,阻止这个动作
- if(range.collapsed){
- start = range.startContainer;
- //有可能是展位符号
- if(domUtils.isWhitespace(start)){
- start = start.parentNode;
- }
- if(domUtils.isEmptyNode(start) && start === me.body.firstChild){
- if(start.tagName != 'P'){
- p = me.document.createElement('p');
- me.body.insertBefore(p,start);
- domUtils.fillNode(me.document,p);
- range.setStart(p,0).setCursor(false,true);
- //trace:1645
- domUtils.remove(start);
- }
- domUtils.preventDefault(evt);
- return;
- }
- }
- if (range.collapsed && range.startContainer.nodeType == 3 && range.startContainer.nodeValue.replace(new RegExp(domUtils.fillChar, 'g'), '').length == 0) {
- range.setStartBefore(range.startContainer).collapse(true)
- }
- //解决选中control元素不能删除的问题
- if (start = range.getClosedNode()) {
- me.undoManger && me.undoManger.save();
- range.setStartBefore(start);
- domUtils.remove(start);
- range.setCursor();
- me.undoManger && me.undoManger.save();
- domUtils.preventDefault(evt);
- return;
- }
- //阻止在table上的删除
- if (!browser.ie) {
- start = domUtils.findParentByTagName(range.startContainer, 'table', true);
- end = domUtils.findParentByTagName(range.endContainer, 'table', true);
- if (start && !end || !start && end || start !== end) {
- evt.preventDefault();
- return;
- }
- //表格里回车,删除时,光标被定位到了p外边,导致多次删除才能到上一行,这里的处理忘记是为什么,暂时注视掉
- //解决trace:1966的问题
- // if (browser.webkit && range.collapsed && start) {
- // tmpRange = range.cloneRange().txtToElmBoundary();
- // start = tmpRange.startContainer;
- // debugger
- // if (domUtils.isBlockElm(start) && !dtd.$tableContent[start.tagName] && !domUtils.getChildCount(start, function(node) {
- // return node.nodeType == 1 ? node.tagName !== 'BR' : 1;
- // })) {
- //
- // tmpRange.setStartBefore(start).setCursor();
- // domUtils.remove(start, true);
- // evt.preventDefault();
- // return;
- // }
- // }
- }
- if (me.undoManger) {
- if (!range.collapsed) {
- me.undoManger.save();
- flag = 1;
- }
- }
- }
- //处理tab键的逻辑
- if (keyCode == 9) {
- range = me.selection.getRange();
- me.undoManger && me.undoManger.save();
- 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;
- if (range.collapsed) {
- var li = domUtils.findParentByTagName(range.startContainer, 'li', true);
- if (li && domUtils.isStartInblock(range)) {
- bk = range.createBookmark();
- var parentLi = li.parentNode,
- list = me.document.createElement(parentLi.tagName);
- var index = utils.indexOf(listStyle[list.tagName], domUtils.getComputedStyle(parentLi, 'list-style-type'));
- index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;
- domUtils.setStyle(list, 'list-style-type', listStyle[list.tagName][index]);
- parentLi.insertBefore(list, li);
- list.appendChild(li);
- range.moveToBookmark(bk).select()
- } else
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true);
- } else {
- //处理table
- start = domUtils.findParentByTagName(range.startContainer, 'table', true);
- end = domUtils.findParentByTagName(range.endContainer, 'table', true);
- if (start || end) {
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
- return
- }
- //处理列表 再一个list里处理
- start = domUtils.findParentByTagName(range.startContainer, ['ol','ul'], true);
- end = domUtils.findParentByTagName(range.endContainer, ['ol','ul'], true);
- if (start && end && start === end) {
- var bk = range.createBookmark();
- start = domUtils.findParentByTagName(range.startContainer, 'li', true);
- end = domUtils.findParentByTagName(range.endContainer, 'li', true);
- //在开始单独处理
- if (start === start.parentNode.firstChild) {
- var parentList = me.document.createElement(start.parentNode.tagName);
- start.parentNode.parentNode.insertBefore(parentList, start.parentNode);
- parentList.appendChild(start.parentNode);
- } else {
- parentLi = start.parentNode,
- list = me.document.createElement(parentLi.tagName);
- index = utils.indexOf(listStyle[list.tagName], domUtils.getComputedStyle(parentLi, 'list-style-type'));
- index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;
- domUtils.setStyle(list, 'list-style-type', listStyle[list.tagName][index]);
- start.parentNode.insertBefore(list, start);
- var nextLi;
- while (start !== end) {
- nextLi = start.nextSibling;
- list.appendChild(start);
- start = nextLi;
- }
- list.appendChild(end);
- }
- range.moveToBookmark(bk).select();
- } else {
- if (start || end) {
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
- return
- }
- //普通的情况
- start = domUtils.findParent(range.startContainer, filterFn);
- end = domUtils.findParent(range.endContainer, filterFn);
- if (start && end && start === end) {
- range.deleteContents();
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true);
- } else {
- var bookmark = range.createBookmark(),
- filterFn = function(node) {
- return domUtils.isBlockElm(node);
- };
- 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();
- }
- }
- }
- me.undoManger && me.undoManger.save();
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
- }
- //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;
- }
- }
- }
- });
- me.addListener('keyup', function(type, evt) {
- var keyCode = evt.keyCode || evt.which;
- //修复ie/chrome <strong><em>x|</em></strong> 当点退格后在输入文字后会出现 <b><i>x</i></b>
- if (!browser.gecko && !keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {
- range = me.selection.getRange();
- if (range.collapsed) {
- var start = range.startContainer,
- isFixed = 0;
- while (!domUtils.isBlockElm(start)) {
- if (start.nodeType == 1 && utils.indexOf(['FONT','B','I'], start.tagName) != -1) {
- var tmpNode = me.document.createElement(trans[start.tagName]);
- if (start.tagName == 'FONT') {
- //chrome only remember color property
- tmpNode.style.cssText = (start.getAttribute('size') ? 'font-size:' + (sizeMap[start.getAttribute('size')] || 12) + 'px' : '')
- + ';' + (start.getAttribute('color') ? 'color:' + start.getAttribute('color') : '')
- + ';' + (start.getAttribute('face') ? 'font-family:' + start.getAttribute('face') : '')
- + ';' + start.style.cssText;
- }
- while (start.firstChild) {
- tmpNode.appendChild(start.firstChild)
- }
- start.parentNode.insertBefore(tmpNode, start);
- domUtils.remove(start);
- if (!isFixed) {
- range.setEnd(tmpNode, tmpNode.childNodes.length).collapse(true)
- }
- start = tmpNode;
- isFixed = 1;
- }
- start = start.parentNode;
- }
- isFixed && range.select()
- }
- }
- if (keyCode == 8 ) {//|| keyCode == 46
- //针对ff下在列表首行退格,不能删除空格行的问题
- if(browser.gecko){
- for(var i=0,li,lis = domUtils.getElementsByTagName(this.body,'li');li=lis[i++];){
- if(domUtils.isEmptyNode(li) && !li.previousSibling){
- var liOfPn = li.parentNode;
- domUtils.remove(li);
- if(domUtils.isEmptyNode(liOfPn)){
- domUtils.remove(liOfPn)
- }
- }
- }
- }
- var range,start,parent,
- tds = this.currentSelectedArr;
- if (tds && tds.length > 0) {
- for (var i = 0,ti; ti = tds[i++];) {
- ti.innerHTML = browser.ie ? ( browser.version < 9 ? '' : '' ) : '<br/>';
- }
- range = new dom.Range(this.document);
- range.setStart(tds[0], 0).setCursor();
- if (flag) {
- me.undoManger.save();
- flag = 0;
- }
- //阻止chrome执行默认的动作
- if (browser.webkit) {
- evt.preventDefault();
- }
- return;
- }
- range = me.selection.getRange();
- //ctrl+a 后全部删除做处理
- //
- // if (domUtils.isEmptyBlock(me.body) && !range.startOffset) {
- // //trace:1633
- // me.body.innerHTML = '<p>'+(browser.ie ? ' ' : '<br/>')+'</p>';
- // range.setStart(me.body.firstChild,0).setCursor(false,true);
- // me.undoManger && me.undoManger.save();
- // //todo 对性能会有影响
- // browser.ie && me._selectionChange();
- // return;
- // }
- //处理删除不干净的问题
- start = range.startContainer;
- if(domUtils.isWhitespace(start)){
- start = start.parentNode
- }
- //标志位防止空的p无法删除
- var removeFlag = 0;
- while (start.nodeType == 1 && domUtils.isEmptyNode(start) && dtd.$removeEmpty[start.tagName]) {
- removeFlag = 1;
- parent = start.parentNode;
- domUtils.remove(start);
- start = parent;
- }
- if ( removeFlag && start.nodeType == 1 && domUtils.isEmptyNode(start)) {
- //ie下的问题,虽然没有了相应的节点但一旦你输入文字还是会自动把删除的节点加上,
- if (browser.ie) {
- var span = range.document.createElement('span');
- start.appendChild(span);
- range.setStart(start,0).setCursor();
- //for ie
- li = domUtils.findParentByTagName(start,'li',true);
- if(li){
- var next = li.nextSibling;
- while(next){
- if(domUtils.isEmptyBlock(next)){
- li = next;
- next = next.nextSibling;
- domUtils.remove(li);
- continue;
- }
- break;
- }
- }
- } else {
- start.innerHTML = '<br/>';
- range.setStart(start, 0).setCursor(false,true);
- }
- setTimeout(function() {
- if (browser.ie) {
- domUtils.remove(span);
- }
- if (flag) {
- me.undoManger.save();
- flag = 0;
- }
- }, 0)
- } else {
- if (flag) {
- me.undoManger.save();
- flag = 0;
- }
- }
- }
- })
- };
|