更改url,而不使用JavaScriptredirect

我想知道如何更改url,而无需像这个网站http://dekho.com.pk/ads-in-lahoreredirect,当我们点击标签URL的变化,但页面dosent完全重载。 还有其他问题stackoverflow表明这是不可能的,但我想知道如何上述网站已经实现它。 谢谢

使用pushState

 window.history.pushState("", "", '/newpage'); 

如果你想知道他们使用的是什么,那就是Backbone.js (见45744981 )。 它们都与jQuery源代码混合在一起,但是这些是注释的Backbone.Router源代码文档页面的相关行:

支持检查 :

  this._wantsPushState = !!this.options.pushState; this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); 

routefunction:

 route: function(route, name, callback) { Backbone.history || (Backbone.history = new History); if (!_.isRegExp(route)) route = this._routeToRegExp(route); if (!callback) callback = this[name]; Backbone.history.route(route, _.bind(function(fragment) { var args = this._extractParameters(route, fragment); callback && callback.apply(this, args); this.trigger.apply(this, ['route:' + name].concat(args)); Backbone.history.trigger('route', this, name, args); }, this)); return this; }, 

在哈希和推送状态之间进行select:

 // Depending on whether we're using pushState or hashes, and whether // 'onhashchange' is supported, determine how we check the URL state. if (this._hasPushState) { Backbone.$(window).bind('popstate', this.checkUrl); } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) { Backbone.$(window).bind('hashchange', this.checkUrl); } else if (this._wantsHashChange) { this._checkUrlInterval = setInterval(this.checkUrl, this.interval); }​ 

更多关于他们到底是什么:

 // If we've started off with a route from a `pushState`-enabled browser, // but we're currently in a browser that doesn't support it... if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) { this.fragment = this.getFragment(null, true); this.location.replace(this.root + this.location.search + '#' + this.fragment); // Return immediately as browser will do redirect to new url return true; // Or if we've started out with a hash-based route, but we're currently // in a browser where it could be `pushState`-based instead... } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) { this.fragment = this.getHash().replace(routeStripper, ''); this.history.replaceState({}, document.title, this.root + this.fragment); } if (!this.options.silent) return this.loadUrl(); 

政变的恩典 :

 // If pushState is available, we use it to set the fragment as a real URL. if (this._hasPushState) { this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); } 

您应该阅读我在顶部提供的带注释的Backbone.js链接。 非常翔实。