fckenterkey.js
来自「国外很不错的一个开源OA系统Group-Office」· JavaScript 代码 · 共 556 行 · 第 1/2 页
JS
556 行
// Get the current selection. var oRange = range || new FCKDomRange( this.Window ) ; // If we don't have a range, move it to the selection. if ( !range ) oRange.MoveToSelection() ; // The selection boundaries must be in the same "block limit" element. if ( oRange.StartBlockLimit == oRange.EndBlockLimit ) { // If the StartBlock or EndBlock are not available (for text without a // block tag), we must fix them, by moving the text to a block. if ( !oRange.StartBlock ) this._FixBlock( oRange, true, blockTag ) ; if ( !oRange.EndBlock ) this._FixBlock( oRange, false, blockTag ) ; // Get the current blocks. var eStartBlock = oRange.StartBlock ; var eEndBlock = oRange.EndBlock ; // Delete the current selection. if ( !oRange.CheckIsEmpty() ) oRange.DeleteContents() ; // If the selection boundaries are in the same block element if ( eStartBlock == eEndBlock ) { var eNewBlock ; var bIsStartOfBlock = oRange.CheckStartOfBlock() ; var bIsEndOfBlock = oRange.CheckEndOfBlock() ; if ( bIsStartOfBlock && !bIsEndOfBlock ) { eNewBlock = eStartBlock.cloneNode(false) ; if ( FCKBrowserInfo.IsGeckoLike ) eNewBlock.innerHTML = GECKO_BOGUS ; // Place the new block before the current block element. eStartBlock.parentNode.insertBefore( eNewBlock, eStartBlock ) ; // This is tricky, but to make the new block visible correctly // we must select it. if ( FCKBrowserInfo.IsIE ) { // Move the selection to the new block. oRange.MoveToNodeContents( eNewBlock ) ; oRange.Select() ; } // Move the selection to the new block. oRange.MoveToElementEditStart( eStartBlock ) ; } else { // Check if the selection is at the end of the block. if ( bIsEndOfBlock ) { var sStartBlockTag = eStartBlock.tagName.toUpperCase() ; // If the entire block is selected, and we are in a LI, let's decrease its indentation. if ( bIsStartOfBlock && sStartBlockTag == 'LI' ) { this._OutdentWithSelection( eStartBlock, oRange ) ; oRange.Release() ; return true ; } else { // If is a header tag, or we are in a Shift+Enter (#77), // create a new block element. if ( (/^H[1-6]$/).test( sStartBlockTag ) || this._HasShift ) eNewBlock = this.Window.document.createElement( blockTag ) ; // Otherwise, duplicate the current block. else { eNewBlock = eStartBlock.cloneNode(false) ; this._RecreateEndingTree( eStartBlock, eNewBlock ) ; } if ( FCKBrowserInfo.IsGeckoLike ) { eNewBlock.innerHTML = GECKO_BOGUS ; // If the entire block is selected, let's add a bogus in the start block. if ( bIsStartOfBlock ) eStartBlock.innerHTML = GECKO_BOGUS ; } } } else { // Extract the contents of the block from the selection point to the end of its contents. oRange.SetEnd( eStartBlock, 2 ) ; var eDocFrag = oRange.ExtractContents() ; // Duplicate the block element after it. eNewBlock = eStartBlock.cloneNode(false) ; // It could be that we are in a LI with a child UL/OL. Insert a bogus to give us space to type. FCKDomTools.TrimNode( eDocFrag.RootNode ) ; if ( eDocFrag.RootNode.firstChild.nodeType == 1 && eDocFrag.RootNode.firstChild.tagName.toUpperCase().Equals( 'UL', 'OL' ) ) eNewBlock.innerHTML = GECKO_BOGUS ; // Place the extracted contents in the duplicated block. eDocFrag.AppendTo( eNewBlock ) ; if ( FCKBrowserInfo.IsGecko ) { // In Gecko, the last child node must be a bogus <br>. this._AppendBogusBr( eStartBlock ) ; this._AppendBogusBr( eNewBlock ) ; } } if ( eNewBlock ) { FCKDomTools.InsertAfterNode( eStartBlock, eNewBlock ) ; // Move the selection to the new block. oRange.MoveToElementEditStart( eNewBlock ) ; if ( FCKBrowserInfo.IsGecko ) eNewBlock.scrollIntoView( false ) ; } } } else { // Move the selection to the end block. oRange.MoveToElementEditStart( eEndBlock ) ; } oRange.Select() ; } // Release the resources used by the range. oRange.Release() ; return true ;}FCKEnterKey.prototype._ExecuteEnterBr = function( blockTag ){ // Get the current selection. var oRange = new FCKDomRange( this.Window ) ; oRange.MoveToSelection() ; // The selection boundaries must be in the same "block limit" element. if ( oRange.StartBlockLimit == oRange.EndBlockLimit ) { oRange.DeleteContents() ; // Get the new selection (it is collapsed at this point). oRange.MoveToSelection() ; var bIsStartOfBlock = oRange.CheckStartOfBlock() ; var bIsEndOfBlock = oRange.CheckEndOfBlock() ; var sStartBlockTag = oRange.StartBlock ? oRange.StartBlock.tagName.toUpperCase() : '' ; var bHasShift = this._HasShift ; if ( !bHasShift && sStartBlockTag == 'LI' ) return this._ExecuteEnterBlock( null, oRange ) ; // If we are at the end of a header block. if ( !bHasShift && bIsEndOfBlock && (/^H[1-6]$/).test( sStartBlockTag ) ) { FCKDebug.Output( 'BR - Header' ) ; // Insert a BR after the current paragraph. FCKDomTools.InsertAfterNode( oRange.StartBlock, this.Window.document.createElement( 'br' ) ) ; // The space is required by Gecko only to make the cursor blink. if ( FCKBrowserInfo.IsGecko ) FCKDomTools.InsertAfterNode( oRange.StartBlock, this.Window.document.createTextNode( '' ) ) ; // IE and Gecko have different behaviors regarding the position. oRange.SetStart( oRange.StartBlock.nextSibling, FCKBrowserInfo.IsIE ? 3 : 1 ) ; } else { FCKDebug.Output( 'BR - No Header' ) ; var eBr = this.Window.document.createElement( 'br' ) ; oRange.InsertNode( eBr ) ; // The space is required by Gecko only to make the cursor blink. if ( FCKBrowserInfo.IsGecko ) FCKDomTools.InsertAfterNode( eBr, this.Window.document.createTextNode( '' ) ) ; // If we are at the end of a block, we must be sure the bogus node is available in that block. if ( bIsEndOfBlock && FCKBrowserInfo.IsGecko ) this._AppendBogusBr( eBr.parentNode ) ; if ( FCKBrowserInfo.IsIE ) oRange.SetStart( eBr, 4 ) ; else oRange.SetStart( eBr.nextSibling, 1 ) ; } // This collapse guarantees the cursor will be blinking. oRange.Collapse( true ) ; oRange.Select() ; } // Release the resources used by the range. oRange.Release() ; return true ;}// Transform a block without a block tag in a valid block (orphan text in the body or td, usually).FCKEnterKey.prototype._FixBlock = function( range, isStart, blockTag ){ // Bookmark the range so we can restore it later. var oBookmark = range.CreateBookmark() ; // Collapse the range to the requested ending boundary. range.Collapse( isStart ) ; // Expands it to the block contents. range.Expand( 'block_contents' ) ; // Create the fixed block. var oFixedBlock = this.Window.document.createElement( blockTag ) ; // Move the contents of the temporary range to the fixed block. range.ExtractContents().AppendTo( oFixedBlock ) ; FCKDomTools.TrimNode( oFixedBlock ) ; // Insert the fixed block into the DOM. range.InsertNode( oFixedBlock ) ; // Move the range back to the bookmarked place. range.MoveToBookmark( oBookmark ) ;}// Appends a bogus <br> at the end of the element, if not yet available.FCKEnterKey.prototype._AppendBogusBr = function( element ){ var eLastChild = element.getElementsByTagName('br') ; if ( eLastChild ) eLastChild = eLastChild[ eLastChild.legth - 1 ] ; if ( !eLastChild || eLastChild.getAttribute( 'type', 2 ) != '_moz' ) element.appendChild( FCKTools.CreateBogusBR( this.Window.document ) ) ;}// Recreate the elements tree at the end of the source block, at the beginning// of the target block. Eg.:// If source = <p><u>Some</u> sample <b><i>text</i></b></p> then target = <p><b><i></i></b></p>// If source = <p><u>Some</u> sample text</p> then target = <p></p>FCKEnterKey.prototype._RecreateEndingTree = function( source, target ){ while ( ( source = source.lastChild ) && source.nodeType == 1 && FCKListsLib.InlineChildReqElements[ source.nodeName.toLowerCase() ] != null ) target = target.insertBefore( source.cloneNode( false ), target.firstChild ) ;}// Outdents a LI, maintaining the seletion defined on a range.FCKEnterKey.prototype._OutdentWithSelection = function( li, range ){ var oBookmark = range.CreateBookmark() ; FCKListHandler.OutdentListItem( li ) ; range.MoveToBookmark( oBookmark ) ; range.Select() ;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?