htmlarea.js
来自「是个不错的文件代码,希望大家好好用,」· JavaScript 代码 · 共 1,974 行 · 第 1/5 页
JS
1,974 行
{
this.setLoadingMessage('Init editor size');
var editor = this;
var width = null;
var height = null;
switch ( this.config.width )
{
case 'auto':
width = this._initial_ta_size.w;
break;
case 'toolbar':
width = this._toolBar.offsetWidth + 'px';
break;
default :
// @todo: check if this is better :
// width = (parseInt(this.config.width, 10) == this.config.width)? this.config.width + 'px' : this.config.width;
width = /[^0-9]/.test(this.config.width) ? this.config.width : this.config.width + 'px';
break;
}
switch ( this.config.height )
{
case 'auto':
height = this._initial_ta_size.h;
break;
default :
// @todo: check if this is better :
// height = (parseInt(this.config.height, 10) == this.config.height)? this.config.height + 'px' : this.config.height;
height = /[^0-9]/.test(this.config.height) ? this.config.height : this.config.height + 'px';
break;
}
this.sizeEditor(width, height, this.config.sizeIncludesBars, this.config.sizeIncludesPanels);
// why can't we use the following line instead ?
// HTMLArea.addDom0Event(window, 'resize', this.sizeEditor);
HTMLArea.addDom0Event(window, 'resize', function(e) { editor.sizeEditor(); });
// why can't we use the following line instead ?
// this.notifyOn('panel_change',this.sizeEditor);
this.notifyOn('panel_change',function() { editor.sizeEditor(); });
};
/**
* Size the editor to a specific size, or just refresh the size (when window resizes for example)
* @param width optional width (CSS specification)
* @param height optional height (CSS specification)
* @param includingBars optional boolean to indicate if the size should include or exclude tool & status bars
*/
HTMLArea.prototype.sizeEditor = function(width, height, includingBars, includingPanels)
{
// We need to set the iframe & textarea to 100% height so that the htmlarea
// isn't "pushed out" when we get it's height, so we can change them later.
this._iframe.style.height = '100%';
this._textArea.style.height = '100%';
this._iframe.style.width = '';
this._textArea.style.width = '';
if ( includingBars !== null )
{
this._htmlArea.sizeIncludesToolbars = includingBars;
}
if ( includingPanels !== null )
{
this._htmlArea.sizeIncludesPanels = includingPanels;
}
if ( width )
{
this._htmlArea.style.width = width;
if ( !this._htmlArea.sizeIncludesPanels )
{
// Need to add some for l & r panels
var rPanel = this._panels.right;
if ( rPanel.on && rPanel.panels.length && HTMLArea.hasDisplayedChildren(rPanel.div) )
{
this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.right, 10);
}
var lPanel = this._panels.left;
if ( lPanel.on && lPanel.panels.length && HTMLArea.hasDisplayedChildren(lPanel.div) )
{
this._htmlArea.style.width = this._htmlArea.offsetWidth + parseInt(this.config.panel_dimensions.left, 10);
}
}
}
if ( height )
{
this._htmlArea.style.height = height;
if ( !this._htmlArea.sizeIncludesToolbars )
{
// Need to add some for toolbars
this._htmlArea.style.height = (this._htmlArea.offsetHeight + this._toolbar.offsetHeight + this._statusBar.offsetHeight) + 'px';
}
if ( !this._htmlArea.sizeIncludesPanels )
{
// Need to add some for t & b panels
var tPanel = this._panels.top;
if ( tPanel.on && tPanel.panels.length && HTMLArea.hasDisplayedChildren(tPanel.div) )
{
this._htmlArea.style.height = (this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.top, 10)) + 'px';
}
var bPanel = this._panels.bottom;
if ( bPanel.on && bPanel.panels.length && HTMLArea.hasDisplayedChildren(bPanel.div) )
{
this._htmlArea.style.height = (this._htmlArea.offsetHeight + parseInt(this.config.panel_dimensions.bottom, 10)) + 'px';
}
}
}
// At this point we have this._htmlArea.style.width & this._htmlArea.style.height
// which are the size for the OUTER editor area, including toolbars and panels
// now we size the INNER area and position stuff in the right places.
width = this._htmlArea.offsetWidth;
height = this._htmlArea.offsetHeight;
// Set colspan for toolbar, and statusbar, rowspan for left & right panels, and insert panels to be displayed
// into thier rows
var panels = this._panels;
var editor = this;
var col_span = 1;
function panel_is_alive(pan)
{
if ( panels[pan].on && panels[pan].panels.length && HTMLArea.hasDisplayedChildren(panels[pan].container) )
{
panels[pan].container.style.display = '';
return true;
}
// Otherwise make sure it's been removed from the framework
else
{
panels[pan].container.style.display='none';
return false;
}
}
if ( panel_is_alive('left') )
{
col_span += 1;
}
// if ( panel_is_alive('top') )
// {
// NOP
// }
if ( panel_is_alive('right') )
{
col_span += 1;
}
// if ( panel_is_alive('bottom') )
// {
// NOP
// }
this._framework.tb_cell.colSpan = col_span;
this._framework.tp_cell.colSpan = col_span;
this._framework.bp_cell.colSpan = col_span;
this._framework.sb_cell.colSpan = col_span;
// Put in the panel rows, top panel goes above editor row
if ( !this._framework.tp_row.childNodes.length )
{
HTMLArea.removeFromParent(this._framework.tp_row);
}
else
{
if ( !HTMLArea.hasParentNode(this._framework.tp_row) )
{
this._framework.tbody.insertBefore(this._framework.tp_row, this._framework.ler_row);
}
}
// bp goes after the editor
if ( !this._framework.bp_row.childNodes.length )
{
HTMLArea.removeFromParent(this._framework.bp_row);
}
else
{
if ( !HTMLArea.hasParentNode(this._framework.bp_row) )
{
this._framework.tbody.insertBefore(this._framework.bp_row, this._framework.ler_row.nextSibling);
}
}
// finally if the statusbar is on, insert it
if ( !this.config.statusBar )
{
HTMLArea.removeFromParent(this._framework.sb_row);
}
else
{
if ( !HTMLArea.hasParentNode(this._framework.sb_row) )
{
this._framework.table.appendChild(this._framework.sb_row);
}
}
// Size and set colspans, link up the framework
this._framework.lp_cell.style.width = this.config.panel_dimensions.left;
this._framework.rp_cell.style.width = this.config.panel_dimensions.right;
this._framework.tp_cell.style.height = this.config.panel_dimensions.top;
this._framework.bp_cell.style.height = this.config.panel_dimensions.bottom;
this._framework.tb_cell.style.height = this._toolBar.offsetHeight + 'px';
this._framework.sb_cell.style.height = this._statusBar.offsetHeight + 'px';
var edcellheight = height - this._toolBar.offsetHeight - this._statusBar.offsetHeight;
if ( panel_is_alive('top') )
{
edcellheight -= parseInt(this.config.panel_dimensions.top, 10);
}
if ( panel_is_alive('bottom') )
{
edcellheight -= parseInt(this.config.panel_dimensions.bottom, 10);
}
this._iframe.style.height = edcellheight + 'px';
this._framework.rp_cell.style.height = edcellheight + 'px';
this._framework.lp_cell.style.height = edcellheight + 'px';
// (re)size the left and right panels so they are equal the editor height
for(var i = 0; i < this._panels.left.panels.length; i++)
{
this._panels.left.panels[i].style.height = this._iframe.style.height;
}
for(var i = 0; i < this._panels.right.panels.length; i++)
{
this._panels.right.panels[i].style.height = this._iframe.style.height;
}
var edcellwidth = width;
if ( panel_is_alive('left') )
{
edcellwidth -= parseInt(this.config.panel_dimensions.left, 10);
}
if ( panel_is_alive('right') )
{
edcellwidth -= parseInt(this.config.panel_dimensions.right, 10);
}
this._iframe.style.width = edcellwidth + 'px';
this._textArea.style.height = this._iframe.style.height;
this._textArea.style.width = this._iframe.style.width;
this.notifyOf('resize', {width:this._htmlArea.offsetWidth, height:this._htmlArea.offsetHeight});
};
HTMLArea.prototype.addPanel = function(side)
{
var div = document.createElement('div');
div.side = side;
if ( side == 'left' || side == 'right' )
{
div.style.width = this.config.panel_dimensions[side];
if(this._iframe) div.style.height = this._iframe.style.height;
}
HTMLArea.addClasses(div, 'panel');
this._panels[side].panels.push(div);
this._panels[side].div.appendChild(div);
this.notifyOf('panel_change', {'action':'add','panel':div});
return div;
};
HTMLArea.prototype.removePanel = function(panel)
{
this._panels[panel.side].div.removeChild(panel);
var clean = [];
for ( var i = 0; i < this._panels[panel.side].panels.length; i++ )
{
if ( this._panels[panel.side].panels[i] != panel )
{
clean.push(this._panels[panel.side].panels[i]);
}
}
this._panels[panel.side].panels = clean;
this.notifyOf('panel_change', {'action':'remove','panel':panel});
};
HTMLArea.prototype.hidePanel = function(panel)
{
if ( panel && panel.style.display != 'none' )
{
panel.style.display = 'none';
this.notifyOf('panel_change', {'action':'hide','panel':panel});
}
};
HTMLArea.prototype.showPanel = function(panel)
{
if ( panel && panel.style.display == 'none' )
{
panel.style.display = '';
this.notifyOf('panel_change', {'action':'show','panel':panel});
}
};
HTMLArea.prototype.hidePanels = function(sides)
{
if ( typeof sides == 'undefined' )
{
sides = ['left','right','top','bottom'];
}
var reShow = [];
for ( var i = 0; i < sides.length;i++ )
{
if ( this._panels[sides[i]].on )
{
reShow.push(sides[i]);
this._panels[sides[i]].on = false;
}
}
this.notifyOf('panel_change', {'action':'multi_hide','sides':sides});
};
HTMLArea.prototype.showPanels = function(sides)
{
if ( typeof sides == 'undefined' )
{
sides = ['left','right','top','bottom'];
}
var reHide = [];
for ( var i = 0; i < sides.length; i++ )
{
if ( !this._panels[sides[i]].on )
{
reHide.push(sides[i]);
this._panels[sides[i]].on = true;
}
}
this.notifyOf('panel_change', {'action':'multi_show','sides':sides});
};
HTMLArea.objectProperties = function(obj)
{
var props = [];
for ( var x in obj )
{
props[props.length] = x;
}
return props;
};
/*
* EDITOR ACTIVATION NOTES:
* when a page has multiple Xinha editors, ONLY ONE should be activated at any time (this is mostly to
* work around a bug in Mozilla, but also makes some sense). No editor should be activated or focused
* automatically until at least one editor has been activated through user action (by mouse-clicking in
* the editor).
*/
HTMLArea.prototype.editorIsActivated = function()
{
try
{
return HTMLArea.is_gecko? this._doc.designMode == 'on' : this._doc.body.contentEditable;
}
catch (ex)
{
return false;
}
};
HTMLArea._someEditorHasBeenActivated = false;
HTMLArea._currentlyActiveEditor = false;
HTMLArea.prototype.activateEditor = function()
{
// We only want ONE editor at a time to be active
if ( HTMLArea._currentlyActiveEditor )
{
if ( HTMLArea._currentlyActiveEditor == this )
{
return true;
}
HTMLArea._currentlyActiveEditor.deactivateEditor();
}
if ( HTMLArea.is_gecko && this._doc.designMode != 'on' )
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?