Как получить текущую позицию каретки в Редакторе iframe ?
Когда включен режим проектирования тела iframe то если мы нажмем клавишу enter то div будет добавлен к телу документа следующим образом:
<body> <div><br/></div> </body>
Что в значительной степени хорошо для моего варианта использования,поскольку я работаю над текстовым редактором с поддержкой блока кода и blockquote наряду с полужирным шрифтом,курсивом, подчеркиванием.
Мой подход к применению Blockquote и CodeBlock заключается в том, что я определил CSS и добавил бы классы к соответствующий элемент div/кода
Чтобы применить классы на div, мне нужно знать, где именно находится моя каретка . Так, например, я нахожусь в теле и добавил некоторый текст для blockquote, тогда как я могу знать, в каком дочернем элементе (div) содержится мой текст для форматирования.
Что я уже пробовал:
var editor = document.getElementById("rtf-iframe").contentWindow.document.body;
editor.document.designMode = 'On';
var editor = document.getElementById("rtf-iframe").contentWindow.document.body;
Я попробовал это сделать с помощью щелчка мыши, всякий раз, когда я нажимаю на Редактор, я могу получить позицию ребенка, щелкнутого :-
var currentLineClicked;
function setIndexOfClicked() { for (var i = 0, len = editor.children.length; i < len; i++) { (function(index){ editor.children[i].onclick = function(){ // alert(index) ; currentLineClicked =index; console.log("clicked div index is :"+currentLineClicked); } })(i); } }
После этого я могу успешно добавить класс в этот div :
function applyBlockquote(){ var currentIndex = currentLineClicked; console.log(editor.children[currentIndex]); editor.children[currentIndex].className = "bquote"; }
Но что делать, если пользователь добавляет несколько дополнительных детей в тело, нажав enter ? Я попробовал поиграть с ним. Mutationobserver'а чтобы определить, какие изменения происходят в узле, но не удалось найти, как получить текущее положение курсора/курсора ?
// Select the node that will be observed for mutations var targetNode = document.getElementById('some-id'); // Options for the observer (which mutations to observe) var config = { attributes: true, childList: true, subtree: true }; // Callback function to execute when mutations are observed var callback = function(mutationsList, observer) { for(var mutation of mutationsList) { if (mutation.type == 'childList') { console.log('A child node has been added or removed.'); } else if (mutation.type == 'attributes') { console.log('The ' + mutation.attributeName + ' attribute was modified.'); } } }; // Create an observer instance linked to the callback function var observer = new MutationObserver(callback); // Start observing the target node for configured mutations observer.observe(targetNode, config); // Later, you can stop observing observer.disconnect();
Очень близкая ссылка/пример к моей идее такова Редактор Markdown :
Я вижу, что здесь используется скрытая текстовая область.(Изображение проверяемого элемента)