【问题标题】:How to match URL with href in jQuery?如何在jQuery中将URL与href匹配?
【发布时间】:2017-11-06 14:18:07
【问题描述】:

使用列表进行导航,如果页面 URL(减去路径后的任何内容)与列表项的 href(减去路径)。

例子:

<li><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>

当页面 URL 包含 href 的 /p/clothing/dresses/N-10635 部分时,将类“selected”应用于列表项。

到目前为止,我使用以下方法取得了部分结果:

$('.leftNav li a').each(function(){
    if(window.location.href == this.href){
        $(this).parents('li').addClass('selected');
    }
});

<ul class="leftNav">
<li><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>
<li><a href="/p/clothing/bottoms/capris/N-10764?ab=leftNav:capris">capris</a></li>
</ul>

然而,只有在 URL 与 href 完全匹配时才应用 'selected' 类 - 这意味着它必须在 href 中包含链接跟踪变量(即:?ab=leftNav:dresses) .考虑匹配“基本”URL 和 href 的方法,我尝试向列表项添加数据属性以仅匹配路径:

$('.leftNav li').each(function(){
    if(window.location.href == (this).data('left-nav-href')){
        $(this).addClass('selected');
    }
});

<ul class="leftNav">
<li data-left-nav-href="/p/clothing/dresses/N-10635"><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>
<li data-left-nav-href="/p/clothing/bottoms/capris/N-10764"><a href="/p/clothing/bottoms/capris/N-10764?ab=leftNav:capris">capris</a></li>
</ul>

我尝试使用 window.location 的变体进行此操作,包括:window.location.hrefwindow.location.href.pathnamewindow.location.href.indexOfwindow.location.href.startsWith。由于这不起作用,我搜索了一种方法来匹配 URL 和 href 的路径,而不管其他参数或变量如何,但我能找到的只是匹配 URL 和 href 的具体方法 with 字符串或参数.我能找到的仅匹配 URL 或 href 的一部分的所有实例都使用“拆分”正则表达式,这引入了我认为我的使用不需要的另一个级别的复杂性。我错过了一个更简单的解决方案吗?

【问题讨论】:

  • 请解释否决票以帮助我们改进。谢谢。
  • 这里也一样 .. 有人否决了我的答案 我不知道为什么 .. 不管 ..@paulmz 我用示例更新了我的代码 .. 检查它
  • Mohamed-Yousef 和 Vinas 的答案似乎都能正常工作。在标记正确答案之前,我将与他们一起工作一天。谢谢!
  • 我仍在测试 Mohamed-Yousef 和 Vinas 的答案。我没有看到使用这两个版本的任何负面影响。由于性能和输出看起来相同,我倾向于 Vinas 的答案只是因为它少了一行代码。但是,如果有人能描述为什么一个版本可能比另一个版本更有益,那么在标记正确答案之前,我愿意接受建议。

标签: javascript jquery html url href


【解决方案1】:

你可以使用indexOf()

$(document).ready(function () {
    $('.leftNav li a').each(function(){
        var ThisHref = ($(this).attr('href').split('?'))[0];
        if(window.location.href.indexOf(ThisHref) > -1) {
            $(this).closest('li').addClass('selected');
        }
   });
});

示例

var url = "http://www.website.com/index/p/clothing/bottoms/capris/N-10764?ab=leftNav:capris";

