С этим всё сложно и мерзко, лучше не лезть в такое и юзать готовые решения с тысячей уже выстраданных другими костылей.)
Для firefox это выглядит так:
<script>window.addEventListener('click',function(e){
if(document.body.lastElementChild === e.target) return;
document.body.lastElementChild.innerHTML =
'<br>parentNode: ' + e.rangeParent.parentNode.tagName +
'<br>nodeText: ' + e.rangeParent.data +
'<br>textOffset: ' + e.rangeOffset;
},false)
</script>
<div>"Я пытаюсь написать свой редактор для кода и всё ради этого."</div>
<div>"Но скрипт работает <b>через раз</b>, а в строках с большими буквами вообще не работает"</div>
<div style="color:#600"></div>