ホームページ > ウェブフロントエンド > jsチュートリアル > jsオンラインhtml(リッチテキスト、WYSIWYG)エディターの基礎知識を学ぶ

jsオンラインhtml(リッチテキスト、WYSIWYG)エディターの基礎知識を学ぶ

WBOY
リリース: 2016-05-16 17:46:14
オリジナル
1351 人が閲覧しました

必要なのは WYSIWYG HTML エディタです。簡単に言うと、次のような基本的な手順が必要です。

1. エフェクトを表示しながら編集できる編集ボックスが必要です。 Textarea は機能しません。プレーン テキストの入力にのみ使用でき、メモ帳と同様に色や斜体などのテキスト スタイルを表示できません。
これを実現するには iframe を使用し、iframe の designMode 属性を編集できるように変更します。

コードをコピー コードは次のとおりです:


<script>myEditer.document.designMode = 'on';</script>

この iframe 領域に書き込みがあります。

2. スタイルを追加するテキストを選択します。通常、WORD を使用してテキストのスタイルを編集する場合、最初にテキストを入力してからスタイルを編集します。したがって、処理するテキストを選択する方法が必要です。 JS のselection.createRange() はテキストを選択してオブジェクトを返すことができます。オブジェクトの text プロパティにアクセスすることで、選択されたテキストを取得できます。
コードをコピー コードは次のとおりです:


