U E D R , A S I H C RSS

html5/richtext-edit


1. ๋ฆฌน˜…ŠคŠธ Žธง‘

  • ๋ฆฌน˜ …ŠคŠธ๋ž€ : „œ‹„ ๊ฐ€„ …ŠคŠธ, …ŠคŠธ˜ ฐŠธ, Šคƒ€ผ, ƒ‰ƒ, ๋ฌธ๋‹จ •๋ ฌ๋“˜ ฌ๋งท„  €žฅ•˜๊ณ žˆ๋‹ค

  • HTML5๋Š” ๋ฆฌน˜…ŠคŠธ Žธง‘šฉ API๋ฅผ ‘œค€œผ๋กœ ๊ทœ ••œ๋‹ค.
  • ถ”๊ฐ€๋œ API : contenteditable†„, ๋ฌธ„œ designMode
  • ๋‚ดšฉ Žธง‘ด ๋ถˆ๊ฐ€๋Šฅ•œ š”†Œ(div๋“)๋ฅผ Žธง‘•˜๊ฒŒ •˜๊ธฐ œ„•œ API.

  • contenteditable : Šน • š”†Œ˜ ๋‚ดšฉ๋งŒ Žธง‘ ๊ฐ€๋Šฅ
  • designmode : ๋ฌธ„œ  „ฒด๋ฅผ Žธง‘•  ˆ˜ žˆŒ

2. contenteditable

* contenteditable : ๋ฌธž—ด„ ๊ฐ’œผ๋กœ ๊ฐ€ง, ""(null), "true" "false"
  • "false"ด™ธ˜ ๊ฐ’„ ๊ฐ€ˆ ๋•Œ •ด๋‹น ๋ฌธ„œ Žธง‘๊ฐ€๋Šฅ
  • contenteditable˜ ƒƒœ๋Š” ƒ†๋˜๋ฏ€๋กœ Žธง‘๊ฐ€๋Šฅ•œ š”†Œ •˜œ„˜ š”†Œ๋Š” ๋ชจ๋‘ Žธง‘๊ฐ€๋Šฅ

- Žธง‘ ๊ฐ€๋Šฅ -
<div id="deit" contenteditable="true"></div>
<div id="deit" contenteditable></div>

- Žธง‘ ๋ถˆ๊ฐ€-
<div id="deit" contenteditable="false"></div>

- Žธง‘ ƒƒœ ๋ฐ˜™˜ -
isContentEditable๋กœ ˜„žฌ Žธง‘๊ฐ€๋Šฅ •Œˆ˜ž‡Œ ("true", "false", "inherit"๋ฐ˜™˜)


- ž๋ฐ”Šคฌ๋ฆฝŠธ๋ฅผ ดšฉ•œ Žธง‘ †„  ••˜๊ธฐ -
var editor = document.getElementById("editor");
if(editor.isContentEditable)
editor.contentEditable = "false";

3. designMode

designMode : document๊ฐฒด๊ฐ€ ๊ฐ€„ †„˜ •˜๋‚˜, 'on' 'off'๋ชจ๋“œ ๊ฐ€ง
window.document : ˜„žฌ ›Ž˜ดง€  „ฒด Žธง‘๊ฐ€๋Šฅ
iFrame˜ contentDocument๋ฅผ ๋Œ€ƒ - iFrame•ˆ˜ ๋‚ดšฉ Žธง‘๊ฐ€๋Šฅ


src = "about:blank"
width = "300" height = "200"
onload="this.contentDocument.designMode='on'">
</iframe>

4. Žธง‘๊ฐ€๋Šฅ˜—ญ—„œ Žธง‘•  ๋‚ดšฉ ๊ฐ€ ธ˜ค๊ธฐ

innerHTML : HTMLƒœ๊ทธ๋ฅผ ฌ•จ•œ ๋ฌธž—ด
textContent : HTMLƒœ๊ทธ  œ™ธ ˆœˆ˜ ๋ฌธž—ด๋งŒ

- innerHTML -
<div id="editor" contenteditabl></div>
var editor = document.getElementById("editor");
// innerHTML †„„ ฝ–ด๋“คž„
alert(editor.innerHTML);

- textConetent -

