Эффективней всего использовать фреймворки для пользовательских интерфейсов. Например, Vue JS.
За счет реактивности вы можете подвязаться как к элементам ввода в DOM, так и к состоянию объектов в window, и отрисовывать по собственной семантике шаблонов vue не только целые формы, но и изменять состояние отдельных тегов, по изменению состояния других объектов формы или внутренней логике JS.