fckenterkey.js

来自「国外很不错的一个开源OA系统Group-Office」· JavaScript 代码 · 共 556 行 · 第 1/2 页

JS
556
字号
/* * FCKeditor - The text editor for Internet - http://www.fckeditor.net * Copyright (C) 2003-2007 Frederico Caldeira Knabben * * == BEGIN LICENSE == * * Licensed under the terms of any of the following licenses at your * choice: * *  - GNU General Public License Version 2 or later (the "GPL") *    http://www.gnu.org/licenses/gpl.html * *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL") *    http://www.gnu.org/licenses/lgpl.html * *  - Mozilla Public License Version 1.1 or later (the "MPL") *    http://www.mozilla.org/MPL/MPL-1.1.html * * == END LICENSE == * * Controls the [Enter] keystroke behavior in a document. *//* *	Constructor. *		@targetDocument : the target document. *		@enterMode : the behavior for the <Enter> keystroke. *			May be "p", "div", "br". Default is "p". *		@shiftEnterMode : the behavior for the <Shift>+<Enter> keystroke. *			May be "p", "div", "br". Defaults to "br". */var FCKEnterKey = function( targetWindow, enterMode, shiftEnterMode ){	this.Window			= targetWindow ;	this.EnterMode		= enterMode || 'p' ;	this.ShiftEnterMode	= shiftEnterMode || 'br' ;	// Setup the Keystroke Handler.	var oKeystrokeHandler = new FCKKeystrokeHandler( false ) ;	oKeystrokeHandler._EnterKey = this ;	oKeystrokeHandler.OnKeystroke = FCKEnterKey_OnKeystroke ;	oKeystrokeHandler.SetKeystrokes( [		[ 13		, 'Enter' ],		[ SHIFT + 13, 'ShiftEnter' ],		[ 8			, 'Backspace' ],		[ 46		, 'Delete' ]	] ) ;	oKeystrokeHandler.AttachToElement( targetWindow.document ) ;}function FCKEnterKey_OnKeystroke(  keyCombination, keystrokeValue ){	var oEnterKey = this._EnterKey ;	try	{		switch ( keystrokeValue )		{			case 'Enter' :				return oEnterKey.DoEnter() ;				break ;			case 'ShiftEnter' :				return oEnterKey.DoShiftEnter() ;				break ;			case 'Backspace' :				return oEnterKey.DoBackspace() ;				break ;			case 'Delete' :				return oEnterKey.DoDelete() ;		}	}	catch (e)	{		// If for any reason we are not able to handle it, go		// ahead with the browser default behavior.	}	return false ;}/* * Executes the <Enter> key behavior. */FCKEnterKey.prototype.DoEnter = function( mode, hasShift ){	this._HasShift = ( hasShift === true ) ;	var sMode = mode || this.EnterMode ;	if ( sMode == 'br' )		return this._ExecuteEnterBr() ;	else		return this._ExecuteEnterBlock( sMode ) ;}/* * Executes the <Shift>+<Enter> key behavior. */FCKEnterKey.prototype.DoShiftEnter = function(){	return this.DoEnter( this.ShiftEnterMode, true ) ;}/* * Executes the <Backspace> key behavior. */FCKEnterKey.prototype.DoBackspace = function(){	var bCustom = false ;	// Get the current selection.	var oRange = new FCKDomRange( this.Window ) ;	oRange.MoveToSelection() ;	if ( !oRange.CheckIsCollapsed() )		return false ;	var oStartBlock = oRange.StartBlock ;	var oEndBlock = oRange.EndBlock ;	// The selection boundaries must be in the same "block limit" element	if ( oRange.StartBlockLimit == oRange.EndBlockLimit && oStartBlock && oEndBlock )	{		if ( !oRange.CheckIsCollapsed() )		{			var bEndOfBlock = oRange.CheckEndOfBlock() ;			oRange.DeleteContents() ;			if ( oStartBlock != oEndBlock )			{				oRange.SetStart(oEndBlock,1) ;				oRange.SetEnd(oEndBlock,1) ;//				if ( bEndOfBlock )//					oEndBlock.parentNode.removeChild( oEndBlock ) ;			}			oRange.Select() ;			bCustom = ( oStartBlock == oEndBlock ) ;		}		if ( oRange.CheckStartOfBlock() )		{			var oCurrentBlock = oRange.StartBlock ;			var ePrevious = FCKDomTools.GetPreviousSourceElement( oCurrentBlock, true, [ 'BODY', oRange.StartBlockLimit.nodeName ], ['UL','OL'] ) ;			bCustom = this._ExecuteBackspace( oRange, ePrevious, oCurrentBlock ) ;		}		else if ( FCKBrowserInfo.IsGecko )		{			// Firefox looses the selection when executing CheckStartOfBlock, so we must reselect.			oRange.Select() ;		}	}	oRange.Release() ;	return bCustom ;}FCKEnterKey.prototype._ExecuteBackspace = function( range, previous, currentBlock ){	var bCustom = false ;	// We could be in a nested LI.	if ( !previous && currentBlock.nodeName.IEquals( 'LI' ) && currentBlock.parentNode.parentNode.nodeName.IEquals( 'LI' ) )	{		this._OutdentWithSelection( currentBlock, range ) ;		return true ;	}	if ( previous && previous.nodeName.IEquals( 'LI' ) )	{		var oNestedList = FCKDomTools.GetLastChild( previous, ['UL','OL'] ) ;		while ( oNestedList )		{			previous = FCKDomTools.GetLastChild( oNestedList, 'LI' ) ;			oNestedList = FCKDomTools.GetLastChild( previous, ['UL','OL'] ) ;		}	}	if ( previous && currentBlock )	{		// If we are in a LI, and the previous block is not an LI, we must outdent it.		if ( currentBlock.nodeName.IEquals( 'LI' ) && !previous.nodeName.IEquals( 'LI' ) )		{			this._OutdentWithSelection( currentBlock, range ) ;			return true ;		}		// Take a reference to the parent for post processing cleanup.		var oCurrentParent = currentBlock.parentNode ;		var sPreviousName = previous.nodeName.toLowerCase() ;		if ( FCKListsLib.EmptyElements[ sPreviousName ] != null || sPreviousName == 'table' )		{			FCKDomTools.RemoveNode( previous ) ;			bCustom = true ;		}		else		{			// Remove the current block.			FCKDomTools.RemoveNode( currentBlock ) ;			// Remove any empty tag left by the block removal.			while ( oCurrentParent.innerHTML.Trim().length == 0 )			{				var oParent = oCurrentParent.parentNode ;				oParent.removeChild( oCurrentParent ) ;				oCurrentParent = oParent ;			}			// Cleanup the previous and the current elements.			FCKDomTools.TrimNode( currentBlock ) ;			FCKDomTools.TrimNode( previous ) ;			// Append a space to the previous.			// Maybe it is not always desirable...			// previous.appendChild( this.Window.document.createTextNode( ' ' ) ) ;			// Set the range to the end of the previous element and bookmark it.			range.SetStart( previous, 2 ) ;			range.Collapse( true ) ;			var oBookmark = range.CreateBookmark() ;			// Move the contents of the block to the previous element and delete it.			FCKDomTools.MoveChildren( currentBlock, previous ) ;			// Place the selection at the bookmark.			range.MoveToBookmark( oBookmark ) ;			range.Select() ;			bCustom = true ;		}	}	return bCustom ;}/* * Executes the <Delete> key behavior. */FCKEnterKey.prototype.DoDelete = function(){	// The <Delete> has the same effect as the <Backspace>, so we have the same	// results if we just move to the next block and apply the same <Backspace> logic.	var bCustom = false ;	// Get the current selection.	var oRange = new FCKDomRange( this.Window ) ;	oRange.MoveToSelection() ;	// There is just one special case for collapsed selections at the end of a block.	if ( oRange.CheckIsCollapsed() && oRange.CheckEndOfBlock( FCKBrowserInfo.IsGecko ) )	{		var oCurrentBlock = oRange.StartBlock ;		var eNext = FCKDomTools.GetNextSourceElement( oCurrentBlock, true, [ oRange.StartBlockLimit.nodeName ], ['UL','OL'] ) ;		bCustom = this._ExecuteBackspace( oRange, oCurrentBlock, eNext ) ;	}	oRange.Release() ;	return bCustom ;}FCKEnterKey.prototype._ExecuteEnterBlock = function( blockTag, range ){

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?