ãã®èšäºã§ã¯ãdesignModeããããã£ãšcontentEditableããããã£ã®äœ¿çšæ¹æ³ãšãåçŽãªããã¹ããšãã£ã¿ãŒã®äœæäŸã䜿çšããé¢é£APIã«ã€ããŠèª¬æããŸãã
designModeããã³contentEditableããã³é¢é£ããAPIã䜿çšããçè«ãæ¢ãã·ãªãŒãºã®æåã®èšäºã®ç¿»èš³ïŒ
ããŒã1 ã
ããŒã2
ã¯ããã«
èšäºã®æåã®éšåã§ã¯ ãdesignModeããããã£ãšcontentEditableããããã£ã䜿çšããŠãã©ãŠã¶ãŒãšãã£ã¿ãŒãäœæããçè«ã詳ãã調ã¹ãŸããã ãããã®DOMããããã£ã¯HTML 5ã§æšæºåãããŠãããã»ãšãã©ã®ãã©ãŠã¶ãŒã§å€ããå°ãªãããµããŒããããŠããŸãã èšäºã®ç¬¬2éšã§ã¯ãåçŽãªã¯ãã¹ãã©ãŠã¶ãŒããã¹ããšãã£ã¿ãŒã®äœæãèæ
®ããŠãçè«ããå®è·µã«ç§»ããŸãã
ãããã¯ãŒã¯äžã§ãšãã£ã¿ãŒã®å®æããŒãžã§ã³ã確èªãã
ãã®ã³ãŒãã
ããŠã³ããŒãã§ããŸã ã ãªã¹ãã«ã¯ã説æãå¿
èŠãšããã³ãŒãã®æãèå³æ·±ãéšåã®ã¿ã衚瀺ãããŸããæ®ãã®ã³ãŒãã¯éå±ãªã®ã§ãèæ
®ãããŸããã ã³ãŒãã¯3ã€ã®ãã¡ã€ã«ã«åãããŠããŸãã
- editor.jsïŒã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã€ã³ãã©ã¹ãã©ã¯ãã£ã
- editlib.jsïŒéžæãå€æŽããããã®äžé£ã®é¢æ°
- util.jsïŒæ±çšæ©èœã®ã©ã€ãã©ãªã
ãã¬ãŒã
åºç€ãšããŠãIFrameå
ã§ç©ºçœããŒãžã䜿çšããŸãã
<iframe id="editorFrame" src="blank.html"></iframe>
aboutïŒblankã䜿çšããŠãæ¬æã«èŠçŽ ã®ãªãå®å
šã«ç©ºã®ããŒãžãååŸã§ããŸãããæ¬æã®ç©ºã®æ®µèœã§äœæ¥ãéå§ã§ããããã«ãç¬èªã®ã空ã®ãããŒãžãäœæããããšããå§ãããŸãã
<title></title> <body><p></p></body>
Mozillaã¯ãä»ã®ãã¹ãŠã®ãã©ãŠã¶ãŒãšåæ§ã«ã空ã®pã§å
¥åãéå§ãããããæãŸããæ¹æ³ã§ãã ãããè¡ãããªãå Žåã圌女ã¯ããã¹ããæ¬æã«çŽæ¥å
¥åããŸãã contentEditableããããã£ã䜿çšãããšããã¬ãŒã ãªãã§å®è¡ã§ããŸãããFirefox 2ã¯contentEditableããµããŒãããªããããiFrameã䜿çšããããšããå§ãããŸãã ïŒ
翻蚳è
ã®ã¡ã¢ïŒFF2ã¯ãæ§ããã«èšã£ãŠããé¢é£æ§ããããŸãããã ããã誰ãiframeãå¿
èŠãšããªããšæããŸãã ïŒ
ç·šéã¢ãŒããèšå®ãã
é¢æ°ïŒeditor.jsã«ãããŸãïŒã䜿çšããŠãããŒãžã®èªã¿èŸŒã¿æã«ç·šéã¢ãŒããæå¹ã«ããŸã
function createEditor() { var editFrame = document.getElementById("editorFrame"); editFrame.contentWindow.document.designMode="on"; } bindEvent(window, "load", createEditor);
bindEventã¯ãé¢æ°ãã€ãã³ãïŒutil.jsã§å®çŸ©ïŒã«ãã€ã³ããã圹å²ãæãããŸãã jQueryã®ãããªãã¬ãŒã ã¯ãŒã¯ã«ã¯ã䜿çšããå¯èœæ§ã®ããé©åãªæ©èœããããŸã次ã®ã¹ãããã¯ãæå°éã®ãã©ãŒãããæ©èœãåããã³ã³ãããŒã«ããã«ãäœæããããšã§ãã
å¶åŸ¡ç€
ã·ã³ãã«ãªã³ã³ãããŒã«ããå§ããŸããããã倪åããã¿ã³ã¯ãéžæããããã¹ãã®ã¹ã¿ã€ã«ã倪åã«å€æŽããŸãã ãã¿ã³ã¯ããã¥ã¡ã³ãã®ç¶æ
ã衚瀺ããå¿
èŠããããŸã-ããã¹ãå
ã®ãšã³ããªãã€ã³ãã倪åã®å Žåããã¿ã³ã匷調衚瀺ãããŸãããžãã¯ã¯ãããã¥ã¡ã³ããšéžæã¹ããŒã¿ã¹èŠæ±ã«å¯Ÿããå®éã®æäœãã«ãã»ã«åããã³ãã³ããªããžã§ã¯ããšãã€ãã³ããåŠçããã³ã³ãããŒã©ãŒãªããžã§ã¯ããã¿ã³ã®ç¶æ
ãã¯ãªãã¯ããŠåæããŸãã åŸã§èª¬æããããã«ãç°ãªãããŒã ãåãããžãã¯ãå
±æããå¿
èŠããããããåé¢ãå¿
èŠã§ãã ã€ãã³ãã¯2ã€ã®ãã€ã³ãã§ããªã¬ãŒãããŸãããŠãŒã¶ãŒãã³ã³ãããŒã«ããã«ã®ãã¿ã³ãæŒããšãã³ã³ãããŒã©ãŒã¯ããã¥ã¡ã³ãã§å®è¡ãããã³ãã³ããåŒã³åºãããŠãŒã¶ãŒãããã¥ã¡ã³ãå
ã§ã«ãŒãœã«ã移åãããšãã³ã³ãããŒã«ããã«ã®ãã¿ã³ã®ç¶æ
ãå€æŽããŸãã
ã³ãã³ããšã³ã³ãããŒã©ãŒã®å®è£
倪åã®ã³ãã³ãã¯æåã¯APIã§ãµããŒããããŠãããããã³ãã³ããªããžã§ã¯ãã¯åãªãå°ããªã©ãããŒã§ãã
function Command(command, editDoc) { this.execute = function() { editDoc.execCommand(command, false, null); }; this.queryState = function() { return editDoc.queryCommandState(command) }; }
ã©ãããŒãå¿
èŠãªçç± éæšæºã®ããŒã ã«æšæºã®ããŒã ãšåãã€ã³ã¿ãŒãã§ãŒã¹ãæããããã®ã§ã
ãã¿ã³ã¯åãªãã¹ãã³ã§ãã
<span id="boldButton">Bold</span>
ã¹ãã³ã¯ãã³ã³ãããŒã©ãä»ããŠã³ãã³ããªããžã§ã¯ãã«é¢é£ä»ããããŸãã
function TogglCommandController(command, elem) { this.updateUI = function() { var state = command.queryState(); elem.className = state?"active":""; } bindEvent(elem, "click", function(evt) { command.execute(); updateToolbar(); }); }
ã³ã³ãããŒã«ããã«ã®ãã¿ã³ãã¯ãªãã¯ãããšãã«ç·šéãŠã£ã³ããŠã«ãã£ãŠãã©ãŒã«ã¹ãç¶æãã圹å²ãæ
ã£ãŠããã³ãŒãã¯ããªã¹ãããé€å€ãããŸããã 以äžã§ã¯ãToggleCommandControlleré¢æ°ãåŒã³åºããŠããã¿ã³ã®ç¶æ
ãšããã¹ãã®ã¹ã¿ã€ã«ãããããã®2ã€ã®ç¶æ
ãèæ
®ããŠåæãããŸãã ãã¿ã³ãæŒããããšãã³ãã³ããå®è¡ãããŸãã updateUIã€ãã³ããçºçãããšãããã¹ãã®ç¶æ
ã«å¿ããŠãã¹ãã³ã¯ãã¢ã¯ãã£ããªãã¯ã©ã¹ãååŸããããã¯ã©ã¹ã倱ããŸãã ãã¿ã³ã®å€èŠ³ã決å®ããCSSããããã£ïŒ
.toolbar span { border: outset; } .toolbar span.active { border: inset; }
ã³ã³ããŒãã³ãã¯æ¬¡ã®ããã«æ¥ç¶ãããŸãã
var command = Command("Bold", editDoc); var elem = document.getElementById(îboldButton); var controller = new TogglCommandController(command, elem); updateListeners.push(controller);
updateListenersã³ã¬ã¯ã·ã§ã³ã«ã¯ãã³ã³ãããŒã«ããã«ã®ã³ã³ãããŒã©ãŒãå«ãŸããŠããŸãã updateToolbaré¢æ°ã¯ãªã¹ããå埩åŠçãããã¹ãŠã®ã³ã³ãããŒã«ãæ£ç¢ºã«ææ°ã«ãªãããã«ãåã³ã³ãããŒã©ãŒã®updateUIã¡ãœãããåŒã³åºããŸãã ããã¥ã¡ã³ããéžæãããã³ã«updateToolbarãåŒã³åºãããããã«ãã€ãã³ããæ·»ä»ããŸãã
bindEvent(editDoc, "keyup", updateToolbar); bindEvent(editDoc, "mouseup", updateToolbar);
äžèšã®ããã«ãã³ãã³ããå®è¡ããããšupdateToolbarãåŒã³åºãããŸãã ã³ãã³ãã«é¢é£ä»ããããŠãããã¿ã³ã®ã¿ãæŽæ°ããã®ã§ã¯ãªããåã³ãã³ãã®å®è¡åŸã«ã³ã³ãããŒã«ããã«å
šäœãæŽæ°ããã®ã¯ãªãã§ããïŒ ã³ãã³ãå®è¡ã®çµæãšããŠä»ã®ã³ã³ãããŒã«ã®ç¶æ
ãå€åããå¯èœæ§ãããããã§ãã ããšãã°ãå³æãã³ãã³ãã䜿çšãããšãå·Šæããã¿ã³ãšäžå€®ãã¿ã³ã®ç¶æ
ãå€ãããŸãã èãããããã¹ãŠã®äŸåé¢ä¿ã远跡ãã代ããã«ãã³ã³ãããŒã«ããã«å
šäœãæŽæ°ããæ¹ãç°¡åã§ããããã§ã2ã€ã®ç¶æ
ãæã€ããŒã çšã®åºæ¬çãªã€ã³ã¿ãŒãã§ã€ã¹ãã§ããŸããã çµæã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠã倪åãæäœãJustifyLeftãJustifyRightãããã³JustifyCenterããŒã ãå®è£
ãããŸãã
ãªã³ã¯
åºæ¬çãªããã¹ãæžåŒèšå®ã³ãã³ããå®è£
ããåŸãããã¥ã¡ã³ãã«ãªã³ã¯ãè¿œå ããæ©èœããŠãŒã¶ãŒã«æäŸããããšã«ããŸããã createLinkã¯åžæã©ããã«åäœããªãããããªã³ã¯ç®¡çã«ã¯ããè€éãªããžãã¯ãå¿
èŠã§ãã ãªã³ã¯ãäœæããŸãããéžæç¯å²ããªã³ã¯å
ã«ãããã©ããã«é¢ããæ
å ±ã¯è¿ããŸããã ãããŠãã³ã³ãããŒã«ããã«ãšéžæã®ã¹ããŒã¿ã¹ãåæããããã«ãããå¿
èŠã§ãããéžæããªã³ã¯å
ã«ãããã©ãããã©ã®ããã«ç¢ºèªã§ããŸããïŒ ãããè¡ãã«ã¯ãgetContainingé¢æ°ãäœæããŸããããã¯ãã«ãŒãœã«ãé
眮ãããŠããèŠçŽ ããDOMããªãŒã®äžäœã«ç§»åããå¿
èŠãªåã®èŠªãèŠã€ãããŸã§ç¶ããŸãïŒãã®å Žåã¯ãªã³ã¯ãèŠçŽ ãèŠã€ãããªãå Žåãé¢æ°ã¯äœãè¿ããŸããïŒã éžæãaã¿ã°å
ã«ããå Žåã¯ããªã³ã¯å
ã«ããããªã³ã¯ã®URLããŠãŒã¶ãŒã«å°ããæ¹æ³ãå¿
èŠã§ãã ã¯ãŒã©ãŒãšãã£ã¿ãŒã¯ãã®ãªã¯ãšã¹ãã«å¯ŸããŠéæšæºã®ãã€ã¢ãã°ãäœæããŸãããã¿ã¹ã¯ãç°¡çŽ åããããã«ãæšæºã®window.prompté¢æ°ã䜿çšããŸãã éžæããªã³ã¯å
ã«ããå ŽåããŠãŒã¶ãŒãå€æŽã§ããããã«çŸåšã®URLã衚瀺ããŸãã ãã以å€ã®å Žåã¯ãhttpïŒ//ãã¬ãã£ãã¯ã¹ã衚瀺ããã ãã§ãã
function LinkCommand(editDoc) { var tagFilter = function(elem){ return elem.tagName=="A"; };
é¢æ°ã®ããžãã¯ã¯æ¬¡ã®ãšããã§ãã
- ãã®é¢æ°ã¯ãçŸåšã®èŠçŽ ãæ€çŽ¢å¯Ÿè±¡ãã©ããã確èªããŸãã tagNameã¯ãã³ãŒãã®å€§æåãšå°æåã«é¢ä¿ãªããåžžã«å€§æåã§è¿ãããŸãã
- getContainingã¯ãæå®ãããååãå«ãèŠçŽ ãæ€çŽ¢ããŸãã èŠã€ãããªãå Žåã¯ãnullãè¿ããŸãã
- 芪èŠçŽ ã®äžã«ãªã³ã¯ãèŠã€ãã£ãå Žåããã€ã¢ãã°ã«hrefå±æ§ãè¿œå ããŸãã ãã以å€ã®å Žåãæšæºã®httpïŒ//ã«ãªããŸãã
- ãŠãŒã¶ãŒã[ãã£ã³ã»ã«]ãã¯ãªãã¯ãããšãããã³ããã¯nullãè¿ããŸãã ãã®å Žåãã³ãã³ãã®å®è¡ã¯çµäºããŸãã
- ãŠãŒã¶ãŒãURLãåé€ããŠ[OK]ãã¯ãªãã¯ããå ŽåããŠãŒã¶ãŒã¯ãªã³ã¯ãåé€ããããšèããŠããŸãã ãããè¡ãã«ã¯ãæšæºã®unlinkã³ãã³ãã䜿çšããŸãã
- ãŠãŒã¶ãŒãURLãå
¥åããŠ[OK]ãã¯ãªãã¯ãããšãcreateLinkã³ãã³ãã䜿çšããŠãªã³ã¯ãäœæãããŸãã ïŒãªã³ã¯ãæ¢ã«ååšããå Žåã¯ãURLãæ°ãããã®ã«çœ®ãæããŸãïŒã
- äºéåŠå®ã¯ããŒã«åã«ãªããŸã-èŠçŽ ãèŠã€ãã£ãå Žåã¯trueãããã§ãªãå Žåã¯falseã
- ã³ã³ãããŒã«ããã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯å€æŽãããŠããªããããLinkCommandãšæšæºã®ToggleCommandControllerãçµã¿åãããããšãã§ããŸãããã¹ãŠåãexecuteã¡ãœãããšqueryStateã¡ãœããã§ãã
å«ã
getContainingé¢æ°ïŒeditlib.jsã«ãããŸãïŒãèŠãŠã¿ãŸãããã ãã®é¢æ°ã¯ãéžæãç¹å®ã®ã¿ã€ãã®èŠçŽ å
ã«ãããã©ããããã§ãã¯ããŸãããIE APIã®åäœã¯ä»ã®ãã©ãŠã¶ãŒã®APIãšã¯å°ãç°ãªããããããã¯å°ãè€éã§ãã ãããã£ãŠãé¢æ°ã®2ã€ã®ç¬ç«ããå®è£
ãšãã©ã¡ãã䜿çšãããã決å®ããã¡ã«ããºã ãäœæããå¿
èŠããããŸãããããè¡ãã«ã¯ãgetSelectionããããã£ã®å¯çšæ§ã決å®ããŸãã ãã®ããã«ïŒ
var getContaining = (window.getSelection)?w3_getContaining:ie_getContaining;
IEã®é¢æ°ã®å®è£
ã¯ãIEã®éžæAPIã®ããã€ãã®æ©èœã瀺ããŠãããããããèå³æ·±ããã®ã§ãã
function ie_getContaining(editWindow, filter) { var selection = editWindow.document.selection; if (selection.type=="Control") {
次ã®ããã«æ©èœããŸãã
- éžæãªããžã§ã¯ãã®ã¿ã€ãã¯ããControlããŸãã¯ãTextãã§ãã è€æ°ã®ãªããžã§ã¯ãïŒã³ã³ãããŒã«ïŒãéžæã§ããŸãïŒã€ãŸãããŠãŒã¶ãŒã¯ctrl +ã¯ãªãã¯ã䜿çšããŠãé£æ¥ããŠããªãè€æ°ã®ç»åãéžæã§ããŸãïŒã
- éžæããè€æ°ã®ãªããžã§ã¯ãã®ç¶æ³ã¯åŠçããŸããã ãã®å Žåãã³ãã³ãããã£ã³ã»ã«ããã ãã§ãäœãèµ·ãããŸããã
- éžæç¯å²ã«ãªããžã§ã¯ãã1ã€ããå Žåã¯ããããéžæããŸãã
- éžæãããã¹ãã®å Žåãããã䜿çšããŠã³ã³ãããååŸããŸãã
ä»ã®ãã©ãŠã¶ãŒã§äœ¿çšãããAPIã¯æ¯èŒçåçŽã§ãã
function w3_getContaining(editWindow, filter) { var range = editWindow.getSelection().getRangeAt(0);
次ã®ããã«æ©èœããŸãã
- APIã§ã¯è€æ°éžæãå¯èœã§ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯1ã€ããéžæã§ããªããããæåã®å¯äžã®ç¯å²ã®ã¿ãèæ
®ããŸãã
- ãã®ã¡ãœããã¯ãçŸåšã®éžæãå«ãèŠçŽ ãååŸããŸãã
getAncestoré¢æ°ã¯åçŽã§ã-æ¢ããŠãããã®ãèŠã€ãããŸã§ããŸãã¯éå±€ã®æäžéšã«å°éãããŸã§èŠçŽ ã®éå±€ãäžã«ç§»åããŸãããã®å Žåãnullãè¿ããŸãã
function getAncestor(elem, filter) { while (elem.tagName!="BODY") { if (filter(elem)) return elem; elem = elem.parentNode; } return null; }
å€ãã®å€ãåãã³ãã³ã
ãã©ã³ãããµã€ãºã®éžæãªã©ã®èŠçŽ ã®ç·šéã§ã¯ããŠãŒã¶ãŒãå€ã«å¯ŸããŠããã€ãã®ãªãã·ã§ã³ãéžæã§ãããããè¥å¹²ç°ãªãã¢ãããŒããå¿
èŠã§ãã ãããå®è£
ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ã以åã®ããã«ããã¿ã³ã®ä»£ããã«ããããããŠã³ãªã¹ãã䜿çšããŸããã ããã«ãCommandãªããžã§ã¯ããšControllerãªããžã§ã¯ããæžãæããŠããã€ããªç¶æ
ã ãã§ãªãå€ãã®å€ãæäœã§ããããã«ããå¿
èŠããããŸãããã©ã³ããéžæããããã®HTMLã³ãŒãã次ã«ç€ºããŸãã
<select id="fontSelector"> <option value="">Default</option> <option value="Courier">Courier</option> <option value="Verdana">Verdana</option> <option value="Georgia">Georgia</option> </select>
ã³ãã³ããªããžã§ã¯ãã¯ãæšæºã®FontNameã³ãã³ãã®ã¢ããªã³ã§ãããããäŸç¶ãšããŠã·ã³ãã«ã§ãã
function ValueCommand(command, editDoc) { this.execute = function(value) { editDoc.execCommand(command, false, value); }; this.queryValue = function() { return editDoc.queryCommandValue(command) }; }
ValueCommandãšåè¿°ã®ãã€ããªç¶æ
ã³ãã³ãã®éãã¯ãçŸåšã®å€ãæååãšããŠè¿ãqueryValueã¡ãœããã§ãã ãŠãŒã¶ãŒãããããããŠã³ãªã¹ãããå€ãéžæãããšãã³ã³ãããŒã©ãŒãã³ãã³ããå®è¡ããŸãã
function ValueSelectorController(command, elem) { this.updateUI = function() { var value = command.queryValue(); elem.value = value; } bindEvent(elem, "change", function(evt) { editWindow.focus(); command.execute(elem.value); updateToolbar(); }); }
ããããããŠã³ãªã¹ãã®å€ãã³ãã³ãã®å€ãšããŠçŽæ¥äœ¿çšãããããã³ã³ãããŒã©ãŒã¯éåžžã«åçŽã§ãããã©ã³ããµã€ãºã®ããããããŠã³ãªã¹ãã¯åãããã«æ©èœããŸããçµã¿èŸŒã¿ã®FontSizeã³ãã³ãã䜿çšãã䜿çšå¯èœãªå€ãšããŠ1ã7ã®ãµã€ãºã䜿çšããŸãã
ã«ã¹ã¿ã ããŒã
ãããŸã§ãæšæºã®çµã¿èŸŒã¿ã³ãã³ãã䜿çšããŠHTMLã«ãã¹ãŠã®å€æŽãå ããŠããŸããã ãã ããçµã¿èŸŒã¿ã³ãã³ãã§ã¯äžå¯èœãªããã«ãHTMLãå€æŽããå¿
èŠãããå ŽåããããŸãã ãã®å ŽåãDOMãšRange APIã䜿çšããŸãäŸãšããŠãå
¥åãã€ã³ãã«HTMLãè¿œå ããã³ãã³ããäœæããŸãã ç©äºãã·ã³ãã«ã«ä¿ã€ããã«ãããã¯åã«ãHello Worldããšããããã¹ãã®ã¹ãã³ã«ãªããŸãã ãã ããä»ã®HTMLã貌ãä»ããŠå
¥åããå Žåã®ã¢ãããŒãã¯å€ãããŸãããã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
function HelloWorldCommand() { this.execute = function() { var elem = editWindow.document.createElement("SPAN"); elem.style.backgroundColor = "red"; elem.innerHTML = "Hello world!"; overwriteWithNode(elem); } this.queryState = function() { return false; } }
çŸåšã®å
¥åãã€ã³ãã«èŠçŽ ãæ¿å
¥ãããoverwriteWithNodeé¢æ°ã®ããŒã¯ã³ã ïŒã¡ãœããã®ååã¯ã空ã§ãªãéžæãããå Žåããã®å
容ãäžæžããããããšã瀺ããŸãïŒã IEãšDOMç¯å²æšæºããµããŒããããã©ãŠã¶ãšã®éã®DOMã®éãã«ãããæ¹æ³ã®é©çšæ¹æ³ãç°ãªããŸãããŸããDOMç¯å²ã§åäœããããŒãžã§ã³ãèããŠã¿ãŸãããã
function w3_overwriteWithNode(node) { var rng = editWindow.getSelection().getRangeAt(0); rng.deleteContents(); if (isTextNode(rng.startContainer)) { var refNode = rightPart(rng.startContainer, rng.startOffset) refNode.parentNode.insertBefore(node, refNode); } else { var refNode = rng.startContainer.childNodes[rng.startOffset]; rng.startContainer.insertBefore(node, refNode); } }
range.deleteContentsã¯ããã®ååã«åŸã£ãŠãéžæå
容ãçž®éããŠããªãå Žåããã®å
容ãåé€ããŸãã ïŒéžæãçž®éããŠããå Žåã¯ãäœãããŸããïŒã DOM Rangeãªããžã§ã¯ãã«ã¯ãDOMã§ãšã³ããªãã€ã³ããå®çŸ©ã§ããããããã£ããããŸããstartContainerã¯ãšã³ããªãã€ã³ããå«ãããŒãã§ãstartOffsetã¯èŠªããŒãã®ãšã³ããªãã€ã³ãã®äœçœ®ã瀺ãçªå·ã§ãã ããšãã°ãstartContainerãèŠçŽ ã§startOffsetã3ã®å Žåããšã³ããªãã€ã³ãã¯èŠçŽ ã®3çªç®ãš4çªç®ã®åã®éã«ãããŸãã startContainerãããã¹ãããŒãã®å ŽåãstartOffsetã¯èŠªã®å
é ããã®æåã®ãªãã»ãããæå³ããŸãã ããšãã°ãstartOffsetã3ã®å Žåããšã³ããªãã€ã³ãã3çªç®ãš4çªç®ã®æåã®éã«ããããšãæå³ããŸãã
åæ§ã«endContainerãšendOffsetã¯ãéžæã®çµäºã瀺ããŸãã éžæã空ïŒçž®éïŒã®å ŽåãstartContainerããã³startOffsetãšåãå€ã«ãªããŸãã
ãšã³ããªãã€ã³ããããã¹ãããŒãå
ã«ããå Žåã2ã€ã®ããŒãã«ããŒã¿ãæ¿å
¥ã§ããããã«2ã€ã«åå²ããå¿
èŠããããŸãã rightPartã¯ãŸãã«ãããè¡ãé¢æ°ã§ã-ããã¹ãããŒãã2ã€ã®ããŒãã«åå²ãããã®å³åŽã®éšåãè¿ããŸãã ãã®åŸãinsertBeforeã䜿çšããŠãç®çã®ãã€ã³ãã«æ°ããããŒããæ¿å
¥ã§ããŸãIEã®ããŒãžã§ã³ã¯å°ãè€éã§ãã IEã§ã¯ãRangeãªããžã§ã¯ãã¯DOMå
ã®å
¥åãã€ã³ãã®äœçœ®ã«é¢ããæ
å ±ãžã®ã¢ã¯ã»ã¹ãæäŸããŸããã ãã1ã€ã®åé¡ã¯ãpasteHTMLã¡ãœããã䜿çšããŠã®ã¿ããŒã¿ãæ¿å
¥ã§ããããšã§ãããã®ã¡ãœããã¯ãDOMããŒãã®ããªãŒã§ã¯ãªããæååãšããŠHTMLãåãåããŸãã äžè¬çã«ãIE Range APIã¯DOM APIããå®å
šã«åé¢ãããŠããŸãïŒ ãã ããDOM APIãšIEç¯å²APIãå
±æã§ããããªãã¯ããããŸããpasteHTMLã䜿çšããŠãããŒã«ãŒèŠçŽ ãäžæã®IDã§æ¿å
¥ããDOMå
ã®ç®çã®ãšã³ããªãã€ã³ããèŠã€ããŸãã
function ie_overwriteWithNode(node) { var range = editWindow.document.selection.createRange(); var marker = writeMarkerNode(range); marker.appendChild(node); marker.removeNode();
ããŒã«ãŒããŒãã¯ãçµäºåŸã«åé€ãããããšã«æ³šæããŠãã ããã ããã¯ãHTMLã³ãŒããä¹±éã«ãªããªãããã«ããããã«å¿
èŠã§ãããéžæãã€ã³ãã«ä»»æã®HTMLãæ¿å
¥ããã³ãã³ãããããŸãã ã³ã³ãããŒã«ããã«ã®ãã¿ã³ãšToggleCommandControlleré¢æ°ã䜿çšããŠããã®ã¢ã¯ã·ã§ã³ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«é¢é£ä»ããŸããã
çµè«
ãã®èšäºã§ã¯ãHTMLãšãã£ã¿ãŒãäœæããããã®åçŽãªãã¬ãŒã ã¯ãŒã¯ã«æ³šç®ããŸããã ãã®ã³ãŒãã¯ãããè€éãªãšãã£ã¿ãŒãéçºããããã®ãã³ãã¬ãŒããšããŠäœ¿çšã§ããŸãã