🎜> myEditer.document.designMode = 'on';
function Bold(){
var sel = myEditer.document.selection.createRange();
alert(sel.text);



3. 選択したテキストのスタイルを変更します。 selection.createRange() はテキストを選択し、オブジェクトを返します。このオブジェクトには、選択したテキストのスタイルを変更するために使用できるメソッド execCommand() があります。


🎜> myEditer.document.designMode = 'on';
function Bold(){
var sel = myEditer.document.selection.createRange();
>sel .execCommand("Bold")
}




execCommand() の一般的な使用法
:
フォント - 宋朝、黒竜江省、楷書など
execCommand("fontname","",font)
フォント サイズ - フォント サイズ
execCommand("fontsize","",font size)強調execCommand("太字")
斜体
execCommand("斜体")
下線
execCommand("下線")
取り消し線
execCommand("StrikeThrough")
Left
execCommand ("JustifyLeft")
right
execCommand("JustifyRight")
center
execCommand("JustifyCenter")
cut
execCommand("Cut")
copy
execCommand("Copy")
Paste
execCommand("Paste")
操作のキャンセル -- IE5.0 以降は無限にキャンセルできます
execCommand("Undo")
繰り返し操作
execCommand("Redo")

ボタンを使用して上記の各使用法を実装すると、シンプルなビジュアル テキスト エディターが完成します。

Document.execCommand() の使用手順




コードをコピー
コードは次のとおりです:

位置を使用すると、絶対に配置されたオブジェクトをドラッグして移動できます。
AbsolutePosition は、要素の位置属性を「absolute」(絶対) に設定します。
BackColor は、現在選択されている領域の背景色を設定または取得します。
BlockDirLTR は現在サポートされていません。
BlockDirRTL は現在サポートされていません。
太字は、現在選択されている領域の太字表示を切り替えます。
BrowseMode は現在サポートされていません。
コピー 現在の選択内容をクリップボードにコピーします。
CreateBookmark は、現在の選択範囲または挿入ポイントのブックマーク アンカーを作成するか、ブックマーク アンカーの名前を取得します。
CreateLink 現在の選択範囲にハイパーリンクを挿入するか、ユーザーが現在の選択範囲に挿入するハイパーリンクの URL を指定できるダイアログ ボックスを表示します。
切り取り 現在の選択内容をクリップボードにコピーし、削除します。
削除 現在選択されている領域を削除します。
DirLTR は現在サポートされていません。
DirRTL は現在サポートされていません。
EditMode は現在サポートされていません。
FontName は、現在選択されている領域のフォントを設定または取得します。
FontSize は、現在選択されている領域のフォント サイズを設定または取得します。
ForeColor は、現在選択されている領域の前景色 (テキスト) の色を設定または取得します。
FormatBlock は、現在のブロックの書式設定タグを設定します。
インデントは、選択したテキストのインデントを増やします。
InlineDirLTR は現在サポートされていません。
InlineDirRTL は現在サポートされていません。
InsertButton は、現在の選択範囲をボタン コントロールでカバーします。
InsertFieldset は、現在選択されている領域をボックスで覆います。
Inserthorizo​​ntalRule は、現在の選択範囲を水平線で覆います。
InsertIFrame は、現在の選択範囲をインライン フレームでカバーします。
InsertImage 現在の選択範囲を画像で覆います。
InsertInputButton は、現在の選択範囲をボタン コントロールでカバーします。
InsertInputCheckbox は、現在選択されている領域をチェックボックス コントロールでカバーします。
InsertInputFileUpload は、現在の選択内容をファイル アップロード コントロールで上書きします。
InsertInputHidden は、現在選択されている領域をカバーする非表示のコントロールを挿入します。
InsertInputImage は、現在の選択範囲を画像コントロールでカバーします。
InsertInputPassword は、現在の選択内容をパスワード制御で上書きします。
InsertInputRadio は、現在選択されている領域をラジオ ボタン コントロールでカバーします。
InsertInputReset は、現在の選択をリセット コントロールで上書きします。
InsertInputSubmit は、現在の選択内容を送信コントロールで上書きします。
InsertInputText は、現在の選択範囲をテキスト コントロールでカバーします。
InsertMarquee は、現在選択されている領域を空の字幕でカバーします。
InsertOrderedList は、現在選択されている領域が番号付きリストであるか、通常のフォーマットされたブロックであるかを切り替えます。
InsertParagraph は、現在の選択範囲を改行で上書きします。
InsertSelectDropdown は、現在選択されている領域をドロップダウン ボックス コントロールでカバーします。
InsertSelectListbox は、現在選択されている領域をリスト ボックス コントロールでカバーします。
InsertTextArea は、現在選択されている領域を複数行のテキスト入力コントロールでカバーします。
InsertUnownedList は、現在選択されている領域が箇条書きリストであるか、通常の書式設定されたブロックであるかを切り替えます。
Italic は、現在の選択領域を斜体表示にするかどうかを切り替えます。
JustifyCenter 現在選択されている領域を書式設定ブロックの中央に配置します。
JustifyFull は現在サポートされていません。
JustifyLeft は、現在選択されている領域の書式設定ブロックを左に揃えます。
JustifyNone は現在サポートされていません。
JustifyRight 現在選択されている領域が位置する書式設定ブロックを右揃えにします。
LiveResize は、MSHTML エディターに、移動またはスケーリングの完了後にのみ更新するのではなく、スケーリングまたは移動中に要素の外観を継続的に更新するように強制します。
MultipleSelection を使用すると、ユーザーが Shift キーまたは Ctrl キーを押したままにしたときに、一度に複数のサイト選択可能要素を選択できます。
開きます。
アウトデントは、選択した領域が配置されている書式設定ブロックのインデントを減らします。
OverWrite は、テキスト状態の挿入と上書きを切り替えます。
貼り付けは、現在の選択範囲をクリップボードの内容で上書きします。
PlayImage は現在サポートされていません。
印刷は、印刷ダイアログ ボックスを開き、ユーザーが現在のページを印刷できるようにします。
やり直し。
更新は、現在のドキュメントを更新します。
RemoveFormat 現在の選択範囲から書式設定タグを削除します。
RemoveParaFormat は現在サポートされていません。
名前を付けて保存は、現在の Web ページをファイルとして保存します。
SelectAll はドキュメント全体を選択します。
SizeToControl は現在サポートされていません。
SizeToControlHeight は現在サポートされていません。
SizeToControlWidth は現在サポートされていません。
ストップストップ。
StopImage は現在サポートされていません。
ストライクスルーは現在サポートされていません。
添字は現在サポートされていません。
上付き文字は現在サポートされていません。
ブックマークを解除すると、現在の選択範囲からすべてのブックマークが削除されます。
下線は、現在選択されている領域の下線を表示するかどうかを切り替えます。
元に戻す 元に戻す。
リンクを解除すると、現在の選択範囲からすべてのハイパーリンクが削除されます。
選択を解除すると、現在選択されている領域の選択状態が解除されます。

シンプルなオープンソースエディタ
コードをコピーします コードは次のとおりです以下のように:





編集者





" div "");
this.ed.close();
これ。 ed.contentEditable = true;
this.ed.designMode = "on"; //設置区は可编辑
for (var i = 0, l = data.length; i var o = create("span", this.toolbar);
Attr(o, {
title: data[i].title,
active: false,
unselectable: "on"
});
o.className = "tag " data[i].Class;
addListener(o, "mouseover", Bind(this, this.Changebgcolor, o, data[i ].hover));
addListener(o, "mouseout", Bind(this, this.Changebgcolor, o, data[i].Class));
addListener(o, "click", Bind(this) , this[data[i].action], o, data[i].args));
}
//////////////////// ///// 生成ツール栏
addListener(this.iframe.contentWindow, "focus", Bind(this,
function() {
this.isfocus = true;
}));
addListener(this.iframe.contentWindow, "blur", Bind(this,
function() {
this.isfocus = false;
}));
addListener(this.ed, 'mousedown', Bind(this, this.Show));
addListener(this.ed, 'mouseup', Bind(this, this.Show));
/////////////////////////この 2 つのイベントは来判断光标の位置の有無别编辑
addListener(this.original , 'クリック', Bind(this, this.Showoriginal, this.original)); //显示源代码
},
Changebgcolor: function(o, name, p) {
if (o.active) return;
o.className = "タグ " 名前;
},
Show: function() {
var spans = $$(this.toolbar, "span"),
Is;
var elm = [[スパン[0], "太字", "タグspan0_active", "タグspan0"], [スパン[1], "斜体", "タグspan1_active", "タグspan1"], [スパン[2]、"下線"、"タグspan2_active"、"タグspan2"]、[スパン[12]、"InsertUnownedList"、"タグspan3_active"、"タグspan12"]、[spans[13]、"InsertOrderedList" 、「タグspan4_active」、「タグspan13」]];
for (var i = 0, l = elm.length; i Is = this.ed.queryCommandState(elm[i][1]);
elm[i][0].className = ですか? elm[i][2] : elm[i][3];
elm[i][0].active = です。
}
},
Showoriginal: function(o) {
if (!this.toolbarlayer) {
this.toolbarlayer = create("div", document.body);
this.toolbarlayer.className = "ツールバーレイヤー";
var pos = Getpos(this.toolbar);
Css(this.toolbarlayer, {
width: this.option.width "px",
left: pos.x "px",
top: pos.y "px"
});
}
if (o.checked) {
this.iframe.style.display = "none";
this.textarea.style.display = "ブロック";
this.toolbarlayer.style.display = "ブロック";
this.textarea.value = this.ed.body.innerHTML;
}
else {
this.iframe.style.display = "ブロック";
this.textarea.style.display = "なし";
this.toolbarlayer.style.display = "なし";
this.ed.body.innerHTML = this.textarea.value;
}
},
Exec: function(o, cmd, para) {
try {
this.ed.execCommand(cmd, false, para);
this.Show();
}
catch(err) {
return;
}
},
InsertImage: function(o) {
if (Sys.IE) { ! this.isfocus && this.iframe.contentWindow.focus();
this.rang = this.ed.selection.createRange();
}
this.lightbox.Show();
this.makebody(this.Imagepopoup, "350px", "插入图片", "InsertImage", "Imagepopoup");
},
CreateLink: function(o) {
if (Sys.IE) this.rang = this.ed.selection.createRange();
this.lightbox.Show();
this.makebody(this.Linkpopoup, "350px", "插入连接", "CreateLink", "Linkpopoup");
},
Fontcolor: function(o) {
var self = this;
if (!this.fontcolorpopup) {
var color = new Popoup({
width: "210px",
title: "颜色选择"
});
this.fontcolorpopup = color.container;
var pos = Getpos(o);
Css(color.container, {
left: pos.x "px",
top: pos.y o.offsetHeight "px"
});
var bgcolor = ["00", "33", "66", "99", "CC", "FF", "00", "33", "66", "99", "CC" 、「FF」];
$$(color.container, "div")[1].appendChild(createtab(12, 18,
function(tab) {
Attr(tab, {
cellPadding: 0,
cellSpacing: 1,
border: 0,
bgColor: "#333333"
});
},
null,
function(i, j, td) {
var color = i Attr(td, {
幅: 10,
高さ: 10,
選択不可: "on"
});
td.style.backgroundColor = color;
addListener(td, 'click', Bind(self, self.Execa, color, "fontColor")); >addListener(td, 'mousedown', BindAsEventListener(self, self.Bubble));
}))
}
else this.fontcolorpopup.style.display = "block";
this.Fpop = Bind(this, this.Hide);
addListener(this.ed, 'click', this.Fpop);
addListener(document, 'mousedown', this.Fpop);
},
Expression: function(o) {
var self = this;
if (!this.facebgpopup) {
var expr = new popoup({
width: "190px",
title: "插入表情"
});
this.facebgpopup = expr.container;
var pos = Getpos(o);
Css(expr.container, {
left: pos.x + "px",
top: pos.y + o.offsetHeight + "px"
});
$$(expr.container, "div")[1].appendChild(createtab(1, this.option.facebg.length,
function(tab) {
Attr(tab, {
cellPadding: 0,
cellSpacing: 1,
border: 0,
bgColor: "#FFFFFF"
});
},
null,
function(i, j, td) {
Css(td, {
backgroundImage: "url(http://album.hi.csdn.net/app_uploads/wtcsy/20090719/220510752.p.gif)",
backgroundPosition: self.option.facebg[j].bgimg
});
Attr(td, {
width: self.option.facebg[i].wl,
height: self.option.facebg[i].wl,
unselectable: "on"
});
addListener(td, 'click', Bind(self, self.Execa, self.option.facebg[j].src, "Expression"));
addListener(td, 'mousedown', BindAsEventListener(self, self.Bubble))
}));
}
else this.facebgpopup.style.display = "block";
this.Fpop = Bind(this, this.Hide);
addListener(this.ed, 'click', this.Fpop);
addListener(document, 'mousedown', this.Fpop);
},
Layout: function() {
var child = this.ed.body.childNodes;
for (var i = 0, l = child.length; i < l; i++) {
if (child[i].nodeName == "DIV" || child[i].nodeName == "P") child[i].style.textIndent = child[i].style.textIndent == "2em" ? "": "2em";
}
},
Fontsize: function(o) {
if (!this.fontsizepopup) {
var size = new popoup({
width: "210px",
title: "字号"
}),
a;
this.fontsizepopup = size.container;
var pos = Getpos(o);
Css(size.container, {
left: pos.x + "px",
top: pos.y + o.offsetHeight + "px"
});
for (var i = 0, l = this.option.fontsizedata.fontSize.length; i < l; i++) {
a = create("a", $$(size.container, "div")[1]);
a.className = "c" + (i + 1);
a.setAttribute("href", "javascript:void(0);")
a.innerHTML = this.option.fontsizedata.fontSize[i];
addListener(a, "click", Bind(this, this.Execa, i, "fontSize"));
addListener(a, 'mousedown', BindAsEventListener(this, this.Bubble));
}
} else this.fontsizepopup.style.display = "block";
this.Fpop = Bind(this, this.Hide);
addListener(this.ed, 'click', this.Fpop);
addListener(document, 'mousedown', this.Fpop);
},
FontName: function(o) {
if (!this.fontnamepopup) {
var name = new popoup({
width: "200px",
title: "字体"
}),
a;
this.fontnamepopup = name.container;
var pos = Getpos(o);
Css(name.container, {
left: pos.x + "px",
top: pos.y + o.offsetHeight + "px"
});
for (var i = 0, l = this.option.fontsizedata.fontname.length; i < l; i++) {
a = create("a", $$(name.container, "div")[1]);
a.className = "n";
a.setAttribute("href", "javascript:void(0);");
a.innerHTML = this.option.fontsizedata.fontname[i];
addListener(a, "click", Bind(this, this.Execa, this.option.fontsizedata.fontname[i], "fontname"));
addListener(a, 'mousedown', BindAsEventListener(this, this.Bubble));
}
} else this.fontnamepopup.style.display = "block";
this.Fpop = Bind(this, this.Hide);
addListener(this.ed, 'click', this.Fpop);
addListener(document, 'mousedown', this.Fpop);
},
makebody: function(o, w, t, f, n) {
if (!o) {
var self = this;
this[n] = new popoup({
width: w,
title: t
});
this[n].pos();
$$(this[n].container, "div")[1].innerHTML = "
连接地址 
 
"
this[n].elm = [$$(this[n].container, "input")[0], $$(this[n].container, "img")[0], $$(this[n].container, "img")[1]];
this[n].elm[0].focus()
addListener(this[n].elm[1], 'click', Bind(this, this.Execa, null, f));
addListener(this[n].elm[2], 'click',
function() {
self.lightbox.Close();
self[n].Close();
});
}
else with(this[n]) {
pos();
Show();
elm[0].value = "";
elm[0].focus();
}
},
Addtable: function() {
if (Sys.IE) { ! this.isfocus && this.iframe.contentWindow.focus();
this.rang = this.ed.selection.createRange();
}
this.lightbox.Show();
if (Sys.IE) this.rang = this.ed.selection.createRange();
if (!this.tablepopup) {
var self = this;
this.tablepopup = new popoup({
width: "300px",
title: "插入表格"
});
this.tablepopup.pos();
$$(this.tablepopup.container, "div")[1].innerHTML = "
行数: 列数:
表格的宽度: px
表行的高度: px
 
"
var o = $$(this.tablepopup.container, "input");
this.tablepopup.elm = [o[0], o[1], o[2], o[3], $$(this.tablepopup.container, "img")[0], $$(this.tablepopup.container, "img")[1]];
addListener(this.tablepopup.elm[4], 'click', Bind(this, this.Execa, null, "CreateTable"));
addListener(this.tablepopup.elm[5], 'click',
function() {
self.lightbox.Close();
self.tablepopup.Close();
});
}
else with(this.tablepopup) {
pos();
Show();
elm[0].focus();
}
this.Fpop = Bind(this, this.Hide);
addListener(this.ed, 'click', this.Fpop);
addListener(document, 'mousedown', this.Fpop);
},
Hide: function(o) {
this.facebgpopup && (this.facebgpopup.style.display = "none");
this.fontsizepopup && (this.fontsizepopup.style.display = "none");
this.fontnamepopup && (this.fontnamepopup.style.display = "none");
this.fontcolorpopup && (this.fontcolorpopup.style.display = "none");
removeListener(this.ed, 'click', this.Fpop);
removeListener(document, 'mousedown', this.Fpop);
},
Bubble: function(e) {
if (Sys.IE) {
e.cancelBubble = true
} else {
e.stopPropagation()
}
},
Execa: function(num, stamp) {
var exec = {
fontname: function() {
this.fontnamepopup.style.display = "none";
this.ed.execCommand('FontName', false, num);
},
fontSize: function() {
this.fontsizepopup.style.display = "none";
this.ed.execCommand("FontSize", false, num + 1)
},
fontColor: function() {
this.fontcolorpopup.style.display = "none";
this.ed.execCommand("ForeColor", false, num);
},
CreateLink: function() {
this.lightbox.Close();
this.Linkpopoup.Close();
if (this.Linkpopoup.elm[0].value == "") return;
if (Sys.IE) {
this.rang.execCommand("CreateLink", false, this.Linkpopoup.elm[0].value);
this.rang.parentElement().target = "_blank ";
}
else {
this.ed.execCommand("CreateLink", false, this.Linkpopoup.elm[0].value);
this.rang = this.iframe.contentWindow.getSelection().getRangeAt(0);
this.rang.commonAncestorContainer.parentNode.target = "_blank ";
}
},
InsertImage: function() {
this.lightbox.Close();
this.Imagepopoup.Close();
if (this.Imagepopoup.elm[0].value == "") return;
Sys.IE ? this.rang.execCommand("InsertImage", false, this.Imagepopoup.elm[0].value) : this.ed.execCommand("InsertImage", false, this.Imagepopoup.elm[0].value);
},
Expression: function() {
this.facebgpopup.style.display = "none";
Sys.IE && (this.iframe.contentWindow.focus());
this.ed.execCommand("InsertImage", false, num);
},
CreateTable: function() {
this.lightbox.Close();
this.tablepopup.Close();
var o = this.tablepopup.elm,
p = null;
if (Sys.IE) {
this.rang.execCommand("InsertImage", false, "http://xxx.com/xxxxx.gif");
p = this.rang.parentElement();
}
else {
this.ed.execCommand("InsertImage", false, "http://xxx.com/xxxxx.gif");
p = this.iframe.contentWindow.getSelection().getRangeAt(0).commonAncestorContainer;
}
var tab = createtab(o[0].value, o[1].value,
function(tab) {
Attr(tab, {
cellPadding: 0,
cellSpacing: 1,
border: 0,
bgColor: "#CCCCCC",
width: o[2].value
});
},
null,
function(i, j, td) {
td.height = o[3].value;
td.width = o[2].value / o[1].value;
td.style.backgroundColor = "#FFFFFF"
},
this.ed);
var imgs = p.getElementsByTagName("img");
for (var i = 0, l = p.childNodes.length; i < l; i++) {
if (imgs[i].src == "http://xxx.com/xxxxx.gif") {
p.replaceChild(tab, imgs[i])
}
}
p.insertBefore(this.ed.createElement("br"), tab.nextSibling);
}
};
Bind(this, exec[stamp])();
}
});
var popoup = new Class({
options: {
width: "200px",
title: "标题"
},
initialize: function(options) {
this.container = create("div", document.body);
Extend(this.options, options);
this.title = this.options.title;
this.container.className = "pp";
this.container.style.width = this.options.width;
this.container.innerHTML = "
";
this.w = this.container.offsetWidth;
this.h = this.container.offsetHeight;
$$(this.container, "span")[0].innerHTML = this .title;
},
pos: function() {
var str = "left:" (Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth) - this.w) / 2 "px;top:" ((Math.min(document.documentElement.scrollHeight, document.documentElement.clientHeight) - this.h) / 2 document.documentElement.scrollTop) "px"
Css(this.container, str);
},
表示: function() {
this.container.style.display = "";
},
閉じる: function() {
this. container.style.display = "none";
}
})
var LightBox = {
obj: null,
config: {
Color: "#fff",
Opacity: 80,
zIndex: 5
},
init: function(options) {
Extend(this.config, options || {}); this.config);
this.config を削除します;
this.obj = document.body.insertBefore(document.createElement("div"), document.body.childNodes[0]); = "表示:なし; z-index:" this.zIndex ";left:0px;top:0px;position:fixed;width:100%;height:100%;background-color:"this.Color (Sys.IE ? ";filter : alpha) (不透明度:" this.Opacity ")": ";不透明度 :" this.Opacity / 100);
Css(this.obj, str);
if (Sys.IE6) {
this. obj.style.position = "絶対";
var _self = this;
this._resize = function() {
_self.obj.style.width = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth) "px";
_self.obj.style.height = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) "px"; .obj.innerHTML = '