I made a webchat with frames; an infinitely-loading top part for the text, and the bottom an input box that received 204 to not reload when you sent a message. I guess that was the most elegant way to do it in the IE4+ days.
The top part could also receive a small <script> that would reload the frame on the right, containing the user list. Fun times. Used it with a couple class mates around 2000 iirc.
I managed to get real-time chat (and other real-time colab) working on IE4+ using long polling, by continuously adding <script> tags from JavaScript. The server would delay answering until there were new messages available, or some timeout. This was even before xmlhttprequest. Who needs websocket? :-)
Sounds fancy! My solution back then was infinitely auto-updating a frame with a meta refresh tag. It would receive a new <script> block that would update the contents of other frames. This of course wouldn't give real-time functionality.
A webchat that I used to go to back in the day implemented this too. I used to spend a lot of time there - it was my Internet home for several years. I miss it terribly.