?? htmlarea.js
字號:
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 + -