【问题标题】:Show/ hide divs based on URL Parameter根据 URL 参数显示/隐藏 div
【发布时间】:2019-09-09 16:15:07
【问题描述】:

下面的代码显示和隐藏基于 URL 参数的 div。但是,URL 参数将显示多个项目,而不仅仅是一个(苹果、橙子)。使用不起作用的当前代码。它不会显示任何内容。相反,我需要它显示它是否包含“苹果”,然后显示苹果 div。如果它包括“橙子”,也显示橙子。这个超出了我的范围,我需要一些帮助来配置它。提前感谢您的帮助!

我使用的脚本如下。就像我说的,我将使用的 URL 参数将是“apples, oranges,bananas”的变体

<script type="text/javascript">
    // Parse the URL parameter
    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, "\\$&");
        var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, " "));
    }
    // Give the parameter a variable name
    var dynamicContent = getParameterByName('dc');

     $(document).ready(function() {

        // Check if the URL parameter is apples
        if (dynamicContent == 'apples') {
            $('#apples').show();
        } 
        // Check if the URL parameter is oranges
        else if (dynamicContent == 'oranges') {
            $('#oranges').show();
        } 
        // Check if the URL parameter is bananas
        else if (dynamicContent == 'bananas') {
            $('#bananas').show();
        } 
        // Check if the URL parmeter is empty or not defined, display default content
        else {
            $('#default-content').show();
        }
    });
</script>

【问题讨论】:

  • 为了确保我理解 - 您希望它与参数的任何值一起工作,而不是硬编码为两个或三个值,如“apples”和“oranges”?
  • 您的网址是什么样的?有几种方法可以传递多个值,而在 $(document).ready 函数中解决此问题的方式取决于传递值的方式。例如,您可以使用example.com/fruits?item=apple&amp;item=orange,这不同于example.com/fruits?items=apple,orange
  • 我的网址如下所示:example.com?dc=apples,%20oranges
  • 从网络表单中,他们将能够选择在 url 中传递的三个选项。在确认页面上,我希望为 URL 中传递的每个选项(三个选项)显示一个 div。如果他们采摘香蕉,它将显示香蕉 div。如果他们采摘了香蕉和橙子,它将显示香蕉 div 和橙子 div。如果他们摘了苹果和橙子,它将只显示苹果 div 和橙子 div。
  • 更正:我的网址如下所示:example.com?dc=apples%0Aoranges

标签: javascript


【解决方案1】:
  1. 现代方式:

    新网址("http://example.com/aa/bb/")

返回一个具有主机名和路径名以及其他一些属性的对象。

第一个参数是相对或绝对 URL;如果它是相对的,那么您需要指定第二个参数(基本 URL)。例如,对于相对于当前页面的 URL:

new URL("/aa/bb/", location)

除了浏览器,这个 API 在 Node.js 从 v7 开始也可用,通过 require('url').URL

  1. 您还可以使用 Locutus 项目(原 php.js)中的 parse_url() 函数。

代码:

parse_url('http://username:password@hostname/path?arg=value#anchor');

结果:

{
  scheme: 'http',
  host: 'hostname',
  user: 'username',
  pass: 'password',
  path: '/path',
  query: 'arg=value',
  fragment: 'anchor'
}

一旦正确解析,它就应该按照您使用它的方式工作。 希望这会有所帮助..

【讨论】:

  • 哦哇哦。我认为这超出了我的想象。我不确定我明白这有什么关系
  • @WebWilliam - 这仅解决了您要解决的问题的一部分 - 这 (new URL) 是一种比 RegExp 更好的获取 URL 信息的方式您当前正在使用。然而,这个答案根本没有解决主要问题:你如何让它处理多个参数?
  • 哦,好吧。这就说得通了。谢谢
【解决方案2】:

保持代码的第一部分相同(直到 document.ready 行)以下是如何更改显示每个参数的 div 的部分:

$(document).ready(function() {
  if (dynamicContent) {
    dynamicContent.split('\n').forEach(function(param) {
      $('#' + param).show();
    });
  } else {
    $('#default-content').show();
  }
});

使用example.com/?dc=apples%0Aoranges 之类的网址,这将显示 id 为 #apples 的 div 和 id 为 #oranges 的 div

【讨论】:

  • 嘿,这对我有用,除了一个问题。 URL 不是 example.com/?dc=apples%20oranges,而是 example.com/?dc=apples%0Aoranges。不同之处在于 %0A 这是我的表单放入 URL 的内容。所以它不起作用。是否需要更改某些内容才能使其与 %0A 一起使用?
  • 是的,我编辑了我的答案来解决这个问题。基本上,URL 中的%20 表示空格(' '),%0A 表示换行('\n'),所以我更改了该字符。 @stephen-p 在他的回答中也是正确的,除了他也添加了昏迷。因此,一旦您开始使用它,也许还可以尝试使用他的(更好的)方式来获取搜索参数(不带逗号)。
  • Elian,我觉得我已经尝试了一切来实施您的解决方案,但就是无法让它发挥作用。如果我只使用一种水果,比如苹果,它会起作用,但如果是 dc=apples%0Aoranges,页面甚至都不会加载!我很抱歉为此感到痛苦,但请救救我!
  • 别担心,我知道这样的事情有多令人沮丧。首先,不管 jotform 内部发生了什么,您是否肯定它最终会将访问者引导到您在yoursite.com/?dc=apples%0Aoranges 控制的页面。 URL 是否完全一样,或者%0A 之前是否有一些逗号等。其次,当页面未加载时(我猜显示为空白)打开检查器(右键单击 -> 检查,或按 f12)并检查控制台选项卡以查看任何错误。下一个调试步骤也需要打开控制台,这就是 stephen 所描述的。
【解决方案3】:

这里的关键是如何处理 dc 参数中的多个项目。

首先,正如@Shlomo 的回答所示,有一种更好的方法来获取参数值,即使用URL 对象而不是RegExp。这会将您的 function getParameterByName(name, url) 方法更改为:

function getParameterByName(name, url) {
        let u = new URL(url);
        return u.searchParams.get('dc');
}
// try a call
let urlString = 'https://example.com?dc=apples%0Aoranges';
console.log( getParameterByName('dc', urlString) );

这非常简单,您可以取消该方法并内联它。
它给你的是字符串apples(linefeed)oranges == apples\u000Aoranges
所以你会想要拆分该字符串以获得你想要的组件:applesorangesstring.split('\n') 这会给你一个数组:["apples", "oranges"]

现在,当您在 $(document).ready(...) 中执行操作时,您将需要检查数组中的每个元素。

