【问题标题】:Check if URL pass variable using JavaScript使用 JavaScript 检查 URL 传递变量
【发布时间】:2013-09-25 03:55:21
【问题描述】:

如何检查 URL 是否包含变量?我有这样的功能

我的第二个问题是,假设 URL 已经传递了 lang 变量,像这样 (http://index.php?id=23&lang=en) 我希望当他们再次运行此函数时,它将 lang 变量替换为新的 on 而不是添加新的 lang像这样的变量 (http://index.php?id=23&lang=en&lang=jp)

function menu_goto(newvalue)
{
var baseurl = window.location.href ;

var langwithpara = "&lang=" + newvalue;
var langwopara = "?lang=" + newvalue;

    if (newvalue != 0) {
        if(baseurl.match(/?/)){
        alert ('123');
        location.href = baseurl + langwithpara ;
        }
        else{
        alert ('456');
        location.href = baseurl + langwopara ;
        }
    }
}

我的新编码(工作)

function menu_goto(newvalue)
{
  var baseurl = window.location.href ;
  var url = baseurl + ( (baseurl.match(/\?/))? '&':'?' ) + 'lang=' + newvalue;

  location.href = url ;
}

【问题讨论】:

    标签: javascript url variables parameters


    【解决方案1】:

    window.location 实际上是一个对象,它有一个“搜索”属性,可以更容易地解析查询字符串。

    function getParam(param){
        var qs = window.location.search.substring(1).split('&');
        var qsp;
        for (p in qs){
            qsp = qs[p].split('=');
            if (qsp[0] == param) return qsp[1]; 
        }
        return null;
    }
    

    检查特定参数:

    var value = getParam('name');
    

    【讨论】:

      【解决方案2】:

      问题可能是缺少“?”的转义。在您的正则表达式中:

      if (baseurl.match(/\?/)) { // ...
      

      稍微短一点:

      var url = baseurl + ( (baseurl.match(/\?/))? '&':'?' ) + 'lang=' + newvalue;
      

      您可能希望在之前清除任何参数“l​​ang”,这样它就不会因多次出现而变成一个数组。

      最好重新组装网址

      function menu_goto(newvalue) {
          var params = {};
          if (self.location.search) {
            var pairs = self.location.search.substring(1).split("&"); // skip the "?"
            for (var i = 0; i < pairs.length; i++) {
              var parts = pairs[i].split('=');
              params[parts[0]] = parts[1];
            }
          }
          params.lang = newvalue;
          var query = new Array();
          for (var p in params) query.push(p + '=' + params[p]);
          var url = self.location.protocol + '//' + self.location.host + self.location.pathname
                    + '?' + query.join('&');
      
          self.location.href = url;
      }
      

      这是另一个使用 RegExps 的解决方案:

      function menu_goto2(newvalue) {
          var url = self.location.href;
          url = url.replace(/#.*/, ''); // clean any hash at end
          url = url.replace(/[&\?]lang=[^&]*/, ''); // clean any param lang and its value
          // we might have had two or more params and "lang" was the first one
          // then we might have lost the "?" => replace first "&" by "?"
          if (url.indexOf('?') < 0 && url.indexOf('&') >= 0) url = url.replace(/&/, '?');
          url += ( url.match(/\?/)? '&':'?') + 'lang=' + newvalue; // add the new param lang
          self.location.href = url;
      }
      

      可以缩短为

      function menu_goto3(newvalue) {
          var url = self.location.href.replace(/#.*/, '').replace(/[&\?]lang=[^&]*/, '');
          if (url.indexOf('?') < 0 && url.indexOf('&') >= 0) url = url.replace(/&/, '?');
          url += ( url.match(/\?/)? '&':'?') + 'lang=' + newvalue;
          self.location.href = url;
      }
      

      【讨论】:

      • 我的第二个问题是,假设 URL 已经传递了 lang 变量,就像这样 (index.php?id=23&lang=en) 我希望当他们再次运行这个函数时,它将把 lang 变量替换为新的而不是像这样添加新的 lang 变量 (index.php?id=23&lang=en&lang=jp)
      • @MiszJieha 这正是第二部分的全部内容。它的作用:它获取查询字符串(在 document.location.search 中),将其成对拆分,然后将其作为键值关联存储在对象“params”中。 (所以会有 param.id == "23"、param.lang == "jp" 等)现在我们只需覆盖 "param.lang"(无论如何,如果它之前已经设置过)。然后我们通过组装基本 url 的各个部分(减去搜索部分或任何哈希标记)来组成一个干净的新 url,并将新的查询字符串添加到它(从“参数”中的键值对加入" 对象)。
      • 续 -- 它的美妙之处:一旦我们到达params.lang = newval;,您就可以设置您想要设置的任何参数或清除任何参数(例如,清除“页面”将是delete params.page)。无论是否设置了任何参数,它都可以正常工作。
      • 仅供参考,我是 javascript 新手,我只是想知道我应该把那个编码放在哪里。我在我的帖子上编辑的工作编码。我应该在 var url 之后加上什么... self.什么意思?
      • 我刚刚将代码放入了一个函数中。 self 指的是全局上下文,在浏览器中它与window 相同(但更通用一些)。在位置对象上:location.href 与其以下部分的总和相同:location.protocol(例如:“http:”)、"//"location.host(例如:“stackoverflow.com”)、@ 987654336@(例如:“/questions/18995929/...”)、location.search(例如:“?lang=en”)和location.hash(例如:“#18996039”)。 (或简称:href = protocol+"//"+host+pathname+search+hash,其中 search 是包含“?”或空的查询字符串。)
      【解决方案3】:

      您可以简单地使用indexOf() 方法

      if(window.location.href.indexOf("your value") != -1) {
           alert("It contains");
       }
       else {
          alert("Nope");
       }
      

      【讨论】:

        【解决方案4】:
        function menu_goto(newvalue)
                {
                var baseurl = window.location.href ;
                var langwithpara = "&lang=" + newvalue;
                var langwopara = "?lang=" + newvalue;
        
                    if (newvalue != 0) {
                        if(baseurl.match(/\?/)){ // change /?/ to /\?/
                        alert('123');
                        location.href = baseurl + langwithpara ;
                        }
                        else{
                        alert('456');
                        location.href = baseurl + langwopara ;
                        }
                    }
                }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 2016-11-15
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多