$(document).ready(function () {
    $('.leftNav li a').each(function(){
        var ThisHref = ($(this).attr('href').split('?'))[0];
        //alert(ThisHref);
        if(url.indexOf(ThisHref) > -1) {
            $(this).closest('li').addClass('selected');
        }
   });
});
.selected{
  background : red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="leftNav">
<li><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>
<li><a href="/p/clothing/bottoms/capris/N-10764?ab=leftNav:capris">capris</a></li>
</ul>

解释

$(document).ready(function () {  // run the code after document is ready
    $('.leftNav li a').each(function(){ // loop through <a> on <li>
       // $(this).attr('href') will return href as string .. in your case will return something like '/p/clothing/dresses/N-10635?ab=leftNav:dresses'
       // using .split('?') to separating this href string by '?'
       // [0] get the first string after split (in this case it will be '/p/clothing/dresses/N-10635')
       // combine all of those steps on just one line
       var ThisHref = ($(this).attr('href').split('?'))[0];
       // get the 'window.location.href' which is return your url ..something like 'http://www.website.com/index/p/clothing/bottoms/capris/N-10764?ab=leftNav:capris'
       // try to find (first string after split) into (url/window.location.href)
       if(window.location.href.indexOf(ThisHref) > -1) { // if the url contains the first string after split addClass
          $(this).closest('li').addClass('selected'); 
       }
    });
}); 

你可以阅读.split() here

注意:在维纳斯的回答中,他使用 this.href 将返回 href 为 string .. 在你的情况下会返回类似 '/p/clothing/dresses/N-10635?ab=leftNav:dresses' 他使用 location.pathnameindexOf()的代码他试图找到location.pathname 进入href

附加在你的情况下我的答案和维纳斯的答案都可以。这不取决于代码,它取决于您的情况和您正在尝试做的事情.. 像.hide(0) , .slideUp(0) , fadeOut(0) 所有这些都以相同的效果隐藏元素.. 所以代码总是由您使用的情况决定.. 可能是我的代码,甚至维纳斯的代码在其他情况下都不起作用

【讨论】:

  • 我会做 == 0 而不是 > -1,但您的解决方案确实回答了这个问题
  • 这似乎只与我在 OP 中的第一次尝试相同,它只匹配整个 URL。导航到 /p/clothing/dresses/N-10635?ab=leftNav:dresses 会将类添加到列表项,但导航到 URL 的任何其他变体,例如 /p没有 ?ab=leftNav:dresses 的 /clothing/dresses/N-10635 不会触发匹配。
  • 聪明的方法。我认为在“?”之后剥离所有内容来自ThisHref 将使它工作。
  • @Mohamed-Yousef 更新后的示例确实有效,但我认为 .split 是正则表达式?对我需要匹配的少量 href 使用 RegEx 是否过度杀伤?
  • @paulmz 了解indexOf() **
【解决方案2】:

我想如果你保持你的 html 喜欢

<li><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>

但将比较更改为:

$('.leftNav li a').each(function(){
    if (this.href.indexOf(location.pathname) > -1) {
        $(this).parents('li').addClass('selected');
    }
});

你会得到你需要的!

上面的“if”将检查给定的路径是否包含在项目的 href 属性中。

因此,如果您的 URL 是“http://www.yourhost.com/p/clothing/dresses/N-10635?param=value”,则应该找到它的路径 (/p/clothing/dresses/N-10635),并且给定示例的输出将是:

<li class="selected"><a href="/p/clothing/dresses/N-10635?ab=leftNav:dresses">dresses</a></li>

我希望这会有所帮助! =)

【讨论】:

  • 这似乎也有效。虽然我不明白其中的区别,但我也尝试了$('.leftNav li a').each(function(){ if (this.href.indexOf(window.location.pathname) &gt; 0) { $(this).parents('li').addClass('selected'); } });,它仍然有效。有什么理由使用一个版本而不是另一个版本(window.location.pathname vs location.pathname&gt;0 vs &gt;-1)?
  • 对于“window.location”与“location”:我猜你是对的“window.location”实际上可能更好,因为它不能被覆盖。像“var location = 1;”这样的本地命令会覆盖“位置”。
  • 第二个问题:indexOf() 方法返回找到字符串的索引。与任何数组一样,它从 0 开始计数。如果我们有: var str = "this is a test";然后 console.log(str.indexOf("test")) 将打印“10”,但 console.log(str.indexOf("this")) 将打印“0”。只有当没有找到字符串时,才返回-1。
【解决方案3】:

假设没有任何“?”实际路径中的字符,您可以对位置和 href 使用类似的内容:

function getBaseURL(url) {
    return url.split('?')[0];
}

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2014-09-10
    • 2021-05-11
    • 1970-01-01
    • 2011-05-07
    • 2021-10-22
    • 2012-09-27
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多