The horrible "be liberal in what you accept, be conservative in what you do" meme is the cause of this. At some point it was decided that it would be too rude to emit a compiler error on someone's junk HTML, so browsers just added hacks to make it work anyway. It has to be backwards compatible too; don't dare break behavior of an old tag that someone out there depends on. There's not much point in switching to XHTML2 with sane versioning, namespacing and extensibility if it's also going to be hacked around because no one wants their input rejected. It's hacks all the way down, by design, forever.