【问题标题】:IE6 and addClass() in JqueryJquery 中的 IE6 和 addClass()
【发布时间】:2010-01-06 06:52:45
【问题描述】:

这在 Jquery 中似乎不起作用

$(document).ready(function() {

    $(".navlist li").each(function() {
        var href = $(this).find("a").attr("href");


        if ($(this).find("a").attr("href") == window.location.pathname) {
           $(this).attr("class", "active"); 
        }
    });

});

在我的html中

<div id="main-navigation">
                <ul class="navlist">   
                    <li><a href="<%=ResolveUrl("~/home.aspx")%>">home</a></li>                 
                    <li><a href="<%=ResolveUrl("~/sample-templates/view-list.aspx")%>">manage sample templates</a></li>
                    <li><a href="<%=ResolveUrl("~/fractional-templates/manage.aspx")%>">manage fractional templates</a></li>
                    <li><a href="<%=ResolveUrl("~/faq.aspx")%>">faq</a></li>
                </ul>
            </div>  

在我的 CSS 中

.navlist li.active a
{
    color: #fff;
    background-color: #369;
    text-decoration: none;  
}

有什么建议吗?

我调试了js,问题是没有添加类

【问题讨论】:

    标签: jquery css internet-explorer-6


    【解决方案1】:

    这是css

    应该是

    .navlist .active a:link, .active a:visited, .active a:visited, .active a:hover{
        color: #fff;
        background-color: #369;
        text-decoration: none;  
    }
    

    而不是

    .navlist li.active a
    {
        color: #fff;
        background-color: #369;
        text-decoration: none;  
    }
    

    【讨论】:

    • :-) 有趣的是你花了那么多时间看错方向
    • 授予,我确实在这里发布了我的 CSS - 所以人们被邀请查看并指出它:)
    【解决方案2】:

    第一个选择器有效吗?你试过调试它吗?比如说,在var href=... 之前添加一些alert("i am here") 如果是,你确定比较$(this).find("a").attr("href") == window.location.pathname 是真的吗?

    也许您可以尝试“更智能”的 jQuery 选择,首先匹配所有具有所需 url 的 A 元素,然后添加类名:

    $(".navlist li a[href='" + window.location.pathname +"']").parent().attr("class", "active");
    

    编辑:命名可能有问题。由于“class”是保留字,所以必须使用“className”属性!所以,我的代码变成了:

    $(".navlist li a[href='" + window.location.pathname +"']").parent().attr("className", "active");
    

    甚至更好:

    $(".navlist li a[href='" + window.location.pathname +"']").parent().addClass("active");
    

    【讨论】:

    • 谢谢,是的,我验证了比较在应该的时候是正确的。该代码适用于 IE7,但不适用于 IE6。
    • 我刚刚尝试了您的代码,它再次适用于 IE7 而不是 IE6。
    • 所以你的意思是即使在IE6中它实际上也进入了if(..)主体,但从未设置类属性。如果将.attr("class", "active") 替换为.addClass("active") 会怎样?
    • 就是这样 - 它进入 if 语句,但不会添加类。我尝试了 addClass 和 attr 方法,都不起作用。我用谷歌搜索了它,显然 IE6 不支持 CSS2...我不是真正的浏览器专家,所以我不确定这是否是原因。但我的代码在 FF 和 IE7 中完美运行,而不是 IE6。
    • 尝试同时设置classclassName 属性。这应该可以修复 IE6(请参阅本文的 cmets:woork.blogspot.com/2008/01/…
    【解决方案3】:

    attr('href')location.pathname 进行比较并不那么可靠。 attr() 读取 JavaScript 属性,而不是 HTML 属性; href 的 JavaScript 属性通常是已解析的绝对 URI。 jQuery 试图解决一些与这种差异有关的问题,但我不知道它总是成功的。

    更可靠的是记住 HTMLAnchorElement 对象也可以用作 Location 对象,因此您可以直接比较它们的路径名:

    if (this.hostname===location.hostname && this.pathname===location.pathname)
    

    现在检查它是否是与当前页面路径相同的内部链接。它会忽略任何尾随 ?query#hash 部分。

    $(this).attr("class", "active"); 
    

    你在标题中提到的addClass绝对是更好的表达方式。

    这绝对应该在 IE6 中工作。 不会在 IE6 中起作用,这可能会让你感到困惑,虽然你可以拥有一个具有多个类的元素,但你不能在同一个元素上拥有一个具有多个类要求的 CSS 选择器,例如:

    a.mylink.active { ... }
    

    这将错误地只需要 IE6 中的 active 类。 IE6 也不支持许多其他选择器,例如 &gt; 子选择器:

    div.thing > a.action { ... }
    

    在 IE6 中永远不会匹配。

    【讨论】:

    • 谢谢,路径名比较有效,所以这不是问题。 addClass() 函数也不起作用....请阅读我的 cmets reggarding 以上。我也没有使用 2 个类 - 看看@我的代码。还有其他想法吗?
    • 实际上,$this 确实引用了一个 LI 元素,因为它在列表元素的集合上调用 each()。
    • 我刚刚尝试了这个例子,它在 IE6 中对我来说很好用。无论问题是什么,它都不在上面的代码中。我仍然怀疑 IE6 无法在样式表中解析某些内容。我们可以看到一个适合您的测试页面吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-05-27
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多