📄 rte.js
字号:
// setValue(): called from reset() to make a select list show the current font
// or style attributes
function selValue(el, str)
{
if (!RichEditor.txtView) return; // Disabled in View Source mode
for (var i = 0; i < el.length; i++) {
if ((!el[i].value && el[i].text == str) || el[i].value == str) {
el.selectedIndex = i;
return;
}
}
el.selectedIndex = 0;
}
// setState(): called from reset() to make a button represent the state
// of the current text. Pressed is on, unpressed is off.
function setState(el, on)
{
if (!RichEditor.txtView) return; // Disabled in View Source mode
if (!el.disabled) {
if (on) {
el.defaultState = el.className = "down";
} else {
el.defaultState = el.className = null;
}
}
}
// getStyle(): called to obtain the class or type of formatting applied to an element,
// This is used by reset() to set the state of the toolbar to indicate the class of
// the current element.
function getStyle() {
var style = document.queryCommandValue('FormatBlock');
if (style == "Normal") {
doc.focus();
var rng = document.selection.createRange();
if (typeof(rng.parentElement) != "undefined") {
var el = rng.parentElement();
var tag = el.nodeName.toUpperCase();
var str = el.className.toLowerCase();
if (!(tag == "DIV" && el.id == "doc" && str == "textedit")) {
if (tag == "SPAN") {
style = "." + str;
} else if (str == "") {
style = tag;
} else {
style = tag + "." + str;
}
}
return style;
}
}
return style;
}
// getfontface(): called to obtain the face attribute applied to a font tag,
// This is used by reset() to set the state of the toolbar to indicate the class of
// the current element.
function getfontface()
{
var family = document.selection.createRange(); //create text range
// don't get font face for image or table
if (document.selection.type == 'Control') {
return;
}
var el = family.parentElement(); //get parent element
var tag = el.nodeName.toUpperCase(); //convert tag element to upper case
if (typeof(el.parentElement) != "undefined" && tag == "FONT") { //only do function if tag is font - this is for greater execution speed
var elface = el.getAttribute('FACE'); //get the font tags FACE attribute
return elface; //return the value of the face attribute to the reset() function
}
}
// markSelectedElement(): called by onClick and onKeyup events
// on the contectEditable area
function markSelectedElement() {
RichEditor.selectedImage = null;
var r = document.selection.createRange();
if (document.selection.type != 'Text') {
if (r.length == 1) {
if (r.item(0).tagName == "IMG") {
RichEditor.selectedImage = r.item(0);
}
}
}
}
// reset(): called from all over the place to make the toolbar
// represent the current text. If el specified, it was called from
// hover(off)
function reset(el)
{
if (!RichEditor.txtView) return; // Disabled in View Source mode
if (!el) color.style.display = 'none';
if (!el || el == ctlStyle) selValue(ctlStyle, getStyle());
if (!el || el == ctlFont) selValue(ctlFont, getfontface());
if (!el || el == ctlSize) selValue(ctlSize, document.queryCommandValue('FontSize'));
if (!el || el == btnBold) setState(btnBold, document.queryCommandValue('Bold'));
if (!el || el == btnItalic) setState(btnItalic, document.queryCommandValue('Italic'));
if (!el || el == btnUnderline) setState(btnUnderline, document.queryCommandValue('Underline'));
if (!el || el == btnStrikethrough) setState(btnStrikethrough, document.queryCommandValue('Strikethrough'));
if (!el || el == btnLeftJustify) setState(btnLeftJustify, document.queryCommandValue('JustifyLeft'));
if (!el || el == btnCenter) setState(btnCenter, document.queryCommandValue('JustifyCenter'));
if (!el || el == btnRightJustify) setState(btnRightJustify, document.queryCommandValue('JustifyRight'));
if (!el || el == btnFullJustify) setState(btnFullJustify, document.queryCommandValue('JustifyFull'));
if (!el || el == btnNumList) setState(btnNumList, document.queryCommandValue('InsertOrderedList'));
if (!el || el == btnBulList) setState(btnBulList, document.queryCommandValue('InsertUnorderedList'));
}
// hover(): Handles mouse hovering over toolbar buttons
function hover(on)
{
if (!RichEditor.txtView) return; // Disabled in View Source mode
var el = window.event.srcElement;
if (el && !el.disabled && el.nodeName == "IMG" && el.className != "spacer") {
if (on) {
el.className = "hover";
} else {
el.className = el.defaultState ? el.defaultState : null;
}
}
}
// hover(): Handles mouse clicks on toolbar buttons
function press(on)
{
if (!RichEditor.txtView) return; // Disabled in View Source mode
var el = window.event.srcElement;
if (el && !el.disabled && el.nodeName == "IMG" && el.className != "spacer") {
if (on) {
el.className = "down";
} else {
el.className = el.className == "down" ? "hover" : el.defaultState ? el.defaultState : null;
}
}
}
// addTag(): This is the handler for the style dropdown. This takes value
// selected and interprates it and makes the necessary changes to the HTML to
// apply this style.
function addTag(obj) {
if (!RichEditor.txtView) return; // Disabled in View Source mode
// Determine the type of element we are dealing with.
// TYPE 0 IS NORMAL-TAG, 1 IS CLASS, 2 IS SUBCLASS, 3 = Format Block command
var value = obj[obj.selectedIndex].value;
if (!value) { // Format Block
sel(obj);
return;
}
var type = 0; // TAG
if (value.indexOf(".") == 0) { // .className
type = 1;
} else if (value.indexOf(".") != -1) { // TAG.className
type = 2;
}
doc.focus();
// Pick up the highlighted text
var r = document.selection.createRange();
r.select();
var s = r.htmlText;
// If we have some selected text, then ignore silly selections
if (s == " " || s == " ") {
return;
}
// How we apply formatting is based upon the type of formitting being
// done.
switch(type)
{
case 1:
// class: Wrap the selected text with a span of the specified
// class name
value = value.substring(1,value.length);
r.pasteHTML("<span class="+value+">" + r.htmlText + "</span>")
break;
case 2:
// subclass: split the value into tag + class
value = value.split(".");
r.pasteHTML('<' + value[0] + ' class="' + value[1] +'">'
+ r.htmlText
+ '</' + value[0] + '>'
);
break;
default:
// TAG: wrap up the highlighted text with the specified tag
r.pasteHTML("<"+value+">"+r.htmlText+"</"+value+">")
break;
}
}
// initStyleDropdown(): This takes the passed styleList and generates the style
// dropdown list box from it.
function initStyleDropdown(styleList) {
// Build the option list for the styles dropdown from the passed styles
for (var i = 0; i < styleList.length; i++) {
var oOption = document.createElement("OPTION");
if (styleList[i][0]) oOption.value = styleList[i][0];
oOption.text = styleList[i][1];
oOption.style.backgroundColor = 'white';
document.all.ctlStyle.add(oOption);
}
}
// applyOptions(): This takes the passed options string and actions them.
// Called during the init process.
function applyOptions(str)
{
var options = str.split(";");
for (var i = 0; i < options.length; i++) {
var eq = options[i].indexOf('=');
var on = eq == -1 ? true : "yes;true;1".indexOf(options[i].substr(eq+1).toLowerCase()) != -1;
var name = eq == -1 ? options[i] : options[i].substr(0,eq);
var el = document.all("feature" + name);
if (el) {
el.runtimeStyle.display = (on ? 'inline' : 'none');
} else {
if (!RichEditor.aOptions) RichEditor.aOptions = new Array;
RichEditor.aOptions[name] = on;
}
}
}
// getOption(): Get the value for a previously set option or return undefined if
// the option is not set.
function getOption(name)
{
if (RichEditor.aOptions) return RichEditor.aOptions[name];
return; // Undefined
}
// Handle drag and drop events into the editor window. Until we
// work out how to handle these better (which requires co-operation
// from the code being dragged from as far as I can tell) we simply
// disable the functionality.
function handleDrag(n)
{
// if drag and drop is disabled, then cancel the dragdrop
// events
if (!getOption("dragdrop"))
{
switch(n) {
case 0: // ondragenter
window.event.dataTransfer.dropEffect = "none";
break;
}
// Cancel the event
window.event.returnValue = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -