yerleştirildikten hemen sonra, bir contentEditable div öğesine bir öğe ekliyorum ancak tarayıcı, imlecin yerleştirilen öğeden önce konumunu ayarlar. İmleci, eklenen elemandan hemen sonra ayarlamak mümkün mü, kullanıcı imleç konumunu tekrar ayarlamak zorunda kalmadan yazmaya devam ediyor?Yerleştirilen öğeden bir contentEditable div öğesine (
cevap
Aşağıdaki işlev bunu yapacaktır. DOM Level 2 Range nesneleri çoğu tarayıcıda bunu kolaylaştırır. IE'de, eklediğiniz düğümden sonra bir işaretleyici öğesi eklemeniz, seçimi ona taşımanız ve sonra çıkarmanız gerekir.
Canlı örnek: http://jsfiddle.net/timdown/4N4ZD/
Kodu:
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);
}
}
Alternatif olarak, benim Rangy library kullanabilirsiniz. Boş bir div, p veya yayılma ekliyorsanız eşdeğer kod
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);
}
}
Heh. Bu komik: "DOM Düzey 2 Aralığı nesneleri çoğu tarayıcıda bunu kolaylaştırır." Bunun için üç gün boyunca çeşitli başarılar deniyordum. (Biliyorum, yararlı bir yorum değil, sadece söylemek zorunda kaldı) – eon
@eon: :) Belki de şunu kabul etmeliydim: "IE <9'da gerekli olan kötü kesmeye kıyasla DOM Level 2 Range nesneleri bunu kolaylaştıracak çoğu tarayıcı. " –
Sadece metin düğümü için çalışıyor gibi görünüyordu. Bir span elemanı vererek çalıştı ve imleç açıklıktan önce biter? – user984003
olacağını, ben üzerine kapmak için aralığı için yeni oluşturulan elemanın içinde "şey" olması gerekir inanıyoruz - ve orada kafesi takmak için.
Burada, Chrome'da Tamam gibi görünen bir kesmek var. Bu fikir basitçe, elemanın içinde geçici bir dize koymak, sonra da kafanın içinde olduğunda onu çıkarmaktır.
// 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. ContentEditable div odağı içeriyorsa,
- 2. ContentEditable div üzerinde execCommand sınıfı sınıfı uygulayın
- 3. Contenteditable div içindeki tüm metinler nasıl seçilir?
- 4. contenteditable div içindeki seçili metni değiştirin
- 5. JavaScript - güncel hattın HTML alın contentEditable div
- 6. Angular2 - DOM öğesine div ekle
- 7. Contenteditable,
- 8. piksel contentEditable
- 9. HTML5 contenteditable div yalnızca düz metinleri kabul eder
- 10. Textarea contenteditable
- 11. İlk öğeden önce ve son öğeden sonra kenar aralığı yoktur
- 12. Maksimum içeriğe sahip bir div öğesine yeniden boyutlandırma
- 13. jquery son öğeden önce eklenir
- 14. Diğer içeriğin altına yerleştirilen resmin homojen olması
- 15. contentEditable benim JS koduna <code>contenteditable</code> değerini depolamak çalışıyorum
- 16. Bir contenteditable üzerinde Enter tuşuna basarak <div></div> yerine <br> yapın
- 17. contenteditable DIV'nin FF & Chrome'da bir varsayılan sınırı var - Nasıl gizlenir?
- 18. Rastgele yerleştirilen bilgileri dizeyle karşılaştırın?
- 19. contenteditable selected text kaydetmek ve geri yüklemek
- 20. Javascript - Bir öğeyi execCommand olarak contenteditable olarak nasıl değiştirebilirim? seçtiyseniz
- 21. Bir öğeden bir öğe nasıl kaldırılır?
- 22. bir div bir div dinamik
- 23. contentEditable ile bir öğe üzerinde 'sürüklenebilir' özelliğini nasıl etkinleştirebilirim?
- 24. contentEditable bir macun etkinliğini nasıl yakalayabilirsin?
- 25. Çok boyutlu bir dizideki bir öğeden maksimum değeri alın.
- 26. Alt öğeden gelen üstbilgi işleyicisini çağırarak olay bağımsız değişkeni alt öğeden geçiriliyor
- 27. Iframe üst öğeden devralınır.
- 28. Gözlemlenebilir öğeden kaldırılsınArray
- 29. Bir dom öğesine
- 30. Javascript'teki bir öğeden bir tıklama etkinliğini nasıl kaldırabilirim?
İlgili: http://stackoverflow.com/questions/2920150/insert-text-at-cursor-in-a-content-editable-div soruma cevap vermez – payne
. Öğeyi düzeltme pozisyonuna yerleştirebiliyorum, ancak yerleştirilen elemandan hemen sonra düzeltmeyi yerleştirmem gerekiyor. – Elie
Klavyede "son" (tuş kodu # 35) tuşu gibi bir dizgeyi ekledikten sonra klavye olayını simüle etmeye çalıştınız. – jnkrois