首先的光標位置,這類似於這些:保持CONTENTEDITABLE DIV
Editing Iframe Content in IE - problem in maintaining text selection
How to get caret position within contenteditable div with html child elements?
基本上,我正在寫類似於Twitter的新的鳴叫編輯器的東西。在div
的內部設置contentEditable
,我正在解析文本。當我發現我認爲是一個URL,我剝文本並進入格內的<a>
標記(go to www.google.com
如輸入的消息成爲Go to <a href='..'>www.google.com</a>
。但是,當我這樣做,插入符位置將丟失。
使用@ Tim-Down在其他SO帖子中的建議只有在你不編輯DOM時纔會起作用(正如他所說的那樣)我正在編輯DOM,所以插入符的位置丟失了
是這樣嗎?可能的(理想情況下,不使用參考Rangy庫)通過在當前代碼上工作來實現此目的。
我現在擁有的代碼(來自其他SO帖子):
var saveSelection, restoreSelection;
if (window.getSelection) {
// IE 9 and non-IE
saveSelection = function(win) {
var sel = win.getSelection(), ranges = [];
if (sel.rangeCount) {
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
ranges.push(sel.getRangeAt(i));
}
}
return ranges;
};
restoreSelection = function(win, savedSelection) {
var sel = win.getSelection();
sel.removeAllRanges();
for (var i = 0, len = savedSelection.length; i < len; ++i) {
sel.addRange(savedSelection[i]);
}
};
} else if (document.selection && document.selection.createRange) {
// IE <= 8
saveSelection = function(win) {
var sel = win.document.selection;
return (sel.type != "None") ? sel.createRange() : null;
};
restoreSelection = function(win, savedSelection) {
if (savedSelection) {
savedSelection.select();
}
};
}
我用它是這樣的:
$('div').on('keyup paste', function(e) {
var ranges = saveSelection(window);
var newContent = /* Get the new HTML content */;
$('div').html(newContent);
restoreSelection(window, ranges);
});
這是完美的(第一個環節做的工作) – 2013-04-25 08:19:13
剛剛發現了這個解決方案的一個錯誤。所有的作品,但如果你在div中輸入新的一行,遊標將被重新放在前一行(可能是因爲輸入的div)。 – 2013-04-25 09:11:46
@MattRoberts:是的。這種方法存在侷限性,僅基於文本節點,因此不考慮'
'和塊元素暗示的換行符。 – 2013-04-25 09:13:17