【问题标题】:Adding/Modify query string / GET variables in a url with javascript使用 javascript 在 url 中添加/修改查询字符串/GET 变量
【发布时间】:2011-11-30 05:09:45
【问题描述】:

所以我想替换 url 中的 GET 变量值,如果变量不存在,则将其添加到 url。

编辑:我这样做是针对元素 href 而不是页面当前位置..

我不擅长 javascript,但我确实知道如何很好地使用 jQuery 和 javascript 的基础知识。我确实知道如何编写正则表达式,但不知道如何使用正则表达式的 javascript 语法以及使用它的功能。

这是我目前所拥有的,它在第 3 行确实有一个错误:在 jsfiddle(或以下)上查看它:http://jsfiddle.net/MadLittleMods/C93mD/

function addParameter(url, param, value) {
    var pattern = new RegExp(param + '=(.*?);', 'gi');
    return url.replace(pattern, param + '=' + value + ';');

    alert(url);
}

【问题讨论】:

  • 注意:一旦您更改页面的 URL,浏览器就会导航到该位置,因此您只能更改一次。
  • 我可以随意更改它。我正在编辑元素 href 而不是页面。

标签: javascript variables replace get query-string


【解决方案1】:

Change URL parameters。它以更一般的方式回答您的问题(更改任何 url 参数)。答案部分有 jQuery 和常规 js 的解决方案。

看起来url.replace 应该是location.replace 但我可能是错的(该声明基于谷歌对“url.replace javascript”的快速搜索)。

【讨论】:

【解决方案2】:

不需要在这个上使用 jQuery。正则表达式和字符串函数就足够了。请参阅下面的注释代码:

function addParameter(url, param, value) {
    // Using a positive lookahead (?=\=) to find the
    // given parameter, preceded by a ? or &, and followed
    // by a = with a value after than (using a non-greedy selector)
    // and then followed by a & or the end of the string
    var val = new RegExp('(\\?|\\&)' + param + '=.*?(?=(&|$))'),
        parts = url.toString().split('#'),
        url = parts[0],
        hash = parts[1]
        qstring = /\?.+$/,
        newURL = url;

    // Check if the parameter exists
    if (val.test(url))
    {
        // if it does, replace it, using the captured group
        // to determine & or ? at the beginning
        newURL = url.replace(val, '$1' + param + '=' + value);
    }
    else if (qstring.test(url))
    {
        // otherwise, if there is a query string at all
        // add the param to the end of it
        newURL = url + '&' + param + '=' + value;
    }
    else
    {
        // if there's no query string, add one
        newURL = url + '?' + param + '=' + value;
    }

    if (hash)
    {
        newURL += '#' + hash;
    }

    return newURL;
}

这里是the Fiddle

更新:

代码现在处理 URL 上有哈希的情况。

编辑

错过了一个案例!代码现在检查是否有查询字符串at all

【讨论】:

  • 更新并为这个小提琴添加了读取功能。我用 (;|&|$) 代替了你的 (&|$) -- jsfiddle.net/MadLittleMods/4Pz8h
  • 用 [\\?&] 代替 (\\?|\\&) 怎么样
  • 对于任何寻找替代方案的人,这是我最喜欢的解决方案:stackoverflow.com/questions/5999118/…
  • 不处理 url 上的哈希
  • 这段代码看起来是一个很好的例子,说明了为什么你应该闭嘴并使用 jQuery。在随机发现新错误时进行了无数次编辑,花费了不知道多少开发人员的时间,而我们仍然甚至不知道它是否真的有效。 jQuery 很重,因为它已经经历了这个过程。任何雅虎都可以“为 X 编写一个更快的函数”,但它不起作用,因为它们忽略了导致错误的数百万个极端情况。我们甚至还没有谈论 javascript 本身 使这变得困难的方式。
【解决方案3】:

我会使用 this 小而完整的库来处理 js 中的 url:

https://github.com/Mikhus/jsurl

【讨论】:

    【解决方案4】:
    <script type="text/javascript">
        $(document).ready(function () {
            $('input.letter').click(function () {
                //0- prepare values
                var qsTargeted = 'letter=' + this.value; //"letter=A";
                var windowUrl = '';
                var qskey = qsTargeted.split('=')[0];
                var qsvalue = qsTargeted.split('=')[1];
                //1- get row url
                var originalURL = window.location.href;
                //2- get query string part, and url
                if (originalURL.split('?').length > 1) //qs is exists
                {
                    windowUrl = originalURL.split('?')[0];
                    var qs = originalURL.split('?')[1];
                    //3- get list of query strings
                    var qsArray = qs.split('&');
                    var flag = false;
                    //4- try to find query string key
                    for (var i = 0; i < qsArray.length; i++) {
                        if (qsArray[i].split('=').length > 0) {
                            if (qskey == qsArray[i].split('=')[0]) {
                                //exists key
                                qsArray[i] = qskey + '=' + qsvalue;
                                flag = true;
                                break;
                            }
                        }
                    }
                    if (!flag)//   //5- if exists modify,else add
                    {
                        qsArray.push(qsTargeted);
                    }
                    var finalQs = qsArray.join('&');
                    //6- prepare final url
                    window.location = windowUrl + '?' + finalQs;
                }
                else {
                    //6- prepare final url
                    //add query string
                    window.location = originalURL + '?' + qsTargeted;
                }
            })
        });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多