?? htmlarea.js
字號:
HTMLArea._addClass(el, "buttonPressed");
} else {
HTMLArea._removeClass(el, "buttonPressed");
}
break;
}
this[id] = newval;
}
}; // END of function: setButtonStatus
// this function will handle creation of combo boxes. Receives as
// parameter the name of a button as defined in the toolBar config.
// This function is called from createButton, above, if the given "txt"
// doesn't match a button.
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";
iframe.style.width = width;
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);
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -