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