📄 richtext.js
字号:
} }, onKeyDown: function(/* Event */ e){ // summary: Fired on keydown // we need this event at the moment to get the events from control keys // such as the backspace. It might be possible to add this to Dojo, so that // keyPress events can be emulated by the keyDown and keyUp detection. if(dojo.isIE){ if(e.keyCode == dojo.keys.TAB && e.shiftKey && !e.ctrlKey && !e.altKey){ // focus the BODY so the browser will tab away from it instead this.iframe.focus(); }else if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey){ // focus the BODY so the browser will tab away from it instead this.tabStop.focus(); }else if(e.keyCode === dojo.keys.BACKSPACE && this.document.selection.type === "Control"){ // IE has a bug where if a non-text object is selected in the editor, // hitting backspace would act as if the browser's back button was // clicked instead of deleting the object. see #1069 dojo.stopEvent(e); this.execCommand("delete"); }else if((65 <= e.keyCode&&e.keyCode <= 90) || (e.keyCode>=37&&e.keyCode<=40) // FIXME: get this from connect() instead! ){ //arrow keys e.charCode = e.keyCode; this.onKeyPress(e); } }else if(dojo.isMoz){ if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){ // update iframe document title for screen reader this.iframe.contentDocument.title = this._localizedIframeTitles.iframeFocusTitle; // Place focus on the iframe. A subsequent tab or shift tab will put focus // on the correct control. this.iframe.focus(); // this.focus(); won't work dojo.stopEvent(e); }else if(e.keyCode == dojo.keys.TAB && e.shiftKey){ // if there is a toolbar, set focus to it, otherwise ignore if(this.toolbar){ this.toolbar.focus(); } dojo.stopEvent(e); } } }, onKeyUp: function(e){ // summary: Fired on keyup return; }, KEY_CTRL: 1, KEY_SHIFT: 2, onKeyPress: function(e){ // summary: Fired on keypress // handle the various key events var modifiers = (e.ctrlKey && !e.altKey) ? this.KEY_CTRL : 0 | e.shiftKey ? this.KEY_SHIFT : 0; var key = e.keyChar || e.keyCode; if(this._keyHandlers[key]){ // console.debug("char:", e.key); var handlers = this._keyHandlers[key], i = 0, h; while((h = handlers[i++])){ if(modifiers == h.modifiers){ if(!h.handler.apply(this,arguments)){ e.preventDefault(); } break; } } } // function call after the character has been inserted setTimeout(dojo.hitch(this, function(){ this.onKeyPressed(e); }), 1); }, addKeyHandler: function(/*String*/key, /*Int*/modifiers, /*Function*/handler){ // summary: add a handler for a keyboard shortcut if(!dojo.isArray(this._keyHandlers[key])){ this._keyHandlers[key] = []; } this._keyHandlers[key].push({ modifiers: modifiers || 0, handler: handler }); }, onKeyPressed: function(/*Event*/e){ this.onDisplayChanged(/*e*/); // can't pass in e }, onClick: function(/*Event*/e){// console.info('onClick',this._tryDesignModeOn); this.onDisplayChanged(e); }, _onMouseDown: function(/*Event*/e){ // IE only to prevent 2 clicks to focus if(!this._focused && !this.disabled){ this.focus(); } }, _onBlur: function(e){ this.inherited(arguments); var _c=this.getValue(true); if(_c!=this.savedContent){ this.onChange(_c); this.savedContent=_c; } if(dojo.isMoz && this.iframe){ this.iframe.contentDocument.title = this._localizedIframeTitles.iframeEditTitle; } }, _initialFocus: true, _onFocus: function(/*Event*/e){ // summary: Fired on focus this.inherited(arguments); if(dojo.isMoz && this._initialFocus){ this._initialFocus = false; if(this.editNode.innerHTML.replace(/^\s+|\s+$/g, "") == " "){ this.placeCursorAtStart();// this.execCommand("selectall");// this.window.getSelection().collapseToStart(); } } }, // TODO: why is this needed - should we deprecate this ? blur: function(){ // summary: remove focus from this instance if(!dojo.isIE && this.window.document.documentElement && this.window.document.documentElement.focus){ this.window.document.documentElement.focus(); }else if(dojo.doc.body.focus){ dojo.doc.body.focus(); } }, focus: function(){ // summary: move focus to this instance if(!dojo.isIE){ dijit.focus(this.iframe); }else if(this.editNode && this.editNode.focus){ // editNode may be hidden in display:none div, lets just punt in this case //this.editNode.focus(); -> causes IE to scroll always (strict and quirks mode) to the top the Iframe // if we fire the event manually and let the browser handle the focusing, the latest // cursor position is focused like in FF this.iframe.fireEvent('onfocus', document.createEventObject()); // createEventObject only in IE // }else{// TODO: should we throw here?// console.debug("Have no idea how to focus into the editor!"); } },// _lastUpdate: 0, updateInterval: 200, _updateTimer: null, onDisplayChanged: function(/*Event*/e){ // summary: // This event will be fired everytime the display context // changes and the result needs to be reflected in the UI. // description: // If you don't want to have update too often, // onNormalizedDisplayChanged should be used instead// var _t=new Date(); if(!this._updateTimer){// this._lastUpdate=_t; if(this._updateTimer){ clearTimeout(this._updateTimer); } this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval); } }, onNormalizedDisplayChanged: function(){ // summary: // This event is fired every updateInterval ms or more // description: // If something needs to happen immidiately after a // user change, please use onDisplayChanged instead this._updateTimer=null; }, onChange: function(newContent){ // summary: // this is fired if and only if the editor loses focus and // the content is changed// console.log('onChange',newContent); }, _normalizeCommand: function(/*String*/cmd){ // summary: // Used as the advice function by dojo.connect to map our // normalized set of commands to those supported by the target // browser var command = cmd.toLowerCase(); if(command == "hilitecolor" && !dojo.isMoz){ command = "backcolor"; } return command; }, queryCommandAvailable: function(/*String*/command){ // summary: // Tests whether a command is supported by the host. Clients SHOULD check // whether a command is supported before attempting to use it, behaviour // for unsupported commands is undefined. // command: The command to test for var ie = 1; var mozilla = 1 << 1; var safari = 1 << 2; var opera = 1 << 3; var safari420 = 1 << 4; var gt420 = dojo.isSafari; function isSupportedBy(browsers){ return { ie: Boolean(browsers & ie), mozilla: Boolean(browsers & mozilla), safari: Boolean(browsers & safari), safari420: Boolean(browsers & safari420), opera: Boolean(browsers & opera) } } var supportedBy = null; switch(command.toLowerCase()){ case "bold": case "italic": case "underline": case "subscript": case "superscript": case "fontname": case "fontsize": case "forecolor": case "hilitecolor": case "justifycenter": case "justifyfull": case "justifyleft": case "justifyright": case "delete": case "selectall": case "toggledir": supportedBy = isSupportedBy(mozilla | ie | safari | opera); break; case "createlink": case "unlink": case "removeformat": case "inserthorizontalrule": case "insertimage": case "insertorderedlist": case "insertunorderedlist": case "indent": case "outdent": case "formatblock": case "inserthtml": case "undo": case "redo": case "strikethrough": supportedBy = isSupportedBy(mozilla | ie | opera | safari420); break; case "blockdirltr": case "blockdirrtl": case "dirltr": case "dirrtl": case "inlinedirltr": case "inlinedirrtl": supportedBy = isSupportedBy(ie); break; case "cut": case "copy": case "paste": supportedBy = isSupportedBy( ie | mozilla | safari420); break; case "inserttable": supportedBy = isSupportedBy(mozilla | ie); break; case "insertcell": case "insertcol": case "insertrow": case "deletecells": case "deletecols": case "deleterows": case "mergecells": case "splitcell": supportedBy = isSupportedBy(ie | mozilla); break; default: return false; } return (dojo.isIE && supportedBy.ie) || (dojo.isMoz && supportedBy.mozilla) || (dojo.isSafari && supportedBy.safari) || (gt420 && supportedBy.safari420) || (dojo.isOpera && supportedBy.opera); // Boolean return true if the command is supported, false otherwise }, execCommand: function(/*String*/command, argument){ // summary: Executes a command in the Rich Text area // command: The command to execute // argument: An optional argument to the command var returnValue; //focus() is required for IE to work //In addition, focus() makes sure after the execution of //the command, the editor receives the focus as expected this.focus(); command = this._normalizeCommand(command); if(argument != undefined){ if(command == "heading"){ throw new Error("unimplemented"); }else if((command == "formatblock") && dojo.isIE){ argument = '<'+argument+'>'; } } if(command == "inserthtml"){ argument=this._preFilterContent(argument); if(dojo.isIE){ var insertRange = this.document.selection.createRange(); if(this.document.selection.type.toUpperCase()=='CONTROL'){ var n=insertRange.item(0); while(insertRange.length){ insertRange.remove(insertRange.item(0)); } n.outerHTML=argument; }else{ insertRange.pasteHTML(argument); } insertRange.select(); //insertRange.collapse(true); returnValue=true; }else if(dojo.isMoz && !argument.length){ //mozilla can not inserthtml an empty html to delete current selection //so we delete the selection instead in this case dojo.withGlobal(this.window,'remove',dijit._editor.selection); returnValue=true; }else{ returnValue=this.document.execCommand(command, false, argument); } }else if( (command == "unlink")&& (this.queryCommandEnabled("unlink"))&& (dojo.isMoz || dojo.isSafari) ){ // fix up unlink in Mozilla to unlink the link and not just the selection // grab selection // Mozilla gets upset if we just store the range so we have to // get the basic properties and recreate to save the selection var selection = this.window.getSelection(); // var selectionRange = selection.getRangeAt(0); // var selectionStartContainer = selectionRange.startContainer; // var selectionStartOffset = selectionRange.startOffset; // var selectionEndContainer = selectionRange.endContainer; // var selectionEndOffset = selectionRange.endOffset; // select our link and unlink var a = dojo.withGlobal(this.window, "getAncestorElement",dijit._editor.selection, ['a']); dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [a]); returnValue=this.document.execCommand("unlink", false, null); }else if((command == "hilitecolor")&&(dojo.isMoz)){// // mozilla doesn't support hilitecolor properly when useCSS is// // set to false (bugzilla #279330) this.document.execCommand("styleWithCSS", false, true); returnValue = this.document.execCommand(command, false, argument); this.document.execCommand("styleWithCSS", false, false); }else if((dojo.isIE)&&( (command == "backcolor")||(command == "forecolor") )){ // Tested under IE 6 XP2, no problem here, comment out // IE weirdly collapses ranges when we exec these commands, so prevent it// var tr = this.document.selection.createRange(); argument = arguments.length > 1 ? argument : null; returnValue = this.document.execCommand(command, false, argument); // timeout is workaround for weird IE behavior were the text // selection gets correctly re-created, but subsequent input // apparently isn't bound to it// setTimeout(function(){tr.select();}, 1); }else{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -