dnteditor.js
上传用户:wenllgg125
上传日期:2020-04-09
资源大小:7277k
文件大小:13k
源码类别:

SCSI/ASPI

开发平台:

Others

  1. var DNTeditor = function(instanceName, width, height, value) 
  2. {
  3.     // Properties
  4.     this.InstanceName = instanceName;
  5.     this.Width = width || '100%';
  6.     this.Height = height || '200';
  7.     this.Value = value || '';
  8.     this.BasePath = '/';
  9.     this.RedundancyHeight = undefined;
  10.     this.Style = '';
  11.     this.CheckBrowser = true;
  12.     this.DisplayErrors = true;
  13.     this.EnableSafari = false;  // This is a temporary property, while Safari support is under development.
  14.     this.EnableOpera = false;  // This is a temporary property, while Opera support is under development.
  15.     this.Basic = false;
  16.     this.IsAutoSave = true;
  17.     //this.Config = new Object() ;
  18.     // Events
  19.     this.OnError = null; // function( source, errorNumber, errorDescription )
  20.     this.OnChange = null;
  21. }
  22. DNTeditor.prototype.Create = function()
  23. {
  24.     document.write(this.CreateHtml());
  25.     this._SetValue();
  26. }
  27. DNTeditor.prototype._SetValue = function() 
  28. {
  29.     var iframe = document.getElementById(this.InstanceName + "___Frame");
  30.     var value = this.Value;
  31.     var style = this.Style;
  32.     var width = this.Width;
  33.     var height = this.Height;
  34.     var basic = this.Basic;
  35.     var isAutoSave = this.IsAutoSave;
  36.     var onchange = this.OnChange;
  37.     var redundancyheight = this.RedundancyHeight;
  38.     iframe.onload = function() {
  39.         InitializeEditor(iframe, value, style, width, height, basic, isAutoSave, onchange, redundancyheight);
  40.     };
  41.     iframe.onreadystatechange = function() {
  42.     if (this.readyState == 'complete') {
  43.             InitializeEditor(iframe, value, style, width, height, basic, isAutoSave, onchange, redundancyheight);
  44.         }
  45.     };
  46. }
  47. function InitializeEditor(iframe, value, style, width, height, basic, isAutoSave, onchange, redundancyheight) 
  48. {
  49.     if (redundancyheight == undefined)
  50.         redundancyheight = 170;
  51.     else if (is_moz)
  52.         redundancyheight += 100;
  53.     if (style != '') {
  54.     iframe.contentWindow.document.getElementById('editorcss').href = style;
  55. }
  56. iframe.contentWindow.document.getElementById('e_iframe').contentWindow.document.body.innerHTML = value;
  57. iframe.contentWindow.document.getElementById('e_textarea').value = value;
  58. //iframe.contentWindow.document.getElementById('bbcodemode').style.top = "1px";
  59. //iframe.contentWindow.document.getElementById('wysiwygmode').style.top = "1px";
  60. iframe.contentWindow.document.getElementById('e_textarea').style.width = width;
  61. iframe.contentWindow.document.getElementById('e_textarea').style.height = height;
  62. //iframe.contentWindow.document.getElementById('e_iframe').style.width = width;
  63. iframe.contentWindow.document.getElementById('e_iframe').style.height = height;
  64. if(is_moz || is_opera) {
  65.     iframe.contentWindow.document.getElementById('e_iframe').contentWindow.addEventListener('keydown', function(e) {ctlentParent(e);}, true);
  66.     iframe.contentWindow.document.getElementById('e_iframe').contentWindow.addEventListener('keyup', function(e) {if (onchange){onchange();}}, true);
  67. }
  68. else {
  69.     iframe.contentWindow.document.getElementById('e_iframe').contentWindow.document.body.attachEvent("onkeydown", ctlentParent);
  70.     iframe.contentWindow.document.getElementById('e_iframe').contentWindow.document.body.attachEvent("onkeyup", function(e){if (onchange){onchange();}});
  71. }
  72. var newheight = parseInt(iframe.height, 10);
  73. iframe.style.height = (newheight + redundancyheight) + 'px';
  74. if (basic && basic===true)
  75. {
  76. iframe.contentWindow.document.getElementById('e_morebuttons').style.display = "none";
  77. //iframe.contentWindow.document.getElementById('e_bottom').style.display = "none";
  78. iframe.style.height = (newheight + 90) + 'px';
  79. }
  80. if (isAutoSave == false)
  81. {
  82. iframe.contentWindow.onbeforeunload = function(){};
  83. }
  84. }
  85. DNTeditor.prototype.CreateHtml = function()
  86. {
  87.      // Check for errors
  88. if ( !this.InstanceName || this.InstanceName.length == 0 )
  89. {
  90. this._ThrowError( 701, 'You must specify an instance name.' ) ;
  91. return '' ;
  92. }
  93. var sHtml = '<div>' ;
  94. if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
  95. {
  96. sHtml += '<input type="hidden" id="' + this.InstanceName + '" name="' + this.InstanceName + '" value="' + this._HTMLEncode( this.Value ) + '" style="display:none" />' ;
  97. //sHtml += this._GetConfigHtml() ;
  98. sHtml += this._GetIFrameHtml() ;
  99. }
  100. else
  101. {
  102. var sWidth  = this.Width.toString().indexOf('%')  > 0 ? this.Width  : this.Width  + 'px' ;
  103. var sHeight = this.Height.toString().indexOf('%') > 0 ? this.Height : this.Height + 'px' ;
  104. sHtml += '<textarea name="' + this.InstanceName + '" rows="4" cols="40" style="width:' + sWidth + ';height:' + sHeight + '">' + this._HTMLEncode( this.Value ) + '</textarea>' ;
  105. }
  106. sHtml += '</div>' ;
  107. return sHtml ;
  108. }
  109. DNTeditor.prototype.ReplaceTextarea = function()
  110. {
  111. if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
  112. {
  113. // We must check the elements firstly using the Id and then the name.
  114. var oTextarea = document.getElementById( this.InstanceName ) ;
  115. var colElementsByName = document.getElementsByName( this.InstanceName ) ;
  116. var i = 0;
  117. while ( oTextarea || i == 0 )
  118. {
  119. if ( oTextarea && oTextarea.tagName.toLowerCase() == 'textarea' )
  120. break ;
  121. oTextarea = colElementsByName[i++] ;
  122. }
  123. if ( !oTextarea )
  124. {
  125. alert( 'Error: The TEXTAREA with id or name set to "' + this.InstanceName + '" was not found' ) ;
  126. return ;
  127. }
  128. oTextarea.style.display = 'none' ;
  129. //this._InsertHtmlBefore( this._GetConfigHtml(), oTextarea ) ;
  130. this._InsertHtmlBefore( this._GetIFrameHtml(), oTextarea ) ;
  131. this._SetValue();
  132. }
  133. }
  134. DNTeditor.prototype.InsertHtml = function( html )
  135. {
  136.     
  137. }
  138. DNTeditor.prototype._InsertHtmlBefore = function( html, element )
  139. {
  140. if ( element.insertAdjacentHTML ) // IE
  141. element.insertAdjacentHTML( 'beforeBegin', html ) ;
  142. else // Gecko
  143. {
  144. var oRange = document.createRange() ;
  145. oRange.setStartBefore( element ) ;
  146. var oFragment = oRange.createContextualFragment( html );
  147. element.parentNode.insertBefore( oFragment, element ) ;
  148. }
  149. }
  150. DNTeditor.prototype._GetIFrameHtml = function()
  151. {
  152. var sFile = 'cp_editor.htm?style=' + this.Style ;
  153. var sLink = this.BasePath + 'editor/' + sFile ;
  154. return '<iframe id="' + this.InstanceName + '___Frame" src="' + sLink + '" allowTransparency="true" width="' + this.Width + '" height="' + this.Height + '" frameborder="0" scrolling="no"></iframe>' ;
  155. }
  156. DNTeditor.prototype._ThrowError = function( errorNumber, errorDescription )
  157. {
  158. this.ErrorNumber = errorNumber ;
  159. this.ErrorDescription = errorDescription ;
  160. if ( this.DisplayErrors )
  161. {
  162. document.write( '<div style="COLOR: #ff0000">' ) ;
  163. document.write( '[ DNTeditor Error ' + this.ErrorNumber + ': ' + this.ErrorDescription + ' ]' ) ;
  164. document.write( '</div>' ) ;
  165. }
  166. if ( typeof( this.OnError ) == 'function' )
  167. this.OnError( this, errorNumber, errorDescription ) ;
  168. }
  169. DNTeditor.prototype._HTMLEncode = function( text )
  170. {
  171. if ( typeof( text ) != "string" )
  172. text = text.toString() ;
  173. text = text.replace(
  174. /&/g, "&amp;").replace(
  175. /"/g, "&quot;").replace(
  176. /</g, "&lt;").replace(
  177. />/g, "&gt;") ;
  178. return text ;
  179. }
  180. DNTeditor.prototype._IsCompatibleBrowser = function()
  181. {
  182. return DNTeditor_IsCompatibleBrowser( this.EnableSafari, this.EnableOpera ) ;
  183. }
  184. function DNTeditor_IsCompatibleBrowser( enableSafari, enableOpera )
  185. {
  186. var sAgent = navigator.userAgent.toLowerCase() ;
  187. // Internet Explorer
  188. if ( sAgent.indexOf("msie") != -1 && sAgent.indexOf("mac") == -1 && sAgent.indexOf("opera") == -1 )
  189. {
  190. var sBrowserVersion = navigator.appVersion.match(/MSIE (...)/)[1] ;
  191. return ( sBrowserVersion >= 5.5 ) ;
  192. }
  193. // Gecko (Opera 9 tries to behave like Gecko at this point).
  194. if ( navigator.product == "Gecko" && navigator.productSub >= 20030210 && !( typeof(opera) == 'object' && opera.postError ) )
  195. return true ;
  196. // Opera
  197. if ( enableOpera && navigator.appName == 'Opera' && parseInt( navigator.appVersion, 10 ) >= 9 )
  198. return true ;
  199. // Safari
  200. if ( enableSafari && sAgent.indexOf( 'safari' ) != -1 )
  201. return ( sAgent.match( /safari/(d+)/ )[1] >= 312 ) ; // Build must be at least 312 (1.3)
  202. return false ;
  203. }
  204. DNTeditor.prototype.GetHtml = function()
  205. {
  206.     var iframe = document.getElementById(this.InstanceName + "___Frame");
  207. var doc = iframe.contentWindow.document;
  208. try {
  209.     doc.getElementById("wysiwygmode").click();
  210. }
  211. catch(e) {
  212. }
  213. var value;
  214. if (doc.getElementById('e_textarea').style.display == 'none')
  215. {
  216. value = doc.getElementById('e_iframe').contentWindow.document.body.innerHTML;
  217. }
  218. else
  219. {
  220. value = doc.getElementById('e_textarea').value;
  221. }
  222. return value;
  223. }
  224. DNTeditor.prototype.GetText = function()
  225. {
  226. return this.GetHtml().replace(/<[^>]*>/ig, '');
  227. }
  228. DNTeditor.prototype._InsertNodeAtSelection = function(text) {
  229. this._CheckFocus();
  230.     var editwin = document.getElementById(this.InstanceName + "___Frame").contentWindow.document.getElementById('e_iframe').contentWindow;
  231.     var editdoc = editwin.document;
  232. var sel = editwin.getSelection();
  233. var range = sel ? sel.getRangeAt(0) : editdoc.createRange();
  234. sel.removeAllRanges();
  235. range.deleteContents();
  236. var node = range.startContainer;
  237. var pos = range.startOffset;
  238. switch(node.nodeType) {
  239. case Node.ELEMENT_NODE:
  240. if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
  241. selNode = text.firstChild;
  242. } else {
  243. selNode = text;
  244. }
  245. node.insertBefore(text, node.childNodes[pos]);
  246. this._AddRange(selNode);
  247. break;
  248. case Node.TEXT_NODE:
  249. if(text.nodeType == Node.TEXT_NODE) {
  250. var text_length = pos + text.length;
  251. node.insertData(pos, text.data);
  252. range = editdoc.createRange();
  253. range.setEnd(node, text_length);
  254. range.setStart(node, text_length);
  255. sel.addRange(range);
  256. } else {
  257. node = node.splitText(pos);
  258. var selNode;
  259. if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
  260. selNode = text.firstChild;
  261. } else {
  262. selNode = text;
  263. }
  264. node.parentNode.insertBefore(text, node);
  265. this._AddRange(selNode);
  266. }
  267. break;
  268. }
  269. }
  270. DNTeditor.prototype._AddRange = function (node) {
  271. this._CheckFocus();
  272.     var editwin = document.getElementById(this.InstanceName + "___Frame").contentWindow.document.getElementById('e_iframe').contentWindow;
  273.     var editdoc = editwin.document;
  274. var sel = editwin.getSelection();
  275. var range = editdoc.createRange();
  276. range.selectNodeContents(node);
  277. sel.removeAllRanges();
  278. sel.addRange(range);
  279. }
  280. DNTeditor.prototype.InsertText = function(text, movestart, moveend, select) {
  281.     var iframe = document.getElementById(this.InstanceName + "___Frame");
  282. var doc = iframe.contentWindow.document;
  283. var editdoc = doc.getElementById('e_iframe').contentWindow.document;
  284. if(doc.getElementById('e_textarea').style.display == 'none') {
  285. if(is_moz || is_opera) {
  286. //applyFormat('removeformat');
  287. editdoc.execCommand('removeformat', false, true);
  288. var fragment = editdoc.createDocumentFragment();
  289. var holder = editdoc.createElement('span');
  290. holder.innerHTML = text;
  291. while(holder.firstChild) {
  292. fragment.appendChild(holder.firstChild);
  293. }
  294. this._InsertNodeAtSelection(fragment);
  295. } else {
  296.     this._CheckFocus();
  297. if(typeof(editdoc.selection) != 'undefined' && editdoc.selection.type != 'Text' && editdoc.selection.type != 'None') {
  298. movestart = false;
  299. editdoc.selection.clear();
  300. }
  301. var sel = editdoc.selection.createRange();
  302. sel.pasteHTML(text);
  303. if(text.indexOf('n') == -1) {
  304. if(typeof(movestart) != 'undefined') {
  305. sel.moveStart('character', -strlen(text) + movestart);
  306. sel.moveEnd('character', -moveend);
  307. } else if(movestart != false) {
  308. sel.moveStart('character', -strlen(text));
  309. }
  310. if(typeof(select) != 'undefined' && select) {
  311. sel.select();
  312. }
  313. }
  314. }
  315. } else {
  316. this._CheckFocus();
  317. editdoc = doc.getElementById('e_textarea');
  318. if(typeof(editdoc.selectionStart) != 'undefined') {
  319. var opn = editdoc.selectionStart + 0;
  320. editdoc.value = editdoc.value.substr(0, editdoc.selectionStart) + text + editdoc.value.substr(editdoc.selectionEnd);
  321. if(typeof(movestart) != 'undefined') {
  322. editdoc.selectionStart = opn + movestart;
  323. editdoc.selectionEnd = opn + strlen(text) - moveend;
  324. } else if(movestart !== false) {
  325. editdoc.selectionStart = opn;
  326. editdoc.selectionEnd = opn + strlen(text);
  327. }
  328. } else if(document.selection && document.selection.createRange) {
  329. var sel = document.selection.createRange();
  330. sel.text = text.replace(/r?n/g, 'rn');
  331. if(typeof(movestart) != 'undefined') {
  332. sel.moveStart('character', -strlen(text) +movestart);
  333. sel.moveEnd('character', -moveend);
  334. } else if(movestart !== false) {
  335. sel.moveStart('character', -strlen(text));
  336. }
  337. sel.select();
  338. } else {
  339. editdoc.value += text;
  340. }
  341. }
  342. }
  343. DNTeditor.prototype._CheckFocus = function() {
  344.     try {
  345.             var iframe = document.getElementById(this.InstanceName + "___Frame");
  346.         iframe.contentWindow.document.getElementById('e_iframe').contentWindow.focus();
  347.         iframe.contentWindow.document.getElementById('e_textarea').focus();
  348.     }
  349.     catch(e) {
  350.     }
  351. }