⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlarea.js

📁 javascript写的在线编辑器
💻 JS
📖 第 1 页 / 共 5 页
字号:
	function createSelect(txt) {		var options = null;		var el = null;		var cmd = null;		var customSelects = editor.config.customSelects;		var context = null;		switch (txt) {		    case "fontsize":		    case "fontname":		    case "formatblock":			// the following line retrieves the correct			// configuration option because the variable name			// inside the Config object is named the same as the			// button/select in the toolbar.  For instance, if txt			// == "formatblock" we retrieve config.formatblock (or			// a different way to write it in JS is			// config["formatblock"].			options = editor.config[txt];			cmd = txt;			break;		    default:			// try to fetch it from the list of registered selects			cmd = txt;			var dropdown = customSelects[cmd];			if (typeof dropdown != "undefined") {				options = dropdown.options;				context = dropdown.context;			} else {				alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");			}			break;		}		if (options) {			el = document.createElement("select");			var obj = {				name	: txt, // field name				element : el,	// the UI element (SELECT)				enabled : true, // is it enabled?				text	: false, // enabled in text mode?				cmd	: cmd, // command ID				state	: setButtonStatus, // for changing state				context : context			};			tb_objects[txt] = obj;			for (var i in options) {				var op = document.createElement("option");				op.appendChild(document.createTextNode(i));				op.value = options[i];				el.appendChild(op);			}			HTMLArea._addEvent(el, "change", function () {				editor._comboSelected(el, txt);			});		}		return el;	}; // END of function: createSelect	// appends a new button to toolbar	function createButton(txt) {		// the element that will be created		var el = null;		var btn = null;		switch (txt) {		    case "separator":			el = document.createElement("div");			el.className = "separator";			break;		    case "space":			el = document.createElement("div");			el.className = "space";			break;		    case "linebreak":			newLine();			return false;		    case "textindicator":			el = document.createElement("div");			el.appendChild(document.createTextNode("A"));			el.className = "indicator";			el.title = HTMLArea.I18N.tooltips.textindicator;			var obj = {				name	: txt, // the button name (i.e. 'bold')				element : el, // the UI element (DIV)				enabled : true, // is it enabled?				active	: false, // is it pressed?				text	: false, // enabled in text mode?				cmd	: "textindicator", // the command ID				state	: setButtonStatus // for changing state			};			tb_objects[txt] = obj;			break;		    default:			btn = editor.config.btnList[txt];		}		if (!el && btn) {			el = document.createElement("div");			el.title = btn[0];			el.className = "button";			// let's just pretend we have a button object, and			// assign all the needed information to it.			var obj = {				name	: txt, // the button name (i.e. 'bold')				element : el, // the UI element (DIV)				enabled : true, // is it enabled?				active	: false, // is it pressed?				text	: btn[2], // enabled in text mode?				cmd	: btn[3], // the command ID				state	: setButtonStatus, // for changing state				context : btn[4] || null // enabled in a certain context?			};			tb_objects[txt] = obj;			// handlers to emulate nice flat toolbar buttons			HTMLArea._addEvent(el, "mouseover", function () {				if (obj.enabled) {					HTMLArea._addClass(el, "buttonHover");				}			});			HTMLArea._addEvent(el, "mouseout", function () {				if (obj.enabled) with (HTMLArea) {					_removeClass(el, "buttonHover");					_removeClass(el, "buttonActive");					(obj.active) && _addClass(el, "buttonPressed");				}			});			HTMLArea._addEvent(el, "mousedown", function (ev) {				if (obj.enabled) with (HTMLArea) {					_addClass(el, "buttonActive");					_removeClass(el, "buttonPressed");					_stopEvent(is_ie ? window.event : ev);				}			});			// when clicked, do the following:			HTMLArea._addEvent(el, "click", function (ev) {				if (obj.enabled) with (HTMLArea) {					_removeClass(el, "buttonActive");					_removeClass(el, "buttonHover");					obj.cmd(editor, obj.name, obj);					_stopEvent(is_ie ? window.event : ev);				}			});			var img = document.createElement("img");			img.src = btn[1];			img.style.width = "18px";			img.style.height = "18px";			el.appendChild(img);		} else if (!el) {			el = createSelect(txt);		}		if (el) {			var tb_cell = document.createElement("td");			tb_row.appendChild(tb_cell);			tb_cell.appendChild(el);		} else {			alert("FIXME: Unknown toolbar item: " + txt);		}		return el;	};	var first = true;	for (var i in this.config.toolbar) {		if (!first) {			createButton("linebreak");		} else {			first = false;		}		var group = this.config.toolbar[i];		for (var j in group) {			var code = group[j];			if (/^([IT])\[(.*?)\]/.test(code)) {				// special case, create text label				var l7ed = RegExp.$1 == "I"; // localized?				var label = RegExp.$2;				if (l7ed) {					label = HTMLArea.I18N.custom[label];				}				var tb_cell = document.createElement("td");				tb_row.appendChild(tb_cell);				tb_cell.className = "label";				tb_cell.innerHTML = label;			} else {				createButton(code);			}		}	}	this._htmlArea.appendChild(toolbar);};HTMLArea.prototype._createStatusBar = function() {	var statusbar = document.createElement("div");	statusbar.className = "statusBar";	this._htmlArea.appendChild(statusbar);	this._statusBar = statusbar;	// statusbar.appendChild(document.createTextNode(HTMLArea.I18N.msg["Path"] + ": "));	// creates a holder for the path view	div = document.createElement("span");	div.className = "statusBarTree";	div.innerHTML = HTMLArea.I18N.msg["Path"] + ": ";	this._statusBarTree = div;	this._statusBar.appendChild(div);	if (!this.config.statusBar) {		// disable it...		statusbar.style.display = "none";	}};// Creates the HTMLArea object and replaces the textarea with it.HTMLArea.prototype.generate = function () {	var editor = this;	// we'll need "this" in some nested functions	// get the textarea	var textarea = this._textArea;	if (typeof textarea == "string") {		// it's not element but ID		this._textArea = textarea = HTMLArea.getElementById("textarea", textarea);	}	this._ta_size = {		w: textarea.offsetWidth,		h: textarea.offsetHeight	};	textarea.style.display = "none";	// create the editor framework	var htmlarea = document.createElement("div");	htmlarea.className = "htmlarea";	this._htmlArea = htmlarea;	// insert the editor before the textarea.	textarea.parentNode.insertBefore(htmlarea, textarea);	if (textarea.form) {		// we have a form, on submit get the HTMLArea content and		// update original textarea.		var f = textarea.form;		if (typeof f.onsubmit == "function") {			var funcref = f.onsubmit;			if (typeof f.__msh_prevOnSubmit == "undefined") {				f.__msh_prevOnSubmit = [];			}			f.__msh_prevOnSubmit.push(funcref);		}		f.onsubmit = function() {			editor._textArea.value = editor.getHTML();			var a = this.__msh_prevOnSubmit;			// call previous submit methods if they were there.			if (typeof a != "undefined") {				for (var i in a) {					a[i]();				}			}		};	}	// add a handler for the "back/forward" case -- on body.unload we save	// the HTML content into the original textarea.	window.onunload = function() {		editor._textArea.value = editor.getHTML();	};	// creates & appends the toolbar	this._createToolbar();	// create the IFRAME	var iframe = document.createElement("iframe");	htmlarea.appendChild(iframe);	this._iframe = iframe;	// creates & appends the status bar, if the case	this._createStatusBar();	// remove the default border as it keeps us from computing correctly	// the sizes.  (somebody tell me why doesn't this work in IE)	if (!HTMLArea.is_ie) {		iframe.style.borderWidth = "1px";	// iframe.frameBorder = "1";	// iframe.marginHeight = "0";	// iframe.marginWidth = "0";	}	// size the IFRAME according to user's prefs or initial textarea	var height = (this.config.height == "auto" ? (this._ta_size.h + "px") : this.config.height);	height = parseInt(height);	var width = (this.config.width == "auto" ? (this._ta_size.w + "px") : this.config.width);	width = parseInt(width);	if (!HTMLArea.is_ie) {		height -= 2;		width -= 2;	}	iframe.style.width = width + "px";	if (this.config.sizeIncludesToolbar) {		// substract toolbar height		height -= this._toolbar.offsetHeight;		height -= this._statusBar.offsetHeight;	}	if (height < 0) {		height = 0;	}	iframe.style.height = height + "px";	// the editor including the toolbar now have the same size as the	// original textarea.. which means that we need to reduce that a bit.	textarea.style.width = iframe.style.width; 	textarea.style.height = iframe.style.height;	// IMPORTANT: we have to allow Mozilla a short time to recognize the	// new frame.  Otherwise we get a stupid exception.	function initIframe() {		var doc = editor._iframe.contentWindow.document;		if (!doc) {			// Try again..			// FIXME: don't know what else to do here.  Normally			// we'll never reach this point.			if (HTMLArea.is_gecko) {				setTimeout(initIframe, 100);				return false;			} else {				alert("ERROR: IFRAME can't be initialized.");			}		}		if (HTMLArea.is_gecko) {			// enable editable mode for Mozilla			doc.designMode = "on";		}		editor._doc = doc;		if (!editor.config.fullPage) {			doc.open();			var html = "<html>\n";			html += "<head>\n";			if (editor.config.baseURL)				html += '<base href="' + editor.config.baseURL + '" />';			html += "<style> html,body { border: 0px; } " +				editor.config.pageStyle + "</style>\n";			html += "</head>\n";			html += "<body>\n";			html += editor._textArea.value;			html += "</body>\n";			html += "</html>";			doc.write(html);			doc.close();		} else {			var html = editor._textArea.value;			if (html.match(HTMLArea.RE_doctype)) {				editor.setDoctype(RegExp.$1);				html = html.replace(HTMLArea.RE_doctype, "");			}			doc.open();			doc.write(html);			doc.close();		}		if (HTMLArea.is_ie) {			// enable editable mode for IE.	 For some reason this			// doesn't work if done in the same place as for Gecko			// (above).			doc.body.contentEditable = true;		}		editor.focusEditor();		// intercept some events; for updating the toolbar & keyboard handlers		HTMLArea._addEvents			(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"],			 function (event) {				 return editor._editorEvent(HTMLArea.is_ie ? editor._iframe.contentWindow.event : event);			 });		// check if any plugins have registered refresh handlers		for (var i in editor.plugins) {			var plugin = editor.plugins[i].instance;			if (typeof plugin.onGenerate == "function")				plugin.onGenerate();		}		setTimeout(function() {			editor.updateToolbar();		}, 250);		if (typeof editor.onGenerate == "function")			editor.onGenerate();	};	setTimeout(initIframe, 100);};// Switches editor mode; parameter can be "textmode" or "wysiwyg".  If no// parameter was passed this function toggles between modes.HTMLArea.prototype.setMode = function(mode) {	if (typeof mode == "undefined") {		mode = ((this._editMode == "textmode") ? "wysiwyg" : "textmode");	}	switch (mode) {	    case "textmode":		this._textArea.value = this.getHTML();		this._iframe.style.display = "none";		this._textArea.style.display = "block";		if (this.config.statusBar) {			this._statusBar.innerHTML = HTMLArea.I18N.msg["TEXT_MODE"];		}		break;	    case "wysiwyg":		if (HTMLArea.is_gecko) {			// disable design mode before changing innerHTML			try {				this._doc.designMode = "off";			} catch(e) {};		}		if (!this.config.fullPage)			this._doc.body.innerHTML = this.getHTML();		else			this.setFullHTML(this.getHTML());		this._iframe.style.display = "block";

⌨️ 快捷键说明

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