fckselection_gecko.js
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:6k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

ASP/ASPX

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2009 Frederico Caldeira Knabben
  4.  *
  5.  * == BEGIN LICENSE ==
  6.  *
  7.  * Licensed under the terms of any of the following licenses at your
  8.  * choice:
  9.  *
  10.  *  - GNU General Public License Version 2 or later (the "GPL")
  11.  *    http://www.gnu.org/licenses/gpl.html
  12.  *
  13.  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  14.  *    http://www.gnu.org/licenses/lgpl.html
  15.  *
  16.  *  - Mozilla Public License Version 1.1 or later (the "MPL")
  17.  *    http://www.mozilla.org/MPL/MPL-1.1.html
  18.  *
  19.  * == END LICENSE ==
  20.  *
  21.  * Active selection functions. (Gecko specific implementation)
  22.  */
  23. // Get the selection type (like document.select.type in IE).
  24. FCKSelection.GetType = function()
  25. {
  26. // By default set the type to "Text".
  27. var type = 'Text' ;
  28. // Check if the actual selection is a Control (IMG, TABLE, HR, etc...).
  29. var sel ;
  30. try { sel = this.GetSelection() ; } catch (e) {}
  31. if ( sel && sel.rangeCount == 1 )
  32. {
  33. var range = sel.getRangeAt(0) ;
  34. if ( range.startContainer == range.endContainer
  35. && ( range.endOffset - range.startOffset ) == 1
  36. && range.startContainer.nodeType == 1
  37. && FCKListsLib.StyleObjectElements[ range.startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
  38. {
  39. type = 'Control' ;
  40. }
  41. }
  42. return type ;
  43. }
  44. // Retrieves the selected element (if any), just in the case that a single
  45. // element (object like and image or a table) is selected.
  46. FCKSelection.GetSelectedElement = function()
  47. {
  48. var selection = !!FCK.EditorWindow && this.GetSelection() ;
  49. if ( !selection || selection.rangeCount < 1 )
  50. return null ;
  51. var range = selection.getRangeAt( 0 ) ;
  52. if ( range.startContainer != range.endContainer || range.startContainer.nodeType != 1 || range.startOffset != range.endOffset - 1 )
  53. return null ;
  54. var node = range.startContainer.childNodes[ range.startOffset ] ;
  55. if ( node.nodeType != 1 )
  56. return null ;
  57. return node ;
  58. }
  59. FCKSelection.GetParentElement = function()
  60. {
  61. if ( this.GetType() == 'Control' )
  62. return FCKSelection.GetSelectedElement().parentNode ;
  63. else
  64. {
  65. var oSel = this.GetSelection() ;
  66. if ( oSel )
  67. {
  68. // if anchorNode == focusNode, see if the selection is text only or including nodes.
  69. // if text only, return the parent node.
  70. // if the selection includes DOM nodes, then the anchorNode is the nearest container.
  71. if ( oSel.anchorNode && oSel.anchorNode == oSel.focusNode )
  72. {
  73. var oRange = oSel.getRangeAt( 0 ) ;
  74. if ( oRange.collapsed || oRange.startContainer.nodeType == 3 )
  75. return oSel.anchorNode.parentNode ;
  76. else
  77. return oSel.anchorNode ;
  78. }
  79. // looks like we're having a large selection here. To make the behavior same as IE's TextRange.parentElement(),
  80. // we need to find the nearest ancestor node which encapsulates both the beginning and the end of the selection.
  81. // TODO: A simpler logic can be found.
  82. var anchorPath = new FCKElementPath( oSel.anchorNode ) ;
  83. var focusPath = new FCKElementPath( oSel.focusNode ) ;
  84. var deepPath = null ;
  85. var shallowPath = null ;
  86. if ( anchorPath.Elements.length > focusPath.Elements.length )
  87. {
  88. deepPath = anchorPath.Elements ;
  89. shallowPath = focusPath.Elements ;
  90. }
  91. else
  92. {
  93. deepPath = focusPath.Elements ;
  94. shallowPath = anchorPath.Elements ;
  95. }
  96. var deepPathBase = deepPath.length - shallowPath.length ;
  97. for( var i = 0 ; i < shallowPath.length ; i++)
  98. {
  99. if ( deepPath[deepPathBase + i] == shallowPath[i])
  100. return shallowPath[i];
  101. }
  102. return null ;
  103. }
  104. }
  105. return null ;
  106. }
  107. FCKSelection.GetBoundaryParentElement = function( startBoundary )
  108. {
  109. if ( ! FCK.EditorWindow )
  110. return null ;
  111. if ( this.GetType() == 'Control' )
  112. return FCKSelection.GetSelectedElement().parentNode ;
  113. else
  114. {
  115. var oSel = this.GetSelection() ;
  116. if ( oSel && oSel.rangeCount > 0 )
  117. {
  118. var range = oSel.getRangeAt( startBoundary ? 0 : ( oSel.rangeCount - 1 ) ) ;
  119. var element = startBoundary ? range.startContainer : range.endContainer ;
  120. return ( element.nodeType == 1 ? element : element.parentNode ) ;
  121. }
  122. }
  123. return null ;
  124. }
  125. FCKSelection.SelectNode = function( element )
  126. {
  127. var oRange = FCK.EditorDocument.createRange() ;
  128. oRange.selectNode( element ) ;
  129. var oSel = this.GetSelection() ;
  130. oSel.removeAllRanges() ;
  131. oSel.addRange( oRange ) ;
  132. }
  133. FCKSelection.Collapse = function( toStart )
  134. {
  135. var oSel = this.GetSelection() ;
  136. if ( toStart == null || toStart === true )
  137. oSel.collapseToStart() ;
  138. else
  139. oSel.collapseToEnd() ;
  140. }
  141. // The "nodeTagName" parameter must be Upper Case.
  142. FCKSelection.HasAncestorNode = function( nodeTagName )
  143. {
  144. var oContainer = this.GetSelectedElement() ;
  145. if ( ! oContainer && FCK.EditorWindow )
  146. {
  147. try { oContainer = this.GetSelection().getRangeAt(0).startContainer ; }
  148. catch(e){}
  149. }
  150. while ( oContainer )
  151. {
  152. if ( oContainer.nodeType == 1 && oContainer.nodeName.IEquals( nodeTagName ) ) return true ;
  153. oContainer = oContainer.parentNode ;
  154. }
  155. return false ;
  156. }
  157. // The "nodeTagName" parameter must be Upper Case.
  158. FCKSelection.MoveToAncestorNode = function( nodeTagName )
  159. {
  160. var oNode ;
  161. var oContainer = this.GetSelectedElement() ;
  162. if ( ! oContainer )
  163. oContainer = this.GetSelection().getRangeAt(0).startContainer ;
  164. while ( oContainer )
  165. {
  166. if ( oContainer.nodeName.IEquals( nodeTagName ) )
  167. return oContainer ;
  168. oContainer = oContainer.parentNode ;
  169. }
  170. return null ;
  171. }
  172. FCKSelection.Delete = function()
  173. {
  174. // Gets the actual selection.
  175. var oSel = this.GetSelection() ;
  176. // Deletes the actual selection contents.
  177. for ( var i = 0 ; i < oSel.rangeCount ; i++ )
  178. {
  179. oSel.getRangeAt(i).deleteContents() ;
  180. }
  181. return oSel ;
  182. }
  183. /**
  184.  * Returns the native selection object.
  185.  */
  186. FCKSelection.GetSelection = function()
  187. {
  188. return FCK.EditorWindow.getSelection() ;
  189. }
  190. // The following are IE only features (we don't need then in other browsers
  191. // currently).
  192. FCKSelection.Save = function()
  193. {}
  194. FCKSelection.Restore = function()
  195. {}
  196. FCKSelection.Release = function()
  197. {}