このウェブサイトhttp://dekho.com.pk/ads-in-lahoreのようにリダイレクトせずにURLを変更する方法を知りたいのですが 、タブをクリックするとURLが変更されますが、ページは完全に再読み込みされます。それが不可能であることを示すstackoverflowに関する他の質問がありますが、私は上記のウェブサイトがそれをどのように実装したか知りたいです。ありがとう
質問する
115428 次
2 に答える
212
使用pushState
:
window.history.pushState("", "", '/newpage');
于 2012-09-16T11:10:45.080 に答える
10
彼らが何を使用しているかを正確に知りたい場合は、Backbone.jsです(行4574
とを参照4981
)。ここではすべてjQueryソースと混同されていますが、これらは注釈付きのBackbone.Router
ソースドキュメントページの関連行です。
サポートチェック:
this._wantsPushState = !!this.options.pushState;
this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState);
route
機能:
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;
},
ハッシュ状態とプッシュ状態のどちらを選択するか:
// 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リンクをお読みください。非常に有益です。
于 2012-09-16T11:53:34.810 に答える