fckeditingarea.js
上传用户:li2971742
上传日期:2021-11-18
资源大小:39096k
文件大小:6k
源码类别:

OA系统

开发平台:

C#

  1. /*
  2.  * FCKeditor - The text editor for internet
  3.  * Copyright (C) 2003-2006 Frederico Caldeira Knabben
  4.  * 
  5.  * Licensed under the terms of the GNU Lesser General Public License:
  6.  *  http://www.opensource.org/licenses/lgpl-license.php
  7.  * 
  8.  * For further information visit:
  9.  *  http://www.fckeditor.net/
  10.  * 
  11.  * "Support Open Source software. What about a donation today?"
  12.  * 
  13.  * File Name: fckeditingarea.js
  14.  *  FCKEditingArea Class: renders an editable area.
  15.  * 
  16.  * File Authors:
  17.  *  Frederico Caldeira Knabben (fredck@fckeditor.net)
  18.  */
  19. /**
  20.  * @constructor
  21.  * @param {String} targetElement The element that will hold the editing area. Any child element present in the target will be deleted.
  22.  */
  23. var FCKEditingArea = function( targetElement )
  24. {
  25. this.TargetElement = targetElement ;
  26. this.Mode = FCK_EDITMODE_WYSIWYG ;
  27. if ( FCK.IECleanup )
  28. FCK.IECleanup.AddItem( this, FCKEditingArea_Cleanup ) ;
  29. }
  30. /**
  31.  * @param {String} html The complete HTML for the page, including DOCTYPE and the <html> tag.
  32.  */
  33. FCKEditingArea.prototype.Start = function( html, secondCall )
  34. {
  35. var eTargetElement = this.TargetElement ;
  36. var oTargetDocument = FCKTools.GetElementDocument( eTargetElement ) ;
  37. // Remove all child nodes from the target.
  38. while( eTargetElement.childNodes.length > 0 )
  39. eTargetElement.removeChild( eTargetElement.childNodes[0] ) ;
  40. if ( this.Mode == FCK_EDITMODE_WYSIWYG )
  41. {
  42. if ( FCKBrowserInfo.IsGecko )
  43. html = html.replace( /(<body[^>]*>)s*(</body>)/i, '$1' + GECKO_BOGUS + '$2' ) ;
  44. // Create the editing area IFRAME.
  45. var oIFrame = this.IFrame = oTargetDocument.createElement( 'iframe' ) ;
  46. oIFrame.src = 'javascript:void(0)' ;
  47. oIFrame.frameBorder = 0 ;
  48. oIFrame.width = oIFrame.height = '100%' ;
  49. // Append the new IFRAME to the target.
  50. eTargetElement.appendChild( oIFrame ) ;
  51. // IE has a bug with the <base> tag... it must have a </base> closer,
  52. // otherwise the all sucessive tags will be set as children nodes of the <base>.
  53. if ( FCKBrowserInfo.IsIE )
  54. html = html.replace( /(<base[^>]*?)s*/?>(?!s*</base>)/gi, '$1></base>' ) ;
  55. // Get the window and document objects used to interact with the newly created IFRAME.
  56. this.Window = oIFrame.contentWindow ;
  57. // IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
  58. // TODO: This error handler is not being fired.
  59. // this.Window.onerror = function() { alert( 'Error!' ) ; return true ; }
  60. var oDoc = this.Document = this.Window.document ;
  61. oDoc.open() ;
  62. oDoc.write( html ) ;
  63. oDoc.close() ;
  64. // Firefox 1.0.x is buggy... ohh yes... so let's do it two times and it
  65. // will magicaly work.
  66. if ( FCKBrowserInfo.IsGecko10 && !secondCall )
  67. {
  68. this.Start( html, true ) ;
  69. return ;
  70. }
  71. this.Window._FCKEditingArea = this ;
  72. // FF 1.0.x is buggy... we must wait a lot to enable editing because
  73. // sometimes the content simply disappears, for example when pasting
  74. // "bla1!<img src='some_url'>!bla2" in the source and then switching
  75. // back to design.
  76. if ( FCKBrowserInfo.IsGecko10 )
  77. this.Window.setTimeout( FCKEditingArea_CompleteStart, 500 ) ;
  78. else
  79. FCKEditingArea_CompleteStart.call( this.Window ) ;
  80. }
  81. else
  82. {
  83. var eTextarea = this.Textarea = oTargetDocument.createElement( 'textarea' ) ; 
  84. eTextarea.className = 'SourceField' ;
  85. eTextarea.dir = 'ltr' ;
  86. eTextarea.style.width = eTextarea.style.height = '100%' ;
  87. eTextarea.style.border = 'none' ;
  88. eTargetElement.appendChild( eTextarea ) ;
  89. eTextarea.value = html  ;
  90. // Fire the "OnLoad" event.
  91. FCKTools.RunFunction( this.OnLoad ) ;
  92. }
  93. }
  94. // "this" here is FCKEditingArea.Window 
  95. function FCKEditingArea_CompleteStart()
  96. {
  97. // Of Firefox, the DOM takes a little to become available. So we must wait for it in a loop.
  98. if ( !this.document.body )
  99. {
  100. this.setTimeout( FCKEditingArea_CompleteStart, 50 ) ;
  101. return ;
  102. }
  103. var oEditorArea = this._FCKEditingArea ;
  104. oEditorArea.MakeEditable() ;
  105. // Fire the "OnLoad" event.
  106. FCKTools.RunFunction( oEditorArea.OnLoad ) ;
  107. }
  108. FCKEditingArea.prototype.MakeEditable = function()
  109. {
  110. var oDoc = this.Document ;
  111. if ( FCKBrowserInfo.IsIE )
  112. oDoc.body.contentEditable = true ;
  113. else
  114. {
  115. try
  116. {
  117. oDoc.designMode = 'on' ;
  118. // Tell Gecko to use or not the <SPAN> tag for the bold, italic and underline.
  119. oDoc.execCommand( 'useCSS', false, !FCKConfig.GeckoUseSPAN ) ;
  120. // Analysing Firefox 1.5 source code, it seams that there is support for a 
  121. // "insertBrOnReturn" command. Applying it gives no error, but it doesn't 
  122. // gives the same behavior that you have with IE. It works only if you are
  123. // already inside a paragraph and it doesn't render correctly in the first enter.
  124. // oDoc.execCommand( 'insertBrOnReturn', false, false ) ;
  125. // Tell Gecko (Firefox 1.5+) to enable or not live resizing of objects (by Alfonso Martinez)
  126. oDoc.execCommand( 'enableObjectResizing', false, !FCKConfig.DisableObjectResizing ) ;
  127. // Disable the standard table editing features of Firefox.
  128. oDoc.execCommand( 'enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles ) ;
  129. }
  130. catch (e) {}
  131. }
  132. }
  133. FCKEditingArea.prototype.Focus = function()
  134. {
  135. try
  136. {
  137. if ( this.Mode == FCK_EDITMODE_WYSIWYG )
  138. {
  139. if ( FCKBrowserInfo.IsSafari )
  140. this.IFrame.focus() ;
  141. else
  142. this.Window.focus() ;
  143. }
  144. else
  145. this.Textarea.focus() ;
  146. }
  147. catch(e) {}
  148. }
  149. function FCKEditingArea_Cleanup()
  150. {
  151. this.TargetElement = null ;
  152. this.IFrame = null ;
  153. this.Document = null ;
  154. this.Textarea = null ;
  155. if ( this.Window )
  156. {
  157. this.Window._FCKEditingArea = null ;
  158. this.Window = null ;
  159. }
  160. }