javascript - 在不引起页面刷新的情况下设置URL参数

标签 javascript jquery url query-string html5-history

如何使用 History.pushState() 设置 URL 参数以避免浏览器刷新?如果没有简单的 JS 解决方案,是否已经有流行的 jQuery 库或内置函数?

这是一个相关的 SO 问题,其中接受的答案根据评论和我的测试实际上不起作用(它删除查询字符串而不是更新值):history.pushState() change query values

为了清楚起见,我指的是查询字符串中的 URL 参数: http://google.com/page?name=don 这样我们就可以将 don 更改为 tim 而不会导致重新加载。

这里是 one possible solution我发现。但是,我对使用只有 2 个关注者的 JS 库感到紧张:P

最佳答案

您可以只使用下面小型库中的 queryString.push('my_param_key', 'some_new_value')

它将使用 history.push 更新您的 URL 参数,因此浏览器不会刷新。

它只会影响您要更改的参数,不会影响路径和其他参数。

/*!
    query-string
    Parse and stringify URL query strings
    https://github.com/sindresorhus/query-string
    by Sindre Sorhus
    MIT License
*/
(function () {
    'use strict';
    var queryString = {};

    queryString.parse = function (str) {
        if (typeof str !== 'string') {
            return {};
        }

        str = str.trim().replace(/^\?/, '');

        if (!str) {
            return {};
        }

        return str.trim().split('&').reduce(function (ret, param) {
            var parts = param.replace(/\+/g, ' ').split('=');
            var key = parts[0];
            var val = parts[1];

            key = decodeURIComponent(key);
            // missing `=` should be `null`:
            // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
            val = val === undefined ? null : decodeURIComponent(val);

            if (!ret.hasOwnProperty(key)) {
                ret[key] = val;
            } else if (Array.isArray(ret[key])) {
                ret[key].push(val);
            } else {
                ret[key] = [ret[key], val];
            }

            return ret;
        }, {});
    };

    queryString.stringify = function (obj) {
        return obj ? Object.keys(obj).map(function (key) {
            var val = obj[key];

            if (Array.isArray(val)) {
                return val.map(function (val2) {
                    return encodeURIComponent(key) + '=' + encodeURIComponent(val2);
                }).join('&');
            }

            return encodeURIComponent(key) + '=' + encodeURIComponent(val);
        }).join('&') : '';
    };

    queryString.push = function (key, new_value) {
    var params = queryString.parse(location.search);
    params[key] = new_value;
    var new_params_string = queryString.stringify(params)
    history.pushState({}, "", window.location.pathname + '?' + new_params_string);
  }

    if (typeof module !== 'undefined' && module.exports) {
        module.exports = queryString;
    } else {
        window.queryString = queryString;
    }
})();

关于javascript - 在不引起页面刷新的情况下设置URL参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258793/

相关文章:

javascript - 如何在 JavaScript 中编写一个表达式来调用数组中的函数?

javascript - 在服务中对列表数组进行排序后, Angular 列表组件未更新

javascript - Codeigniter 2 - 插入表会创建重复项

android webview 打不开url 但手机浏览器可以打开

php - php 中超过 4095 个字符的长 URL

javascript - 从相等的元素创建 double 组

javascript - 是 (":focus")总是返回 true

javascript - jQuery.extend(true, …) 的逆函数

Symfony 2 中的 jQuery 地址

javascript - 语法错误 : Unexpected token => Nodejs