📄 htmlarea.js
字号:
//
// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
// This copyright notice MUST stay intact for use (see license.txt).
//
// A free WYSIWYG editor replacement for <textarea> fields.
// For full source code and docs, visit http://www.interactivetools.com/
//
// Version 3.0 developed by Mihai Bazon for InteractiveTools.
// http://students.infoiasi.ro/~mishoo
//
// $Id$
// Creates a new HTMLArea object. Tries to replace the textarea with the given
// ID with it.
function HTMLArea(textarea, config) {
if (HTMLArea.checkSupportedBrowser()) {
if (typeof config == "undefined") {
this.config = new HTMLArea.Config();
} else {
this.config = config;
}
this._htmlArea = null;
this._textArea = textarea;
this._editMode = "wysiwyg";
this.plugins = {};
this._timerToolbar = null;
this._mdoc = document;
// cache the document, we need it in plugins
}
}
;
HTMLArea.Config = function () {
this.version = "3.0";
this.width = "auto";
this.height = "auto";
// enable creation of a status bar?
this.statusBar = true;
// the next parameter specifies whether the toolbar should be included
// in the size or not.
this.sizeIncludesToolbar = true;
// style included in the iframe document
this.pageStyle = "body { background-color: #fff; font-family: arial;font-size: 12px; }";
if (typeof _editor_url != "undefined") {
this.editorURL = _editor_url;
} else {
this.editorURL = "";
}
// URL-s
this.imgURL = "images/";
this.popupURL = "";
// configuration for plugins
this.plugins = {};
/** CUSTOMIZING THE TOOLBAR
* -------------------------
*
* It is recommended that you customize the toolbar contents in an
* external file (i.e. the one calling HTMLArea) and leave this one
* unchanged. That's because when we (InteractiveTools.com) release a
* new official version, it's less likely that you will have problems
* upgrading HTMLArea.
*/
this.toolbar = [
[ "fontname", "space","fontsize", "space", "formatblock", "space",
"bold", "italic", "underline", "separator",
"strikethrough", "subscript", "superscript", "separator",
"forecolor", "hilitecolor", "textindicator", "separator"
],
[ "copy", "cut", "paste", "space", "separator",
"justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
"insertorderedlist", "insertunorderedlist", "outdent", "indent", "separator",
"createlink","inserthorizontalrule", "separator"
]
];
this.fontname = {
"字体": '',
"Arial": 'arial,helvetica,sans-serif',
"Courier New": 'courier new,courier,monospace',
"Georgia": 'georgia,times new roman,times,serif',
"Tahoma": 'tahoma,arial,helvetica,sans-serif',
"Times New Roman": 'times new roman,times,serif',
"Verdana": 'verdana,arial,helvetica,sans-serif',
"impact": 'impact',
"WingDings": 'wingdings',
"宋体": '宋体',
"黑体": '黑体',
"楷体": '楷体_GB2312',
"仿宋": '仿宋_GB2312',
"MS宋体": 'MS Song',
"MS黑体": 'MS Hei'
};
this.fontsize = {
"字号": "",
"1 ": "1",
"2 ": "2",
"3 ": "3",
"4 ": "4",
"5 ": "5",
"6 ": "6",
"7 ": "7"
};
this.formatblock = {
"标题1": "h1",
"标题2": "h2",
"标题3": "h3",
"标题4": "h4",
"标题5": "h5",
"标题6": "h6",
"正文": "p"
};
this.customSelects = {};
function cut_copy_paste(e, cmd, obj) {
try {
e.execCommand(cmd);
} catch (e) {
if (HTMLArea.is_gecko) {
alert("Some revisions of Mozilla/Gecko do not support programatic " +
"access to cut/copy/paste functions, for security reasons. " +
"Your browser is one of them. Please use the standard key combinations:\n" +
"CTRL-X for cut, CTRL-C for copy, CTRL-V for paste.");
obj.element.style.display = "none";
}
}
}
;
// ADDING CUSTOM BUTTONS: please read below!
// format of the btnList elements is "ID: [ ToolTip, Icon, Enabled in text mode?, ACTION ]"
// - ID: unique ID for the button. If the button calls document.execCommand
// it's wise to give it the same name as the called command.
// - ACTION: function that gets called when the button is clicked.
// it has the following prototype:
// function(editor, buttonName)
// - editor is the HTMLArea object that triggered the call
// - buttonName is the ID of the clicked button
// These 2 parameters makes it possible for you to use the same
// handler for more HTMLArea objects or for more different buttons.
// - ToolTip: default tooltip, for cases when it is not defined in the -lang- file (HTMLArea.I18N)
// - Icon: path to an icon image file for the button (TO DO: use one image for all buttons!)
// - Enabled in text mode: if false the button gets disabled for text-only mode; otherwise enabled all the time.
this.btnList = {
bold: [ "Bold", "images/ed_format_bold.gif", false, function(e) {
e.execCommand("bold");
} ],
italic: [ "Italic", "images/ed_format_italic.gif", false, function(e) {
e.execCommand("italic");
} ],
underline: [ "Underline", "images/ed_format_underline.gif", false, function(e) {
e.execCommand("underline");
} ],
strikethrough: [ "Strikethrough", "images/ed_format_strike.gif", false, function(e) {
e.execCommand("strikethrough");
} ],
subscript: [ "Subscript", "images/ed_format_sub.gif", false, function(e) {
e.execCommand("subscript");
} ],
superscript: [ "Superscript", "images/ed_format_sup.gif", false, function(e) {
e.execCommand("superscript");
} ],
justifyleft: [ "Justify Left", "images/ed_align_left.gif", false, function(e) {
e.execCommand("justifyleft");
} ],
justifycenter: [ "Justify Center", "images/ed_align_center.gif", false, function(e) {
e.execCommand("justifycenter");
} ],
justifyright: [ "Justify Right", "images/ed_align_right.gif", false, function(e) {
e.execCommand("justifyright");
} ],
justifyfull: [ "Justify Full", "images/ed_align_justify.gif", false, function(e) {
e.execCommand("justifyfull");
} ],
insertorderedlist: [ "Ordered List", "images/ed_list_num.gif", false, function(e) {
e.execCommand("insertorderedlist");
} ],
insertunorderedlist: [ "Bulleted List", "images/ed_list_bullet.gif", false, function(e) {
e.execCommand("insertunorderedlist");
} ],
outdent: [ "Decrease Indent", "images/ed_indent_less.gif", false, function(e) {
e.execCommand("outdent");
} ],
indent: [ "Increase Indent", "images/ed_indent_more.gif", false, function(e) {
e.execCommand("indent");
} ],
forecolor: [ "Font Color", "images/ed_color_fg.gif", false, function(e) {
e.execCommand("forecolor");
} ],
hilitecolor: [ "Background Color", "images/ed_color_bg.gif", false, function(e) {
e.execCommand("hilitecolor");
} ],
inserthorizontalrule: [ "Horizontal Rule", "images/ed_hr.gif", false, function(e) {
e.execCommand("inserthorizontalrule");
} ],
createlink: [ "Insert Web Link", "images/ed_link.gif", false, function(e) {
e.execCommand("createlink", true);
} ],
insertimage: [ "Insert Image", "images/ed_image.gif", false, function(e) {
e.execCommand("insertimage");
} ],
inserttable: [ "Insert Table", "images/insert_table.gif", false, function(e) {
e.execCommand("inserttable");
} ],
insertflash: [ "Insert Flash", "images/insert_flash.gif", false, function(e) {
e.execCommand("insertflash");
} ],
insertmedia: [ "Insert Media", "images/insert_media.gif", false, function(e) {
e.execCommand("insertmedia");
} ],
insertsmile: [ "Insert Smile", "images/insert_smile.gif", false, function(e) {
e.execCommand("insertsmile");
} ],
htmlmode: [ "Toggle HTML Source", "images/ed_html.gif", true, function(e) {
e.execCommand("htmlmode");
} ],
popupeditor: [ "Enlarge Editor", "images/fullscreen_maximize.gif", true, function(e) {
e.execCommand("popupeditor");
} ],
about: [ "About this editor", "images/ed_about.gif", true, function(e) {
e.execCommand("about");
} ],
showhelp: [ "Help using editor", "images/ed_help.gif", true, function(e) {
e.execCommand("showhelp");
} ],
undo: [ "Undoes your last action", "images/ed_undo.gif", false, function(e) {
e.execCommand("undo");
} ],
redo: [ "Redoes your last action", "images/ed_redo.gif", false, function(e) {
e.execCommand("redo");
} ],
cut: [ "Cut selection", "images/ed_cut.gif", false, cut_copy_paste ],
copy: [ "Copy selection", "images/ed_copy.gif", false, cut_copy_paste ],
paste: [ "Paste from clipboard", "images/ed_paste.gif", false, cut_copy_paste ]
};
/* ADDING CUSTOM BUTTONS
* ---------------------
*
* It is recommended that you add the custom buttons in an external
* file and leave this one unchanged. That's because when we
* (InteractiveTools.com) release a new official version, it's less
* likely that you will have problems upgrading HTMLArea.
*
* Example on how to add a custom button when you construct the HTMLArea:
*
* var editor = new HTMLArea("your_text_area_id");
* var cfg = editor.config; // this is the default configuration
* cfg.btnList["my-hilite"] =
* [ function(editor) { editor.surroundHTML('<span style="background:yellow">', '</span>'); }, // action
* "Highlight selection", // tooltip
* "my_hilite.gif", // image
* false // disabled in text mode
* ];
* cfg.toolbar.push(["linebreak", "my-hilite"]); // add the new button to the toolbar
*
* An alternate (also more convenient and recommended) way to
* accomplish this is to use the registerButton function below.
*/
// initialize tooltips from the I18N module
for (var i in this.btnList) {
var btn = this.btnList[i];
if (typeof HTMLArea.I18N.tooltips[i] != "undefined") {
btn[0] = HTMLArea.I18N.tooltips[i];
}
}
};
/** Helper function: register a new button with the configuration. It can be
* called with all 5 arguments, or with only one (first one). When called with
* only one argument it must be an object with the following properties: id,
* tooltip, image, textMode, action. Examples:
*
* 1. config.registerButton("my-hilite", "Hilite text", "my-hilite.gif", false, function(editor) {...});
* 2. config.registerButton({
* id : "my-hilite", // the ID of your button
* tooltip : "Hilite text", // the tooltip
* image : "my-hilite.gif", // image to be displayed in the toolbar
* textMode : false, // disabled in text mode
* action : function(editor) { // called when the button is clicked
* editor.surroundHTML('<span class="hilite">', '</span>');
* },
* context : "p" // will be disabled if outside a <p> element
* });
*/
HTMLArea.Config.prototype.registerButton = function(id, tooltip, image, textMode, action, context) {
var the_id;
if (typeof id == "string") {
the_id = id;
} else if (typeof id == "object") {
the_id = id.id;
} else {
alert("ERROR [HTMLArea.Config::registerButton]:\ninvalid arguments");
return false;
}
// check for existing id
if (typeof this.customSelects[the_id] != "undefined") {
alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
}
if (typeof this.btnList[the_id] != "undefined") {
alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
}
switch (typeof id) {
case "string": this.btnList[id] = [ tooltip, image, textMode, action, context ]; break;
case "object": this.btnList[id.id] = [ id.tooltip, id.image, id.textMode, id.action, id.context ]; break;
}
};
/** The following helper function registers a dropdown box with the editor
* configuration. You still have to add it to the toolbar, same as with the
* buttons. Call it like this:
*
* FIXME: add example
*/
HTMLArea.Config.prototype.registerDropdown = function(object) {
// check for existing id
if (typeof this.customSelects[object.id] != "undefined") {
alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
}
if (typeof this.btnList[object.id] != "undefined") {
alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
}
this.customSelects[object.id] = object;
};
/** Helper function: replace all TEXTAREA-s in the document with HTMLArea-s. */
HTMLArea.replaceAll = function(config) {
var tas = document.getElementsByTagName("textarea");
for (var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate());
};
/** Helper function: replaces the TEXTAREA with the given ID with HTMLArea. */
HTMLArea.replace = function(id, config) {
var ta = document.getElementById(id);
return ta ? (new HTMLArea(ta, config)).generate() : null;
};
// Creates the toolbar and appends it to the _htmlarea
HTMLArea.prototype._createToolbar = function () {
var editor = this;
// to access this in nested functions
var toolbar = document.createElement("div");
this._toolbar = toolbar;
toolbar.className = "toolbar";
toolbar.unselectable = "1";
var tb_row = null;
var tb_objects = new Object();
this._toolbarObjects = tb_objects;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -