change url without redirecting using javascript

This question already has an answer here:

  • Modify the URL without reloading the page 18 answers

  • 使用pushState

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

    If you want to know exactly what they using, it's Backbone.js (see lines 4574 and 4981 ). It's all mixed up in there with the jQuery source, but these are the relevant lines of the annotated Backbone.Router source documentation page:

    The support checks:

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

    The route function:

    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;
    },
    

    Choosing between hash and push states:

    // 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);
    }​
    

    More on what they're up to:

    // 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();
    

    And the coup 'd grace:

    // 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);
    }
    

    You should read the annotated Backbone.js link I provided at the top. Very informative.

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

    上一篇: 在浏览器地址栏中更改网址,无需重新加载现有页面

    下一篇: 更改网址而不使用JavaScript重定向