let urlString = 'https://example.com?dc=apples%0Aoranges';
$(document).ready(function() {
    const url = new URL(urlString)
    const dc = url.searchParams.get('dc')
    console.log(dc);
    const fruits = dc.split('\n');
    console.log(fruits);
    
    fruits.forEach(function(f) {
        // Check if the URL parameter is apples
        if (f == 'apples') {
            $('#apples').show();
        } 
        // Check if the URL parameter is oranges
        else if (f == 'oranges') {
            $('#oranges').show();
        } 
        // Check if the URL parameter is bananas
        else if (f == 'bananas') {
            $('#bananas').show();
        } 
        // Check if the URL parameter is empty or not defined, display default content
        else {
            $('#default-content').show();
        }
    });
});
.fruit {
    display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="fruit" id="default-content">No fruits have been chosen</div>
<div class="fruit" id="apples">apples</div>
<div class="fruit" id="oranges">oranges</div>
<div class="fruit" id="bananas">bananas</div>

可以对此进行更多改进,例如 urldcfruits 分配可以组合为联机,我可以编辑以显示一些改进时间允许。


编辑

我已经删除了逗号 - 您的第一条评论有逗号空格,第二条评论只是一个换行符,但我把逗号留在里面了。

正如@Elian 的回答所表明的,如果您的 id=完全与您不必费心的 dc 值匹配通过if() 测试,您可以直接在.show() 的选择器中使用dc 值——这是我暗示的改进之一。

这里的代码进行了改进,并结合了这些步骤并消除了中间变量。它还使用 Javascript ES6 arrow function 代替 forEachfunction(f) 参数:

let urlString = 'https://example.com?dc=bananas%0Aoranges';
$(document).ready(function() {
    try {
        const fruits = new URL(urlString)
                       .searchParams.get('dc')
                       .split('\n');
        console.log(fruits);
        
        fruits.forEach(f => $('#'+f).show());
    }
    // If there is no `dc` value, the .split above will cause an error.
    // Catch it and show the default content.
    catch (err) {
        $('#default-content').show();
    }
});
.fruit {
    display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="fruit" id="default-content">No fruits have been chosen</div>
<div class="fruit" id="apples">apples</div>
<div class="fruit" id="oranges">oranges</div>
<div class="fruit" id="bananas">bananas</div>

临时(可能是评论,但需要格式化)

转到您的 javascript 正在运行的页面 - 具有查询字符串 ?dc=apples%0Aoranges 的页面 ... 转到那里,但是您通常会到达那里,通过在 jotform 中执行您需要的任何操作。
在该页面上打开您的浏览器开发者工具并在您的浏览器控制台中输入以下内容:

let u = new URL(window.location.href);
let args = u.searchParams.get('dc');
let vals = [];
for (let i=0; i<args.length; i++) {
    vals.push(args.charCodeAt(i));
}

现在您有一个名为vals 的数组...只需在控制台中键入该变量名称,它应该会显示数组的内容,这将是@987654354 参数值中所有字符的数值@

vals

你应该得到一个看起来像这样的显示:

(14) [97, 112, 112, 108, 101, 115, 10, 111, 114, 97, 110, 103, 101, 115]  #in Chrome
-or-
Array(14) [ 97, 112, 112, 108, 101, 115, 10, 111, 114, 97, … ] #in Firefox

在此处使用反引号将其发布在评论中以使其成为代码。
(这个输出是当 dc === 'apples\u000Aoranges'
这将显示字符串中的 实际 个字符,以及要拆分的内容。

【讨论】:

  • 斯蒂芬,谢谢你的建议!我已经尝试实施它们几天了,但无法使其正常工作。网址example.com=bananas%0Aoranges 使用是否正确?它应该包括所有三个选项吗?另外,它应该说 ?dc= 吗?我正在努力完成这项工作,但页面无法成功加载。
  • 是的,对不起,网址应该包含?dc= ...我现在已经修好了。它包括?dc=values%0Avalues,因为我需要一个示例 URL 来显示 sn-p 工作。您可能会像在问题中那样使用window.location.href;我的const url = new URL(urlString) 会变成const url = new URL(window.location.href)。您如何处理这可能取决于 如何 您提供这些选择 - 但鉴于您的 getParameterByName 代码,我认为它是 当前 页面的 URL,以及您的调用getParameterByName('dc'); 表示参数名称为“dc”
  • 是的,就是当前页面的url。这是来自 Jotform 的确认页面。 url 的结尾会说 '?dc=apples%0Aoranges' 或这三种水果的一些变体。我仍然没有让它工作。我删除了'let urlString ='example.com?dc=bananas%0Aoranges';'这一行并按照您的建议将 'const fruits = new URL(urlString)' 替换为 'const url = new URL(window.location.href)' 。我完全错过了这里的标记吗?
  • 好的,我有一个更新,如果我在 url 中只有一个值(如苹果),它现在可以工作,但如果我添加多个如下所示:dc=apples%0Aoranges,它无法加载页面.我可能在这里缺少什么?非常感谢!
  • 值之间的 %0A 肯定是个问题
猜你喜欢
  • 2015-12-21
  • 2018-08-12
  • 2021-02-27
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多