Без учета текстовых полей (из-за FF так и не получилось с их учетом сделать):
if (window.getSelection) {
var elem = document.createElement('div'), sel = getSelection(), i = 0, l = sel.rangeCount;
while (i < l) {
elem.appendChild(sel.getRangeAt(i++).cloneContents());
}
return elem.innerHTML;
}
return document.selection.createRange().htmlText;