我將元素插入到contentEditable div中,但瀏覽器在插入元素之前設置光標的位置。是否可以在插入元素之後立即設置光標,以便用戶不必重新調整光標位置就可以繼續打字?在內容可編輯div中的插入元素之後立即設置插入符號位置
26
A
回答
28
下面的函數將做到這一點。 DOM Level 2範圍對象在大多數瀏覽器中都很容易實現。在IE中,你需要在你插入的節點後面插入一個標記元素,將選擇移動到它然後刪除它。
活生生的例子:http://jsfiddle.net/timdown/4N4ZD/
代碼:
function insertNodeAtCaret(node) {
if (typeof window.getSelection != "undefined") {
var sel = window.getSelection();
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
range.collapse(false);
range.insertNode(node);
range = range.cloneRange();
range.selectNodeContents(node);
range.collapse(false);
sel.removeAllRanges();
sel.addRange(range);
}
} else if (typeof document.selection != "undefined" && document.selection.type != "Control") {
var html = (node.nodeType == 1) ? node.outerHTML : node.data;
var id = "marker_" + ("" + Math.random()).slice(2);
html += '<span id="' + id + '"></span>';
var textRange = document.selection.createRange();
textRange.collapse(false);
textRange.pasteHTML(html);
var markerSpan = document.getElementById(id);
textRange.moveToElementText(markerSpan);
textRange.select();
markerSpan.parentNode.removeChild(markerSpan);
}
}
或者,你可以用我的Rangy library。等效代碼會有
function insertNodeAtCaret(node) {
var sel = rangy.getSelection();
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
range.collapse(false);
range.insertNode(node);
range.collapseAfter(node);
sel.setSingleRange(range);
}
}
0
如果要插入一個空div,p或跨度,我認爲需要有「東西」新創建的元素中的劫掠的範圍 - 在爲了把脫口秀放在那裏。
這是我的黑客,似乎可以在Chrome中正常工作。這個想法只是簡單地將一個臨時字符串放入元素中,然後在插入符號後將其刪除。
// Get the selection and range
var idoc = document; // (In my case it's an iframe document)
var sel = idoc.getSelection();
var range = sel.getRangeAt(0);
// Create a node to insert
var p = idoc.createElement("p"); // Could be a div, span or whatever
// Add "something" to the node.
var temp = idoc.createTextNode("anything");
p.appendChild(temp);
// -- or --
//p.innerHTML = "anything";
// Do the magic (what rangy showed above)
range.collapse(false);
range.insertNode(p);
range = range.cloneRange();
range.selectNodeContents(p);
range.collapse(false);
sel.removeAllRanges();
sel.addRange(range);
// Clear the non
p.removeChild(p.firstChild);
// -- or --
//p.innerHTML = "";
相關問題
- 1. 在內容可編輯元素中設置插入位置
- 2. 在contenteditable div中創建新元素後設置插入符號
- 3. 內容可編輯的div - 在插入/插入div後插入新的'p class'
- 4. 當插入符號在內容可編輯div中時插入html
- 5. 插入不可編輯元素後的CKEditor光標位置
- 6. 設置插入符號的位置,其中插入符號未插入JTextArea
- 7. 內容編輯DIV點擊/插入符設置
- 8. 在通過jscript編輯內容後保留插入符號位置
- 9. 在contenteditable元素中放置插入符號內的插入符號
- 10. 插入符號位置在contenteditable div
- 11. 在div內容中查找字符中的插入符號位置可用角度編輯
- 12. 插入DIV,Textbox,Textarea等內容的插入符號位置/選擇
- 13. 在可編輯JobboBox中設置插入位置
- 14. 在元素內部查找插入符號位置
- 15. 在最後位置插入子元素
- 16. 在插入位置插入文本到可編輯的IFRAME(IE)
- 17. Froala編輯器:單擊div時插入插入位置
- 18. 在Chrome/webkit中設置contenteditable div div中的插入符號位置
- 19. 將插入符號的值設置到某個位置後不能得到插入符號位置值
- 20. 如何在j2me中設置textField中的插入符號位置?
- 21. 如何在可編輯的iframe上設置插入符的位置?
- 22. 包含位置:div內的絕對元素,以便可以在前後插入一個位置:relative div
- 23. 可編輯ComboBox設置插入位置使用mvvm
- 24. 如何修改可編輯div元素的html結構更改時的選擇/插入符號位置?
- 25. 我怎樣才能在可編輯div中存儲插入符的位置?
- 26. 在給定位置插入/刪除內容到contenteditable元素
- 27. 編輯位置插入符號時的形式啓動C#
- 28. 在可編輯div中可靠地獲取和設置光標/插入符的位置
- 29. 在ContentEditable中插入標籤之外放置插入符號
- 30. 設置插入符位置在「CONTENTEDITABLE」的div有孩子
相關:http://stackoverflow.com/questions/2920150/insert-text-at-cursor-in-a-content-editable-div – payne 2011-01-29 02:46:31
那並沒有回答我的問題。我可以將元素插入插入位置,但我需要將插入符號放在插入元素的後面。 – Elie 2011-01-29 02:48:22