contenteditable=onのキャレット位置に改行を挿入するjavascript

XML文書の改行コードは0x0A(\r)とすることが勧められている って知らんかったー!

ということで、キャレット位置に<BR>と\rを挿入し、

<BR>と\rの間にキャレット位置を移動するスクリプトを書いてみました。

jquery拡張です。

        $.fn.extend({
                insertBR: function() {
                        if (jQuery.browser.msie) {

                                sel = document.selection;
                                range = sel.createRange();
                                range.pasteHTML("<br>");
                                range.select();
                        } else {
                                sel = window.getSelection();
                                range = sel.getRangeAt(0);
                                text = document.createTextNode("\r");
                                range.insertNode(text);
                                node = $("<br>").get(0);
                                range.insertNode(node);
                                range.setStartAfter(node);
                                range.setEndAfter(node);
                                sel.removeAllRanges();
                                sel.addRange(range);
                        }
                        return false;
                }
        });

\rじゃなくて\nだと動作しないよ

\r以外のコントロールコードだと、safariでおかしくなるよ

ほかのやり方もあるけど全部イマイチ

Shift+Enterイベントを発生させる→firefoxchromeのみonkeypressイベント発生

document.execcommandのinsertLineBreak→safariのみ有効

document.execcommandのinsertHTMLでBR挿入→Mozzilaで有効だが、弟ノードが存在しないと挙動がおかしい