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

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. (IE specific implementation)
  22.  */
  23. // Get the selection type.
  24. FCKSelection.GetType = function()
  25. {
  26. // It is possible that we can still get a text range object even when type=='None' is returned by IE.
  27. // So we'd better check the object returned by createRange() rather than by looking at the type.
  28. try
  29. {
  30. var ieType = FCKSelection.GetSelection().type ;
  31. if ( ieType == 'Control' || ieType == 'Text' )
  32. return ieType ;
  33. if ( this.GetSelection().createRange().parentElement )
  34. return 'Text' ;
  35. }
  36. catch(e)
  37. {
  38. // Nothing to do, it will return None properly.
  39. }
  40. return 'None' ;
  41. } ;
  42. // Retrieves the selected element (if any), just in the case that a single
  43. // element (object like and image or a table) is selected.
  44. FCKSelection.GetSelectedElement = function()
  45. {
  46. if ( this.GetType() == 'Control' )
  47. {
  48. var oRange = this.GetSelection().createRange() ;
  49. if ( oRange && oRange.item )
  50. return this.GetSelection().createRange().item(0) ;
  51. }
  52. return null ;
  53. } ;
  54. FCKSelection.GetParentElement = function()
  55. {
  56. switch ( this.GetType() )
  57. {
  58. case 'Control' :
  59. var el = FCKSelection.GetSelectedElement() ;
  60. return el ? el.parentElement : null ;
  61. case 'None' :
  62. return null ;
  63. default :
  64. return this.GetSelection().createRange().parentElement() ;
  65. }
  66. } ;
  67. FCKSelection.GetBoundaryParentElement = function( startBoundary )
  68. {
  69. switch ( this.GetType() )
  70. {
  71. case 'Control' :
  72. var el = FCKSelection.GetSelectedElement() ;
  73. return el ? el.parentElement : null ;
  74. case 'None' :
  75. return null ;
  76. default :
  77. var doc = FCK.EditorDocument ;
  78. var range = doc.selection.createRange() ;
  79. range.collapse( startBoundary !== false ) ;
  80. var el = range.parentElement() ;
  81. // It may happen that range is comming from outside "doc", so we
  82. // must check it (#1204).
  83. return FCKTools.GetElementDocument( el ) == doc ? el : null ;
  84. }
  85. } ;
  86. FCKSelection.SelectNode = function( node )
  87. {
  88. FCK.Focus() ;
  89. this.GetSelection().empty() ;
  90. var oRange ;
  91. try
  92. {
  93. // Try to select the node as a control.
  94. oRange = FCK.EditorDocument.body.createControlRange() ;
  95. oRange.addElement( node ) ;
  96. }
  97. catch(e)
  98. {
  99. // If failed, select it as a text range.
  100. oRange = FCK.EditorDocument.body.createTextRange() ;
  101. oRange.moveToElementText( node ) ;
  102. }
  103. oRange.select() ;
  104. } ;
  105. FCKSelection.Collapse = function( toStart )
  106. {
  107. FCK.Focus() ;
  108. if ( this.GetType() == 'Text' )
  109. {
  110. var oRange = this.GetSelection().createRange() ;
  111. oRange.collapse( toStart == null || toStart === true ) ;
  112. oRange.select() ;
  113. }
  114. } ;
  115. // The "nodeTagName" parameter must be Upper Case.
  116. FCKSelection.HasAncestorNode = function( nodeTagName )
  117. {
  118. var oContainer ;
  119. if ( this.GetSelection().type == "Control" )
  120. {
  121. oContainer = this.GetSelectedElement() ;
  122. }
  123. else
  124. {
  125. var oRange  = this.GetSelection().createRange() ;
  126. oContainer = oRange.parentElement() ;
  127. }
  128. while ( oContainer )
  129. {
  130. if ( oContainer.nodeName.IEquals( nodeTagName ) ) return true ;
  131. oContainer = oContainer.parentNode ;
  132. }
  133. return false ;
  134. } ;
  135. // The "nodeTagName" parameter must be UPPER CASE.
  136. // It can be also an array of names
  137. FCKSelection.MoveToAncestorNode = function( nodeTagName )
  138. {
  139. var oNode, oRange ;
  140. if ( ! FCK.EditorDocument )
  141. return null ;
  142. if ( this.GetSelection().type == "Control" )
  143. {
  144. oRange = this.GetSelection().createRange() ;
  145. for ( i = 0 ; i < oRange.length ; i++ )
  146. {
  147. if (oRange(i).parentNode)
  148. {
  149. oNode = oRange(i).parentNode ;
  150. break ;
  151. }
  152. }
  153. }
  154. else
  155. {
  156. oRange  = this.GetSelection().createRange() ;
  157. oNode = oRange.parentElement() ;
  158. }
  159. while ( oNode && !oNode.nodeName.Equals( nodeTagName ) )
  160. oNode = oNode.parentNode ;
  161. return oNode ;
  162. } ;
  163. FCKSelection.Delete = function()
  164. {
  165. // Gets the actual selection.
  166. var oSel = this.GetSelection() ;
  167. // Deletes the actual selection contents.
  168. if ( oSel.type.toLowerCase() != "none" )
  169. {
  170. oSel.clear() ;
  171. }
  172. return oSel ;
  173. } ;
  174. /**
  175.  * Returns the native selection object.
  176.  */
  177. FCKSelection.GetSelection = function()
  178. {
  179. this.Restore() ;
  180. return FCK.EditorDocument.selection ;
  181. }
  182. FCKSelection.Save = function( lock )
  183. {
  184. var editorDocument = FCK.EditorDocument ;
  185. if ( !editorDocument )
  186. return ;
  187. // Avoid saving again a selection while a dialog is open #2616
  188. if ( this.locked )
  189. return ;
  190. this.locked = !!lock ;
  191. var selection = editorDocument.selection ;
  192. var range ;
  193. if ( selection )
  194. {
  195. // The call might fail if the document doesn't have the focus (#1801),
  196. // but we don't want to modify the current selection (#2495) with a call to FCK.Focus() ;
  197. try {
  198. range = selection.createRange() ;
  199. }
  200. catch(e) {}
  201. // Ensure that the range comes from the editor document.
  202. if ( range )
  203. {
  204. if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument )
  205. range = null ;
  206. else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument )
  207. range = null ;
  208. }
  209. }
  210. this.SelectionData = range ;
  211. }
  212. FCKSelection._GetSelectionDocument = function( selection )
  213. {
  214. var range = selection.createRange() ;
  215. if ( !range )
  216. return null;
  217. else if ( range.item )
  218. return FCKTools.GetElementDocument( range.item( 0 ) ) ;
  219. else
  220. return FCKTools.GetElementDocument( range.parentElement() ) ;
  221. }
  222. FCKSelection.Restore = function()
  223. {
  224. if ( this.SelectionData )
  225. {
  226. FCK.IsSelectionChangeLocked = true ;
  227. try
  228. {
  229. // Don't repeat the restore process if the editor document is already selected.
  230. if ( String( this._GetSelectionDocument( FCK.EditorDocument.selection ).body.contentEditable ) == 'true' )
  231. {
  232. FCK.IsSelectionChangeLocked = false ;
  233. return ;
  234. }
  235. this.SelectionData.select() ;
  236. }
  237. catch ( e ) {}
  238. FCK.IsSelectionChangeLocked = false ;
  239. }
  240. }
  241. FCKSelection.Release = function()
  242. {
  243. this.locked = false ;
  244. delete this.SelectionData ;
  245. }