ничего плохого в onchange содержимого div нет, хотя бы потому что div - это универсальный блок, то есть должен, по умолчанию, уметь реагировать на х-еву тучу событий, с х-я ли в каком-то с-аном input onchange есть, а в div нет
<style>
.sum {
border: solid 1px;
}
</style>
<div class='sum' contenteditable="true">write here</div>
<script>
document.querySelector(".sum").oninput = function () {
console.log(this.innerHTML);
}
</script>