이번엔 사용자들이 쉽게 웹페이지를 편집할 수 있게하는 Editing API 에 대해서 살펴보도록 하겠습니다.

기존엔 웹페이지에 Editor 를 구현하기위해서 각 업체별로, 개발자별로 Javascript 를 사용하여 각자의 방법으로 개발하였습니다. 하지만, HTML 5 에서부터는 Rich Text 를 편집하기위한 API 가 표준으로 규정되어 있습니다. 그리고 추가적으로 DesignMode thrtjd과 Global 속성인 Contenteditable 속성이 포함되어 있습니다.

5-1. Contenteditable 과 designMode

contenteditable 속성과 designMode 속성은 모두 내용편집이 불가능한 요소를 편집가능하도록 하기위한 API 로, 차이점은
contenteditable 속성은 특정 Element 의 내용을, designMode 속성은 문서 전체를 편집할 수 있게 합니다.

<div id="editor" contenteditable="true"></div>
또는
<div id="editor" contenteditable></div> <!--true 값은 생략가능-->


contenteditable 속성의 값은 세가지를 가질 수 있습니다.
   의미
 true  편집가능
 false  편집불가
 inherit  부모요소로부터 상속

contenteditable 속성값이 true 인 요소의 자식 요소들은 기본적으로 true 값을 가집니다.
하지만 아래와 같이 명시적으로 contenteditable 값을 false 로 지정한다면 편집할 수 없습니다. (하지만 부모 div Element 의 contenteditable 의 속성이 true 이므로 그 자식element 인 두번째 div 를 삭제할 수는 있을 것입니다.)

<div id="editor" contenteditable="true">
    <div>편집 가능</div>
    <div contenteditable="false">편집불가</div>
</div>

(참고 : 웹혁명을 꿈꾸다 HTML 5 & API 입문)


위 이미지를 보면 상단 Web Browser 가 ie9 이고 아래는 Opera 인데요...
ie9 은 편집불가인 부분도 편집이 되는 문제가 있군요... opera 는 편집불가인 부분은 편집되지 않았습니다.

그리고 이렇게 지정한 contenteditable 의 속성값은 아래와 같이 javascirpt 를 이용하여 해당 Element 의 isContentEditable 속성에 접근할 수 있습니다.

var  editor = document.getElementById("editor");
var isEditable = editor.isContentEditable


designMode 속성을 사용하면 문서 전체를 편집할 수 있습니다.
designMode 속성은 document 객체가 갖는 속성으로 "on", "off" 값을 갖습니다. 문서 뿐만이 아니라 iframe 의 contentDocument 속성에 사용하게되면 iframe 내의 내용 또한 편집할 수 있습니다.

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


5-2. Rich Text Edit API
위에서 언급한 contenteditable 속성 이나 designMode 속성을 편집모드로 설정한 상태에서 editing API 를 사용하면 편집내용을 Rich Text 로 다룰 수 있습니다.
이때 사용하는 것이 execCommand API 입니다.

이제 execCommand 를 살펴보도록 하겠습니다.
document 객체에서 사용할 수있는 함수로 commandId, showUI, value 세가지의 Parameter를 갖습니다.
이 중 첫번째 Parameter 이외에는 생략할 수 있지만 Command Id 에 따라 값을 지정하여 호출합니다.

document . execCommand(commandId [, showUI [, value ] ] )

