htmlarea.js
来自「是个不错的文件代码,希望大家好好用,」· JavaScript 代码 · 共 1,974 行 · 第 1/5 页
JS
1,974 行
{
toolbar[0].splice(0, 0, id[i]);
}
}
else
{
toolbar[0].splice(0, 0, id);
}
}
}
};
HTMLArea.Config.prototype.removeToolbarElement = HTMLArea.Config.prototype.hideSomeButtons;
/** Helper function: replace all TEXTAREA-s in the document with HTMLArea-s. */
HTMLArea.replaceAll = function(config)
{
var tas = document.getElementsByTagName("textarea");
// @todo: weird syntax, doesnt help to read the code, doesnt obfuscate it and doesnt make it quicker, better rewrite this part
for ( var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate() )
{
// NOP
}
};
/** Helper function: replaces the TEXTAREA with the given ID with HTMLArea. */
HTMLArea.replace = function(id, config)
{
var ta = HTMLArea.getElementById("textarea", id);
return ta ? (new HTMLArea(ta, config)).generate() : null;
};
// Creates the toolbar and appends it to the _htmlarea
HTMLArea.prototype._createToolbar = function ()
{
this.setLoadingMessage('Create Toolbar');
var editor = this; // to access this in nested functions
var toolbar = document.createElement("div");
// ._toolbar is for legacy, ._toolBar is better thanks.
this._toolBar = this._toolbar = toolbar;
toolbar.className = "toolbar";
toolbar.unselectable = "1";
HTMLArea.freeLater(this, '_toolBar');
HTMLArea.freeLater(this, '_toolbar');
var tb_row = null;
var tb_objects = {};
this._toolbarObjects = tb_objects;
this._createToolbar1(editor, toolbar, tb_objects);
this._htmlArea.appendChild(toolbar);
return toolbar;
};
// FIXME : function never used, can probably be removed from source
HTMLArea.prototype._setConfig = function(config)
{
this.config = config;
};
HTMLArea.prototype._addToolbar = function()
{
this._createToolbar1(this, this._toolbar, this._toolbarObjects);
};
/**
* Create a break element to add in the toolbar
*
* @return {Object} HTML element to add
* @private
*/
HTMLArea._createToolbarBreakingElement = function()
{
var brk = document.createElement('div');
brk.style.height = '1px';
brk.style.width = '1px';
brk.style.lineHeight = '1px';
brk.style.fontSize = '1px';
brk.style.clear = 'both';
return brk;
};
// separate from previous createToolBar to allow dynamic change of toolbar
HTMLArea.prototype._createToolbar1 = function (editor, toolbar, tb_objects)
{
var tb_row;
// This shouldn't be necessary, but IE seems to float outside of the container
// when we float toolbar sections, so we have to clear:both here as well
// as at the end (which we do have to do).
if ( editor.config.flowToolbars )
{
toolbar.appendChild(HTMLArea._createToolbarBreakingElement());
}
// creates a new line in the toolbar
function newLine(id)
{
if ( typeof tb_row != 'undefined' && tb_row.childNodes.length === 0)
{
return;
}
var table = document.createElement("table");
table.border = "0px";
table.cellSpacing = "0px";
table.cellPadding = "0px";
table.id=id;
if (id=="ob_t2") {
table.style.display="none";
}
if ( editor.config.flowToolbars )
{
if ( HTMLArea.is_ie )
{
table.style.styleFloat = "left";
}
else
{
table.style.cssFloat = "left";
}
}
toolbar.appendChild(table);
// TBODY is required for IE, otherwise you don't see anything
// in the TABLE.
var tb_body = document.createElement("tbody");
table.appendChild(tb_body);
tb_row = document.createElement("tr");
tb_body.appendChild(tb_row);
table.className = 'toolbarRow'; // meh, kinda.
} // END of function: newLine
// init first line
newLine('ob_t1');
// updates the state of a toolbar element. This function is member of
// a toolbar element object (unnamed objects created by createButton or
// createSelect functions below).
function setButtonStatus(id, newval)
{
var oldval = this[id];
var el = this.element;
if ( oldval != newval )
{
switch (id)
{
case "enabled":
if ( newval )
{
HTMLArea._removeClass(el, "buttonDisabled");
el.disabled = false;
}
else
{
HTMLArea._addClass(el, "buttonDisabled");
el.disabled = true;
}
break;
case "active":
if ( newval )
{
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;
var tooltip = "";
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;
if ( typeof dropdown.tooltip != "undefined" )
{
tooltip = dropdown.tooltip;
}
}
else
{
alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
}
break;
}
if ( options )
{
el = document.createElement("select");
el.title = tooltip;
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
};
HTMLArea.freeLater(obj);
tb_objects[txt] = obj;
for ( var i in options )
{
// prevent iterating over wrong type
if ( typeof(options[i]) != 'string' )
{
continue;
}
var op = document.createElement("option");
op.innerHTML = HTMLArea._lc(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, btn, obj = null;
switch (txt)
{
case "separator":
if ( editor.config.flowToolbars )
{
newLine('ob_t2');
}
el = document.createElement("div");
el.className = "separator";
break;
case "space":
el = document.createElement("div");
el.className = "space";
break;
case "linebreak":
newLine('ob_t2');
return false;
default:
btn = editor.config.btnList[txt];
}
if ( !el && btn )
{
el = document.createElement("a");
el.style.display = 'block';
el.href = 'javascript:void(0)';
el.style.textDecoration = 'none';
el.title = btn[0];
el.className = "button";
el.style.direction = "ltr";
// let's just pretend we have a button object, and
// assign all the needed information to it.
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?
};
HTMLArea.freeLater(obj);
tb_objects[txt] = obj;
// prevent drag&drop of the icon to content area
el.ondrag = function() { return false; };
// handlers to emulate nice flat toolbar buttons
HTMLArea._addEvent(
el,
"mouseout",
function(ev)
{
if ( obj.enabled )
{
//HTMLArea._removeClass(el, "buttonHover");
HTMLArea._removeClass(el, "buttonActive");
if ( obj.active )
{
HTMLArea._addClass(el, "buttonPressed");
}
}
}
);
HTMLArea._addEvent(
el,
"mousedown",
function(ev)
{
if ( obj.enabled )
{
HTMLArea._addClass(el, "buttonActive");
HTMLArea._removeClass(el, "buttonPressed");
HTMLArea._stopEvent(HTMLArea.is_ie ? window.event : ev);
}
}
);
// when clicked, do the following:
HTMLArea._addEvent(
el,
"click",
function(ev)
{
if ( obj.enabled )
{
HTMLArea._removeClass(el, "buttonActive");
//HTMLArea._removeClass(el, "buttonHover");
if ( HTMLArea.is_gecko )
{
editor.activateEditor();
}
obj.cmd(editor, obj.name, obj);
HTMLArea._stopEvent(HTMLArea.is_ie ? window.event : ev);
}
}
);
var i_contain = HTMLArea.makeBtnImg(btn[1]);
var img = i_contain.firstChild;
el.appendChild(i_contain);
obj.imgel = img;
obj.swapImage = function(newimg)
{
if ( typeof newimg != 'string' )
{
img.src = newimg[0];
img.style.position = 'relative';
img.style.top = newimg[2] ? ('-' + (18 * (newimg[2] + 1)) + 'px') : '-18px';
img.style.left = newimg[1] ? ('-' + (18 * (newimg[1] + 1)) + 'px') : '-18px';
}
else
{
obj.imgel.src = newimg;
img.style.top = '0px';
img.style.left = '0px';
}
};
}
else if( !el )
{
el = createSelect(txt);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?