I'm currently building a hybrid. An app would benefit from pure javascript frontend (speed), but to honor accessibility (and SEO), I've decided to serve pages traditionally using static urls, and only if client has javascript enabled, it will take over and make page fully dynamic, updating content via ajax and address bar with history.pushState. Been considering hashbangs for a while, but that thing just doesn't feel and look right to me. Although not all browsers support pushState yet, browsers evolve pretty fast, so I expect this feature to be supported by all browsers fairly soon, no point to waste time and break the web implementing inferior solution.
You don't need to use hashbangs or fragments for this, you just implement some javascript to not visit links, but change the page with javascript, then change the url to the new one. Your links are still linkable, and you can still have dynamic pages. As for search engines, if the site is a web app, they shouldn't be indexing it.
There is no way you can change the URL (not fragments) without refreshing the page (a.k.a single page app) if the browser doesn't support history.pushState. IE doesn't. That's why people are stuck with hashbangs.
The parent's method is still the best way as long as you do it by using replaceState or pushState where available, falling back to modifying the hash. This way, if Javascript is off, links in the HTML still work. (I suspect this is what he meant too, since changing links to modify window.location via Javascript provides no practical difference.)
The parent said “You don't need to use hashbangs or fragments for this”. I'm just pointing out there is no way to _not_ use fragments and still have a single page app.
I do agree that we should probably leave IE users to reload pages and provide graceful degradation. Modern browser users will enjoy the benefit of no refreshing on single page app. However, for some, this is not an option.
One additional challenge is that POSTing a form will result in the whole page reloading by default. You will need to take this into consideration if you're supporting dynamic pages with graceful fallback.
I wonder if there's some JS library that transparently "fixes" issues like this for single-page sites with graceful degradation. Form handling, link click events, redirects, etc.
FOA, it's not a good idea to code for search engines.
Secondly, pushState is useless for single page apps. It's not all about changing the url, what's the way of handling that urls with just a single HTML document? To make index.html 404 page? What about the browser cache?