更改网址而不使用JavaScript重定向

这个问题在这里已经有了答案:

  • 修改网址而不重新加载页面18个答案

  • 使用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);
    

    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链接。 非常丰富。

    链接地址: http://www.djcxy.com/p/70289.html

    上一篇: change url without redirecting using javascript

    下一篇: PopUp window with no address bar