仅使用Javascript或JQuery更新页面中URL的一部分

时间:2014-06-07 12:47:20

标签: javascript

我需要仅使用Javascript更新链接中的日期(采用YYYY-MM-DD格式)。该页面有100个链接,但始终是相同的核心URL。查询字符串变量名称总是相同,但某些变量值会发生变化。但是日期都是一样的 - 它们需要是明天的日期,因此当页面被调用时,日期将始终是第二天。

我可以将日期移到URL查询字符串的开头或结尾,但我不愿意。

我知道document.write不是一种优雅的方式,因此请在这里寻求建议。

遗憾的是,服务器端技术不是一个选项,因此需要Javascript。

website.com/buy-ticket?from=Manchester&to=London&dateDepart=2014-08-07&dateArrive=2014-08-07 website.com/buy-ticket?from=Liverpool&to=York&dateDepart=2014-08-07&dateArrive=2014-08-07

我们安装了JQuery,如果它更容易。

2 个答案:

答案 0 :(得分:0)

试试这段代码:

  <script>
    var param1var = getQueryVariable("dateDepart");

    function getQueryVariable(variable) {
      var query = window.location.search.substring(1);
      var vars = query.split("&");
      for (var i=0;i<vars.length;i++) {
        var pair = vars[i].split("=");
        if (pair[0] == variable) {
          return pair[1];
        }
      } 
      console.log ('Query Variable ' + variable + ' was not found !');
    }
    </script>

答案 1 :(得分:0)

理想情况下,您应该执行此服务器端,因为它不依赖于您的网站的访问者启用了JavaScript。但是,正如您所说,这不是一个选项,您仍然可以使用JavaScript执行此操作。有很多方法可以实现这一点,下面是我将如何解决它:

(function () {
    "use strict";
    var parseQueryString = function parseQueryString(qs) {
            var params = qs.split('&'), // split up into individual parameter/value pairs
                kvp = []; // declare an array
            params.forEach(function (pairing, index, array) {
                var pair = pairing.split('='), // split up into key/value
                    key = pair[0], // key will always be on left side
                    value = pair[1] || ''; // value, if defined, will be on right, otherwise default to an empty string
                kvp.push({ // add to the array as an object
                    "key": key,
                    "value": value
                });
            });
            return kvp; // return the array
        },
        swapParameters = function swapParameters(kvp, params) {
            var key;
            for (key in params) { // loop through the parameters
                if (params.hasOwnProperty(key)) {
                    kvp.forEach(function (pair, index, array) { // loop through the key-value pairs
                        if (key === pair.key) { // if one of them matches the current parameter
                            pair.value = params[key]; // update the value of the pair to the new parameter value
                        }
                    });
                }
            }
            return kvp; // return the modified key-value pairs
        },
        stringifyKVP = function stringifyKVP(kvp) {
            var s = []; // declare an array
            kvp.forEach(function (pair, index, array) { // loop through the key-value pairs
                s.push('' + pair.key + '=' + pair.value); // create a string of key=value and push to the array
            });
            return s.join('&'); // use join to return the stringified key-value pairs separated with an &
        },
        padLeft = function padLeft(value, places) { // quick & dirty pad function
            var padding = Array(places - value.toString().length + 1).join('0'),
                padded = padding + value;
            return padded;
        },
        getFormattedDate = function getFormattedDate(date) { // quick & dirty format date function
            var yyyy = date.getFullYear().toString(),
                mm = padLeft(date.getMonth() + 1, 2),
                dd = padLeft(date.getDate(), 2);
            return yyyy + '-' + mm + '-' + dd;
        },
        testUrl1 = 'website.com/buy-ticket?from=Manchester&to=London&dateDepart=2014-08-07&dateArrive=2014-08-07',
        testUrl2 = 'website.com/buy-ticket?from=Liverpool&to=York&dateDepart=2014-08-07&dateArrive=2014-08-07',
        today = getFormattedDate(new Date()), // get the current date formatted as YYYY-MM-DD
        test = function test(url) { // tie it all together
            var parts = url.split('?'), // split the querystring from the url
                resource = parts[0], // host & path are always left side
                qs = parts[1], // qs is always right side, assumes qs always exists
                kvp = parseQueryString(qs), // break the qs up into key-value pairs
                newParams = swapParameters(kvp, { // swap out new values
                    "dateDepart": today,
                    "dateArrive": today
                });
            qs = stringifyKVP(newParams); // get the new querystring
            return resource + '?' + qs; // return the modified resource
        };
    console.log(test(testUrl1)); // log to console for proof of "working"
    console.log(test(testUrl2));
}());

您可以在浏览器控制台中运行此功能。

就jQuery而言,jQuery将选择a元素来处理更简单。像这样的选择器可以很好地完成这个技巧:

$('a[href^="website.com/buy-ticket?"]')

这将选择所有ahref属性以website.com/buy-ticket?开头的元素。最后的问号应该确保查询字符串存在。您可能必须修改它以包含协议:

$('a[href^="http://website.com/buy-ticket?"]')

您也可以使用Attribute Contains Selector

$('a[href*="website.com/buy-ticket?"]')

工作演示:http://jsfiddle.net/jqk27/