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.0080 sec