id="editor"
src="about:blank"
width="300" height="200"
onload="this.contentDocument.designMode = 'on'>
</iframe>
var editor= document.getElementById("editor");
// textContent †„„ ฝ–ด๋“คž„
alert(editor.contentDocument.body.textContent);


5. „ ƒ•œ ๋ฒ”œ„ กฐž‘

  • window๋‚˜ document๊ฐฒด๊ฐ€ ๊ฐ€„ getSelection()๋ฉ”„œ๋“œ๋ฅผ ดšฉ•˜—ฌ Selection˜• ๊ฐฒด ƒ„
- selection ๊ฐฒด ƒ„ -
var selection = window.getSelection();

  • „ ƒ ๋ฒ”œ„˜ DOMš”†Œ™€ ๊ด€๋ จ๋œ API
    • anchorNode : „ ƒ„ ‹œž‘•œ œ„น˜— žˆ๋Š” š”†Œ˜ DOM๋…ธ๋“œ ๊ฐ€ ธ˜ด
    • anchorOffset : anchorNode •ˆ—„œ „ ƒ„ ‹œž‘•œ œ„น˜˜ ˜ค”„…‹ ๋ฐ˜™˜
    • focusNode : „ ƒ„ ข…๋ฃŒ•œ œ„น˜— žˆ๋Š” š”†Œ˜ DOM๋…ธ๋“œ ๊ฐ€ ธ˜ด
    • focusOffset : focusNode •ˆ—„œ „ ƒ„ ข…๋ฃŒ•œ œ„น˜˜ ˜ค”„…‹ ๊ฐ€ ธ˜ด

  • ปค„œ œ„น˜ กฐž‘
    • collapse(parentNode, offset) : ง€ ••œ š”†Œ(parrentNode)•ˆ˜ ง€ ••œ œ„น˜(offset)œผ๋กœ ปค„œ๋ฅผ ด๋™‹œ‚จ๋‹ค
    • collapseToStart() : ˜„žฌ …ŠคŠธ˜ ๋งจ •žœผ๋กœ ปค„œ๋ฅผ ด๋™‹œ‚ด
    • collapseToEnd() : „ ƒ๋œ …ŠคŠธ˜ ๋งจ ๋’ค๋กœ ปค„œ๋ฅผ ด๋™‹œ‚ด
    • isCollapsed() : …ŠคŠธ๊ฐ€ „ ƒ๋˜ง€ •Š•˜๋Š”๋ฐ ปค„œ๊ฐ€ žˆ„ ๋•Œ true๋ฐ˜™˜

  • Selection ๊ฐฒด— toString‚ฌšฉ•˜๋ฉด „ ƒ•œ ๋ฒ”œ„˜ ๋ฌธž—ด(HTML œ™ธ)๊ฐ€ ธ˜ด
- „ ƒ๋œ ๋ฌธž—ด ถœ๋ ฅ -
alert(window.getSelection().toString());

6. ›–ด”Œ๋ฆฌผ€ด…˜˜ ‹ค–‰ทจ†Œ๊ธฐ๋Šฅ

  • กฐž‘•œ ๋‚ดšฉ ด๋ ฅ ๊ธฐ๋ก undoManager๊ฐ€  €žฅ(ตœƒœ„ ๊ฐฒด) ƒ๋‹นžˆ ๊ฐ„๋‹จ
  • DOM๋ณ€๊ฒฝ€ ๋ธŒ๋ผšฐ €๊ฐ€ ‹ค–‰ ด๋ ฅ ๊ด€๋ฆฌ ๊ฐ„Žธ ข‹Œ

- undoManager— ด๋ ฅ ถ”๊ฐ€•˜๋Š” ๋ถ€๋ถ„ -
undoManager.add({
operation: "add-favorite",
id : 100
}, "ฆ๊ฒจฐพ๊ธฐ");

- ‹ค–‰ ทจ†Œ -
window.addEventListener("undo", function(event) {
var data = event.data;
if(data.operation == "add-favorite") {
var id = data.id;
// ฆ๊ฒจฐพ๊ธฐ๋กœ๋ถ€„˜ ‚ญ œ ฒ˜๋ฆฌ
...
}
...
}, false);

7. ๊ด€๋ จ ‚ฌดŠธ

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:41
Processing time 0.0237 sec