📄 ftb-freetextbox.js
字号:
if (this.designEditor.document.queryCommandState('justifyright') == false &&
this.designEditor.document.queryCommandState('justifycenter') == false &&
this.designEditor.document.queryCommandState('justifyfull') == false ) {
return FTB_BUTTON_ON;
} else {
return FTB_BUTTON_OFF;
}
} else {
return FTB_BUTTON_OFF;
}
}
} catch(exp) {
return FTB_BUTTON_OFF;
}
};
FTB_FreeTextBox.prototype.QueryCommandValue = function(commandName) {
if (this.mode != FTB_MODE_DESIGN) return false;
try {
value = this.designEditor.document.queryCommandValue(commandName);
} catch (err) {
this.RefreshDesignMode();
this.UpdateToolbars();
}
value = this.designEditor.document.queryCommandValue(commandName);
switch (commandName) {
case "backcolor":
if (FTB_Browser.isIE) {
value = FTB_IntToHexColor(value);
} else {
if (value == "") value = "#FFFFFF";
}
break;
case "forecolor":
if (FTB_Browser.isIE) {
value = FTB_IntToHexColor(value);
} else {
if (value == "") value = "#000000";
}
break;
case "formatBlock":
if (!FTB_Browser.isIE) {
if (value == "" || value == "<x>")
value = "<p>";
else
value = "<" + value + ">";
}
break;
}
if (value == '' || value == null) {
if (commandName == 'fontsize') return '3';
if (commandName == 'fontname') return 'Times New Roman';
if (commandName == 'forecolor') return '#000000';
if (commandName == 'backcolor') return '#ffffff';
}
return value;
};
FTB_FreeTextBox.prototype.SurroundHtml = function(start,end) {
if (this.mode == FTB_MODE_HTML) return;
this.designEditor.focus();
if (FTB_Browser.isIE) {
var sel = this.designEditor.document.selection.createRange();
html = start + sel.htmlText + end;
sel.pasteHTML(html);
} else {
selection = this.designEditor.window.getSelection();
if (selection) {
range = selection.getRangeAt(0);
} else {
range = this.designEditor.document.createRange();
}
this.InsertHtml(start + selection + end);
//this.InsertHtml(start + selection.toString().replace(/</g,"<").replace(/</g,"<").replace(/\n/g,"<br>\n") + end);
}
};
FTB_FreeTextBox.prototype.InsertHtml = function(html) {
if (this.mode != FTB_MODE_DESIGN) return;
this.designEditor.focus();
if (FTB_Browser.isIE) {
sel = this.designEditor.document.selection.createRange();
sel.pasteHTML(html);
} else {
selection = this.designEditor.window.getSelection();
if (selection) {
range = selection.getRangeAt(0);
} else {
range = editor.document.createRange();
}
var fragment = this.designEditor.document.createDocumentFragment();
var div = this.designEditor.document.createElement("div");
div.innerHTML = html;
while (div.firstChild) {
fragment.appendChild(div.firstChild);
}
selection.removeAllRanges();
range.deleteContents();
var node = range.startContainer;
var pos = range.startOffset;
switch (node.nodeType) {
case 3:
if (fragment.nodeType == 3) {
node.insertData(pos, fragment.data);
range.setEnd(node, pos + fragment.length);
range.setStart(node, pos + fragment.length);
} else {
node = node.splitText(pos);
node.parentNode.insertBefore(fragment, node);
range.setEnd(node, pos + fragment.length);
range.setStart(node, pos + fragment.length);
}
break;
case 1:
node = node.childNodes[pos];
node.parentNode.insertBefore(fragment, node);
range.setEnd(node, pos + fragment.length);
range.setStart(node, pos + fragment.length);
break;
}
selection.addRange(range);
}
};
/* ------------------------------------------------
START: Node and Selection Methods */
FTB_FreeTextBox.prototype.CheckTag = function(item,tagName) {
if (!item) return null;
if (item.tagName.search(tagName)!=-1) {
return item;
}
if (item.tagName=='BODY') {
return false;
}
item=item.parentElement;
return this.CheckTag(item,tagName);
};
FTB_FreeTextBox.prototype.GetParentElement = function() {
var sel = this.GetSelection();
var range = this.CreateRange(sel);
if (FTB_Browser.isIE) {
switch (sel.type) {
case "Text":
case "None":
return range.parentElement();
case "Control":
return range.item(0);
default:
return this.designEditor.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;
}
};
FTB_FreeTextBox.prototype.InsertNodeAtSelection = function(toBeInserted) {
if (!FTB_Browser.isIE) {
var sel = this.GetSelection();
var range = this.CreateRange(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);
this.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]);
this.SelectNodeContents(selnode);
break;
}
}
};
FTB_FreeTextBox.prototype.SelectNodeContents = function(node, pos) {
var range;
var collapsed = (typeof pos != "undefined");
if (isIE) {
range = this.designEditor.document.body.createTextRange();
range.moveToElementText(node);
(collapsed) && range.collapse(pos);
range.select();
} else {
var sel = this.GetSelection();
range = this.designEditor.document.createRange();
range.selectNodeContents(node);
(collapsed) && range.collapse(pos);
sel.removeAllRanges();
sel.addRange(range);
}
};
FTB_FreeTextBox.prototype.SelectNextNode = function(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;
}
this.SelectNodeContents(node);
};
FTB_FreeTextBox.prototype.GetSelection = function() {
if (FTB_Browser.isIE) {
return this.designEditor.document.selection;
} else {
return this.designEditor.getSelection();
}
};
FTB_FreeTextBox.prototype.CreateRange = function(sel) {
if (FTB_Browser.isIE) {
return sel.createRange();
} else {
if (typeof sel != "undefined") {
try {
return sel.getRangeAt(0);
} catch(e) {
return this.designEditor.document.createRange();
}
} else {
return this.designEditor.document.createRange();
}
}
};
FTB_FreeTextBox.prototype.SelectNodeContents = function(node, pos) {
var range;
var collapsed = (typeof pos != "undefined");
if (FTB_Browser.isIE) {
range = this.designEditor.document.body.createTextRange();
range.moveToElementText(node);
(collapsed) && range.collapse(pos);
range.select();
} else {
var sel = this.GetSelection();
range = this.designEditor.document.createRange();
range.selectNodeContents(node);
(collapsed) && range.collapse(pos);
sel.removeAllRanges();
sel.addRange(range);
}
};
FTB_FreeTextBox.prototype.GetNearest = function(tagName) {
var ancestors = this.GetAllAncestors();
var ret = null;
tagName = ("" + tagName).toLowerCase();
for (var i=0;i<ancestors.length;i++) {
var el = ancestors[i];
if (el) {
if (el.tagName.toLowerCase() == tagName) {
ret = el;
break;
}
}
}
return ret;
};
FTB_FreeTextBox.prototype.GetAllAncestors = function() {
var p = this.GetParentElement();
var a = [];
while (p && (p.nodeType == 1) && (p.tagName.toLowerCase() != 'body')) {
a.push(p);
p = p.parentNode;
}
a.push(this.designEditor.document.body);
return a;
};
FTB_FreeTextBox.prototype.GetStyle = function() {
var parent = this.GetParentElement();
return parent.className;
};
FTB_FreeTextBox.prototype.SetActiveTab = function(theTD) {
if (theTD) {
parentTR = theTD.parentElement;
parentTR = document.getElementById(this.id + "_TabRow");
selectedTab = 1;
totalButtons = parentTR.cells.length-1;
for (var i=1;i< totalButtons;i++) {
parentTR.cells[i].className = this.id + "_TabOffRight";
if (theTD == parentTR.cells[i]) { selectedTab = i; }
}
if (selectedTab==1) {
parentTR.cells[0].className = this.id + "_StartTabOn";
} else {
parentTR.cells[0].className = this.id + "_StartTabOff";
parentTR.cells[selectedTab-1].className = this.id + "_TabOffLeft";
}
theTD.className = this.id + "_TabOn";
}
};
FTB_FreeTextBox.prototype.Focus = function() {
if (this.mode == FTB_MODE_DESIGN) {
this.designEditor.focus();
this.UpdateToolbars();
} else if (this.mode == FTB_MODE_HTML) {
this.htmlEditor.focus();
}
this.hasFocus = true;
};
FTB_FreeTextBox.prototype.SetStyle = function(className) {
// retrieve parent element of the selection
var parent = this.GetParentElement();
var surround = true;
var isSpan = (parent && parent.tagName.toLowerCase() == "span");
/*
// remove class stuff??
if (isSpan && index == 0 && !/\S/.test(parent.style.cssText)) {
while (parent.firstChild) {
parent.parentNode.insertBefore(parent.firstChild, parent);
}
parent.parentNode.removeChild(parent);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -