HTML5 не поддерживает тег, однако многие браузеры по-прежнему будут отображать текст «правильно», но ваш код не будет проверяться. Если это не проблема для вас, это может быть вариант.
CSS3 обладает способностью, предположительно, иметь выделенный текст, однако, поскольку любой, кто знает, как это сделать, считает, что это «плохая идея» для CSS, есть очень ограниченная информация, которую я нашел в Интернете. Даже в документах W3 недостаточно подробностей, чтобы любитель или самоучка могли их реализовать.
PHP и Perl также могут дублировать эффект. Сценарий, необходимый для этого, будет безумно сложным и потребует гораздо больше ресурсов, чем любые другие варианты. Существует также вероятность того, что сценарий будет запускаться слишком быстро в некоторых браузерах, что приведет к тому, что эффект будет полностью сведен на нет.
Итак, вернемся к JavaScript - Ваш код (OP), кажется, самый чистый, простой, самый эффективный, который я нашел. Я буду пытаться это. Для ясности, я буду искать способ ограничить пустое пространство между концом и началом, возможно, с помощью цикла while (или аналогичного) и фактически запустить два сценария, позволяя одному отдохнуть, пока другой обрабатывает.
Может также быть способ с одним изменением функции устранить пробел. Я новичок в JS, так что не знаю, с головой. - Я знаю, что это не полный ответ, но иногда идеи могут принести результаты, хотя бы для кого-то другого.