📄 freetextbox-mainscript.js
字号:
document.body.style.cursor='default';
}
function FTB_TabOut() {
document.body.style.cursor='auto';
}
/** END:TABS ********************/
function FTB_Event(ftbName) {
editor = FTB_GetIFrame(ftbName);
htmlMode = FTB_IsHtmlMode(ftbName);
var _TAB = 9;
var _ENTER = 13;
var _QUOTE = 222;
var _OPENCURLY = '“';
var _CLOSECURLY = '”';
if (isIE) {
// TAB Functions
if (editor.event.keyCode == _TAB) {
var tabMode = FTB_TabMode(ftbName);
if (tabMode == "Disabled") {
editor.event.cancelBubble = true;
editor.event.returnValue = false;
}
if (tabMode == "InsertSpaces") {
FTB_InsertText(ftbName," ");
editor.event.cancelBubble = true;
editor.event.returnValue = false;
}
if (tabMode == "NextControl") {
// do nothing for TabMode.NextControl
}
}
// IE defaults to <p>, Mozilla to <br>
if (editor.event.keyCode == _ENTER) {
var breakMode = FTB_BreakMode(ftbName);
if (breakMode == "LineBreak" || editor.event.ctrlKey || htmlMode) {
var sel = editor.document.selection;
if (sel.type == 'Control') {
return;
}
var r = sel.createRange();
if ((!FTB_CheckTag(r.parentElement(),'LI'))&&(!FTB_CheckTag(r.parentElement(),'H'))) {
r.pasteHTML('<br>');
editor.event.cancelBubble = true;
editor.event.returnValue = false;
r.select();
r.collapse(false);
return false;
}
}
}
}
// update ToolbarItems only every 50 milliseconds b/c it is expensive
if (!htmlMode && FTB_UpdateToolbar(ftbName)) {
if (editor.timerToolbar) {
clearTimeout(editor.timerToolbar);
}
editor.timerToolbar = setTimeout(function() {
FTB_SetToolbarItems(ftbName);
editor.timerToolbar = null;
}, 50);
}
}
function FTB_SetToolbarItems(ftbName) {
editor = FTB_GetIFrame(ftbName);
htmlMode = FTB_IsHtmlMode(ftbName);
toolbarArray = FTB_GetToolbarArray(ftbName);
//document.getElementById("Debug").value = "";
if (toolbarArray) {
for (var i=0; i<toolbarArray.length; i++) {
toolbarItemID = toolbarArray[i][0];
toolbarItem = document.getElementById(toolbarItemID);
commandIdentifier = toolbarArray[i][1];
state = "";
try {
if (toolbarItemID.indexOf("Button") > -1) {
state = editor.document.queryCommandState(commandIdentifier);
FTB_SetButtonState(toolbarItemID,ftbName,state);
} else {
state = editor.document.queryCommandValue(commandIdentifier);
switch (commandIdentifier) {
case "backcolor":
if (isIE) {
state = FTB_GetHexColor(state);
} else {
if (state == "") state = "#FFFFFF";
}
break;
case "forecolor":
if (isIE) {
state = FTB_GetHexColor(state);
} else {
if (state == "") state = "#000000";
}
break;
case "formatBlock":
//document.getElementById("Debug").value += "****: " + state + "\n";
if (!isIE) {
if (state == "p" || state == "" || state == "<x>")
state = "<body>";
else
state = "<" + state + ">";
}
break;
}
//document.getElementById("Debug").value += commandIdentifier + ": " + state + "\n";
FTB_SetDropDownListState(toolbarItemID,state);
}
} catch(e) {
}
}
}
}
function FTB_GetHexColor(intColor) {
intColor = intColor.toString(16).toUpperCase();
while (intColor.length < 6) {
intColor = "0" + intColor;
}
return "#" + intColor.substring(4,6) + intColor.substring(2,4) + intColor.substring(0,2);
}
function FTB_SetDropDownListState(ddlName,value) {
ddl = document.getElementById(ddlName);
if (ddl) {
for (var i=0; i<ddl.options.length; i++) {
if (ddl.options[i].text == value || ddl.options[i].value == value) {
ddl.options.selectedIndex = i;
return;
}
}
}
}
function FTB_SetButtonState(buttonName,ftbName,value) {
buttonTD = document.getElementById(buttonName);
if (buttonTD) {
if (value) {
if (FTB_ButtonRenderMode(ftbName) == 'Css')
buttonTD.className = FTB_GetCssID(ftbName) + "_ButtonActive";
else
FTB_ButtonOver(buttonTD,ftbName,0,0);
} else {
if (FTB_ButtonRenderMode(ftbName) == 'Css')
buttonTD.className = FTB_GetCssID(ftbName) + "_ButtonNormal";
else
FTB_ButtonOut(buttonTD,ftbName,0,0);
}
}
}
// *******************************
function FTB_GetParentElement(ftbName) {
editor = FTB_GetIFrame(ftbName);
var sel = FTB_GetSelection(ftbName);
var range = FTB_CreateRange(ftbName,sel);
if (isIE) {
switch (sel.type) {
case "Text":
case "None":
// It seems that even for selection of type "None",
// there _is_ a parent element and it's value is not
// only correct, but very important to us. MSIE is
// certainly the buggiest browser in the world and I
// wonder, God, how can Earth stand it?
return range.parentElement();
case "Control":
return range.item(0);
default:
return editor.document.body;
}
} else try {
var p = range.commonAncestorContainer;
if (!range.collapsed && range.startContainer == range.endContainer &&
range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes())
p = range.startContainer.childNodes[range.startOffset];
/*
alert(range.startContainer + ":" + range.startOffset + "\n" +
range.endContainer + ":" + range.endOffset);
*/
while (p.nodeType == 3) {
p = p.parentNode;
}
return p;
} catch (e) {
return null;
}
}
function FTB_InsertNodeAtSelection(ftbName,toBeInserted) {
if (!isIE) {
var editor = FTB_GetIFrame(ftbName);
var sel = FTB_GetSelection(ftbName);
var range = FTB_CreateRange(ftbName,sel);
// remove the current selection
sel.removeAllRanges();
range.deleteContents();
var node = range.startContainer;
var pos = range.startOffset;
switch (node.nodeType) {
case 3: // Node.TEXT_NODE
// we have to split it at the caret position.
if (toBeInserted.nodeType == 3) {
// do optimized insertion
node.insertData(pos, toBeInserted.data);
range = this._createRange();
range.setEnd(node, pos + toBeInserted.length);
range.setStart(node, pos + toBeInserted.length);
sel.addRange(range);
} else {
node = node.splitText(pos);
var selnode = toBeInserted;
if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
selnode = selnode.firstChild;
}
node.parentNode.insertBefore(toBeInserted, node);
editor.selectNodeContents(selnode);
}
break;
case 1: // Node.ELEMENT_NODE
var selnode = toBeInserted;
if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
selnode = selnode.firstChild;
}
node.insertBefore(toBeInserted, node.childNodes[pos]);
FTB_SelectNodeContents(editor,selnode);
break;
}
}
}
// Selects the contents inside the given node
function FTB_SelectNodeContents(ftbName, node, pos) {
editor = FTB_GetIFrame(ftbName);
var range;
var collapsed = (typeof pos != "undefined");
if (isIE) {
range = editor.document.body.createTextRange();
range.moveToElementText(node);
(collapsed) && range.collapse(pos);
range.select();
} else {
var sel = FTB_GetSelection(ftbName);
range = editor.document.createRange();
range.selectNodeContents(node);
(collapsed) && range.collapse(pos);
sel.removeAllRanges();
sel.addRange(range);
}
};
// returns the current selection object
function FTB_GetSelection(ftbName) {
editor = FTB_GetIFrame(ftbName);
if (isIE) {
return editor.document.selection;
} else {
return editor.getSelection();
}
}
// returns a range for the current selection
function FTB_CreateRange(ftbName,sel) {
editor = FTB_GetIFrame(ftbName);
if (isIE) {
return sel.createRange();
} else {
//TODO: this.focusEditor();
if (typeof sel != "undefined") {
try {
return sel.getRangeAt(0);
} catch(e) {
return editor.document.createRange();
}
} else {
return editor.document.createRange();
}
}
}
/* TABLE FUNCTIONS
MODIFIED FROM HtmlArea (thanks guys!)
**********************************************/
// helper function that clears the content in a table row
function FTB_ClearRow(tr) {
var tds = tr.getElementsByTagName("td");
for (var i = tds.length; --i >= 0;) {
var td = tds[i];
td.rowSpan = 1;
td.innerHTML = (isIE) ? "" : "<br />";
}
}
function FTB_SplitRow(td) {
var n = parseInt("" + td.rowSpan);
var nc = parseInt("" + td.colSpan);
td.rowSpan = 1;
tr = td.parentNode;
var itr = tr.rowIndex;
var trs = tr.parentNode.rows;
var index = td.cellIndex;
while (--n > 0) {
tr = trs[++itr];
var otd = editor._doc.createElement("td");
otd.colSpan = td.colSpan;
otd.innerHTML = mozbr;
tr.insertBefore(otd, tr.cells[index]);
}
//editor.forceRedraw();
//editor.updateToolbar();
}
function FTB_SplitCol(td) {
var nc = parseInt("" + td.colSpan);
td.colSpan = 1;
tr = td.parentNode;
var ref = td.nextSibling;
while (--nc > 0) {
var otd = editor._doc.createElement("td");
otd.rowSpan = td.rowSpan;
otd.innerHTML = mozbr;
tr.insertBefore(otd, ref);
}
//editor.forceRedraw();
//editor.updateToolbar();
}
function FTB_SplitCell(td) {
var nc = parseInt("" + td.colSpan);
splitCol(td);
var items = td.parentNode.cells;
var index = td.cellIndex;
while (nc-- > 0) {
FTB_SplitRow(items[index++]);
}
}
function FTB_SelectNextNode(el) {
var node = el.nextSibling;
while (node && node.nodeType != 1) {
node = node.nextSibling;
}
if (!node) {
node = el.previousSibling;
while (node && node.nodeType != 1) {
node = node.previousSibling;
}
}
if (!node) {
node = el.parentNode;
}
//editor.selectNodeContents(node);
}
function FTB_GetClosest(ftbName,tagName) {
var editor = FTB_GetIFrame(ftbName);
var ancestors = FTB_GetAllAncestors(ftbName);
var ret = null;
tagName = ("" + tagName).toLowerCase();
for (var i in ancestors) {
var el = ancestors[i];
if (el.tagName.toLowerCase() == tagName) {
ret = el;
break;
}
}
return ret;
}
function FTB_GetAllAncestors(ftbName) {
editor = FTB_GetIFrame(ftbName);
var p = FTB_GetParentElement(ftbName);
var a = [];
while (p && (p.nodeType == 1) && (p.tagName.toLowerCase() != 'body')) {
a.push(p);
p = p.parentNode;
}
a.push(editor.document.body);
return a;
}
function FTB_InsertColumn(ftbName,after) {
editor = FTB_GetIFrame(ftbName);
var td = FTB_GetClosest(ftbName,"td");
if (!td) {
return;
}
var rows = td.parentNode.parentNode.rows;
var index = td.cellIndex;
for (var i = rows.length; --i >= 0;) {
var tr = rows[i];
var otd = editor.document.createElement("td");
otd.innerHTML = (isIE) ? "" : "<br />";
//if last column and insert column after is select append child
if (index==tr.cells.length-1 && after) {
tr.appendChild(otd);
} else {
var ref = tr.cells[index + ((after) ? 1 : 0)]; // 0
tr.insertBefore(otd, ref);
}
}
}
function FTB_InsertTableRow(ftbName,after) {
if (FTB_IsHtmlMode(ftbName)) return;
var tr = FTB_GetClosest(ftbName,"tr");
if (!tr) {
return;
}
var otr = tr.cloneNode(true);
FTB_ClearRow(otr);
tr.parentNode.insertBefore(otr, ((after) ? tr.nextSibling : tr));
}
function FTB_CreateTable(ftbName,cols,rows,width,widthUnit,align,cellpadding,cellspacing,border) {
var editor = FTB_GetIFrame(ftbName);
var sel = FTB_GetSelection(ftbName);
var range = FTB_CreateRange(ftbName,sel);
var doc = editor.document;
// create the table element
var table = doc.createElement("table");
// assign the given arguments
table.style.width = width + widthUnit;
table.align = align;
table.border = border;
table.cellspacing = cellspacing;
table.cellpadding = cellpadding;
var tbody = doc.createElement("tbody");
table.appendChild(tbody);
for (var i = 0; i < rows; ++i) {
var tr = doc.createElement("tr");
tbody.appendChild(tr);
for (var j = 0; j < cols; ++j) {
var td = doc.createElement("td");
tr.appendChild(td);
// Mozilla likes to see something inside the cell.
if (!isIE) td.appendChild(doc.createElement("br"));
}
}
if (isIE) {
range.pasteHTML(table.outerHTML);
} else {
FTB_InsertNodeAtSelection(ftbName,table);
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -