Given that editor is one of CKEDITOR.instances , the following should do the trick:
function getPrevChar() { var range = editor.getSelection().getRanges()[ 0 ], startNode = range.startContainer; if ( startNode.type == CKEDITOR.NODE_TEXT && range.startOffset ) // Range at the non-zero position of a text node. return startNode.getText()[ range.startOffset - 1 ]; else { // Expand the range to the beginning of editable. range.collapse( true ); range.setStartAt( editor.editable(), CKEDITOR.POSITION_AFTER_START ); // Let use the walker to find the closes (previous) text node. var walker = new CKEDITOR.dom.walker( range ), node; while ( ( node = walker.previous() ) ) { // If found, return the last character of the text node. if ( node.type == CKEDITOR.NODE_TEXT ) return node.getText().slice( -1 ); } } // Selection starts at the 0 index of the text node and/or there no previous text node in contents. return null; }
Check out jsFiddle . Try it: place the carriage anywhere, but mainly in front of ^ to see if complex cases are covered.
oleq
source share