이 때, Command ID 로 사용되는 명령어들은 다음과 같은 것들이 있습니다. 이 들을 간단히 살펴보겠습니다.
 CommandID 설명 
 bold  선택한 문자열을 굵은 글씨로 전환합니다.
 createLink  선택한 문자열을 하이퍼링크로 전환합니다.
 delete  선택한 문자열이나 커서 앞의 문자를 삭제합니다.
 formatBlock  선택한 문자열을 지정한 Tag로 감쌉니다.
 forwardDelete  선택한 문자열이나 커서 뒤의 문자를 삭제합니다.
 insertImage  커서가 위치한 곳에 이미지를 삽입합니다.
 insertHTML  문자를 커서가 위치한 곳에 HTML 형태로 삽입합니다.
 insertLineBreak  커서의 위치에 줄바꿈을 삽입합니다.
 insertOrderedList  커서의 위치에 순서있는 리스트(ol tag)를 삽입합니다.
 insertUnorderedList  커서의 위치에 순서없는 리스트(ul tag)를 삽입합니다.
 insertParagraph  커서의 위치에 Paragraph (p tag 나 div tag : Browser 마다 구현은 각각 다름) 를 삽입합니다.
 insertText  커서의 위치에 문자를 삽입합니다.
 italic  선택한 문자열을 italic 체로 전환합니다.
 redo  undo 를 재실행합니다.
 selectAll  편집가능한 컨텐츠를 모두 선택합니다.
 subscript  선택한 문자열을 아랫첨자로 전환합니다.
 superscript  선택한 문자열을 윗첨자로 전환합니다.
 undo  실행을 취소합니다.
 unlink  선택한 문자열에 적용된 하이퍼링크를 제거합니다.
 unselect  선택을 취소합니다.
 VendorID-customCommandID  Browser 제작사들 마다의 명령어를 지정하여 호출합니다.

execCommand함수 이외에도 다섯가지의 함수가 더 존재하는데 이 함수들을 이용하면 WYSIWYG Editor 를 만들 수 있을 것입니다.
그럼, execCommand 함수 이외의 다섯가지 함수에 대해서 살펴보도록 하겠습니다.

 함수명 설명 
 document.queryCommandEnabled(commandId)  지정한 명령어(commandId)가 실행가능한지 여부를 반환합니다. 현재 커서의 위치에서 실행가능 여부를 알 수 있습니다.
 document.queryCommandIndeterm(commandId)  지정한 명령어(commandId)의 효과가 일정한가 여부를 반환합니다.
 document.queryCommandState(commandId)  지정한 명령어(commandId)의 상태를 반환합니다. 현재 커서의 위치에서 실행가능 여부를 알 수 있습니다.
 document.queryCommandSupported(commandId)  지정한 명령어(commandId)가 지원되는지 여부를 반환합니다.
 document.queryCommandValue(commandId)  지정한 명령어(commandId)의 현재값을 반환합니다.

위 함수들과 commandid 들을 사용하면 쉽게? Editor 를 구현할 수 있겠네요...
하지만 HTML 4와 다른 점이 무엇이 있을까요? HTML 4 에서는 구현하지 못했던 것들이었을까요?
여러분들도 아시겠지만 그렇지 않습니다.
지금까지 많은 Web 개발자들이 제작하고, 또 사용하고 있는 WYSIWYG Editor 들을 보면 알 수 있듯이 예전 부터 만들어 왔고, 계속 사용되어져 왔습니다.
하지만, HTML 5 로 넘어오면서 달라진 점이라고 한다면 표준화하여 API 를 작성하고 통일된 사양아래서 개발할 수 있도록 하였다는데 주목해야 할 것입니다.


Editor 를 제작하면 더 좋았을 듯 하지만 그 내용은 추후에 추가해 보도록 하겠습니다.
(제일 짧은 글이네요... 성의없어 보이는 것은... ㄷㄷㄷ ㅡㅡ'


행복한 고수되십시요.


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



반응형

'Web > HTML 5' 카테고리의 다른 글

[HTML 5] 9. Audio Element  (0) 2011.06.14
[HTML 5] 8. Video Element  (3) 2011.06.10
[HTML 5] 6. Strong Web Form  (0) 2011.06.05
[HTML 5] 5. Sementic Element (2)  (1) 2011.06.01
[HTML 5] 4. Sementic Element (1)  (0) 2011.05.29

+ Recent posts