FCKeditorで改行をすると、Firefoxの場合、すなおにbrタグを挿入してくれるのだが、IEの場合、pタグが挿入されてしまう。
これは、IEの編集機能の仕様だ。どういうルールでブロック化するかもはっきりしないし、レイアウト上困ってしまう。
これをFirefoxと同じ挙動にするには、IEが編集モードでもonkeydownイベントを検出できることを利用して、Enterが押されたら強制的にbrタグを挿入してonkeydownイベントをキャンセルする。
ひょっとしてFCKeditorで実装済みか?と思ってソースを検索すると…
fckeditor/editor/_source/internals/fck_1_ie.js
... function Doc_OnKeyDown() { var e = FCK.EditorWindow.event ; switch ( e.keyCode ) { case 13 : // ENTER if ( FCKConfig.UseBROnCarriageReturn && !(e.ctrlKey || e.altKey || e.shiftKey) ) { Doc_OnKeyDownUndo() ; // We must ignore it if we are inside a List. if ( FCK.EditorDocument.queryCommandState( 'InsertOrderedList' ) || FCK.EditorDocument.queryCommandState( 'InsertUnorderedList' ) ) return true ; // Insert the <BR> (The must be also inserted to make it work) FCK.InsertHtml( '<br> ' ) ; // Remove the var oRange = FCK.EditorDocument.selection.createRange() ; oRange.moveStart( 'character', -1 ) ; oRange.select() ; FCK.EditorDocument.selection.clear() ; return false ; } break ; case 8 : // BACKSPACE // We must delete a control selection by code and cancels the // keystroke, otherwise IE will execute the browser's "back" button. if ( FCKSelection.GetType() == 'Control' ) { FCKSelection.Delete() ; return false ; } break ; case 9 : // TAB if ( FCKConfig.TabSpaces > 0 && !(e.ctrlKey || e.altKey || e.shiftKey) ) { Doc_OnKeyDownUndo() ; FCK.InsertHtml( window.FCKTabHTML ) ; return false ; } break ; case 90 : // Z if ( e.ctrlKey && !(e.altKey || e.shiftKey) ) { FCKUndo.Undo() ; return false ; } break ; case 89 : // Y if ( e.ctrlKey && !(e.altKey || e.shiftKey) ) { FCKUndo.Redo() ; return false ; } break ; } if ( !( e.keyCode >=16 && e.keyCode <= 18 ) ) Doc_OnKeyDownUndo() ; return true ; } ...
実装されていました!しかも設定可能になっています。
と、いうことで、IEの迷惑な仕様を回避するには、以下の設定を追加すればよい。
FCKConfig.UseBROnCarriageReturn = true ; // IE only.