【问题标题】:Highlight selected tab using jquery function in mvc4 project在 mvc4 项目中使用 jquery 函数突出显示选定的选项卡
【发布时间】:2015-09-24 15:36:59
【问题描述】:

我想使用 jquery 'click' 事件来更改所选选项卡的类。第一个选项卡最初列为选中状态。当我更改标签时,我尝试进入点击事件,但它被跳过了。它到达函数,然后跳过它。 我的项目是 MVC4,我的 jquery 库是 1.11.3。
这是我的标记:

<header>
<div class="content-wrapper">            
    <p class="site-title">
        <img src="~/Images/logo.png" alt="" />
    </p>                        
    <nav>
        <ul id="menu" class="maintablist">
            <li class="selected">@Html.ActionLink("Home", "Index", "Home")</li>
            <li>@Html.ActionLink("About", "About", "Home")</li>
            <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
        </ul>
    </nav>              
</div>
</header>

这是我的 jquery 函数:

<script src="~/Scripts/jquery-1.11.3.js"></script>
<script>
    $("#menu li").click(function () {
        $("#menu li").removeClass("selected");
        $(this).addClass("selected");
    });
</script>

这是我的样式表内容:

.maintablist {
    list-style:none;
    height: 2em;
    padding: 0;
    margin: 0;
    border: none;
}

.maintablist li {
    float: left;
    margin-right: 0.13em;
}

.maintablist li a {
    display:block;
    padding:0 1em;
    text-decoration:none;
    border:0.06em solid #000;
    border-bottom:0;
    font:bold 0.88em/2em arial,geneva,helvetica,sans-serif;
    color:#000;
    background-color:#ccc;

    /* CSS 3 elements */
    -webkit-border-top-right-radius:0.50em;
    -webkit-border-top-left-radius:0.50em;
    -moz-border-radius-topright:0.50em;
    -moz-border-radius-topleft:0.50em;
    border-top-right-radius:0.50em;
    border-top-left-radius:0.50em;
}

.maintablist li a:hover {
    background:#b5dbb6; 
    color:#fff;
    text-decoration:none;
}

.maintablist li.selected a {
    background-color: #b5dbb6;
    color: #fff;
}

为什么无法识别点击事件?我想在客户端执行此操作,而不必去 HomeController 执行此操作。 谢谢。

更新 从 'ready' 函数中删除了 'click' 事件并删除了该类。但是该类未添加到我当前选择的选项卡中。 这是代码:

<script>
 $(".maintablist li").removeClass("selected");
 $(this).addClass("selected");
</script>

更新 使用下面的这个 jquery 函数,当单击一个选项卡时,它会从所有选项卡中删除类属性。然后显示单击的选项卡,初始选项卡具有“选定”颜色。所有选项卡都不应定义类属性,但会以某种方式将类属性重新应用到初始选项卡,但仍会显示所选选项卡。

$(document).ready(function () {
    $("#mainmenu li").click(function () {
        $("#mainmenu li").removeClass("selected").removeAttr("class");
    });   
});   

更新 我只发布了我认为需要的信息。但下面是文件中的代码,_Layout.cshtml

<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title OnCall Schedule Tool</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    <link rel="stylesheet" href="~/Content/jquery-ui.css">
    <link rel='stylesheet' href='~/Content/fullcalendar.css' />
    <link rel='stylesheet' href='~/Content/spectrum.css'>
    <script src="~/Scripts/jquery-1.11.3.js"></script>
    <script src='~/Scripts/jquery.min.js'></script>
    <script src="~/Scripts/jquery-ui.js"></script>
    <script src='~/Scripts/moment.min.js'></script>
    <script src='~/Scripts/fullcalendar.js'></script>
    <script src="~/Scripts/spectrum.js"></script>
    <script src="~/Scripts/knockout-2.2.0.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#mainmenu li").click(function () {
                $("#mainmenu li").removeClass("selected").removeAttr("class");
            });   
        });              
    </script>
</head>
<body>
    <header>
        <div class="content-wrapper">            
            <p>
                <img src="~/Images/logo.png" alt="" />
            </p>                                     
            <nav>
                <ul id="mainmenu" class="maintablist">
                    <li class="selected">@Html.ActionLink("View OnCall Schedule", "ViewSchedule", "Home")</li>
                    <li>@Html.ActionLink("Edit OnCall Schedule", "EditSchedule", "Home")</li>
                    <li>@Html.ActionLink("Admin OnCall Application", "Admin", "Home")</li>
                </ul>
            </nav>                    
        </div>
    </header>
    <div id="body">
        @RenderSection("featured", required: false)
        <section class="content-wrapper main-content">
            @RenderBody()
        </section>
    </div> 
    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts", required: false)
</body>
</html>

【问题讨论】:

    标签: jquery tabs


    【解决方案1】:

    这对我有用。感谢 Miodrag 的帮助,但 jquery 不起作用。我在另一个帖子上找到的。我正在使用 MVC4,它使用这些属性,没有 jquery。 在每个页面上,像这样在每个页面上设置 ViewBag 的 PageName 属性:

    文件顶部 EditSchedule.cshtml

    @{
        ViewBag.PageName = "EditSchedule";
    }
    

    文件顶部 ViewSchedule.cshtml

    @{
        ViewBag.PageName = "ViewSchedule";
    }
    

    文件顶部 Admin.cshtml

    @{
        ViewBag.PageName = "Admin";
    }
    

    在_Layout.cshtml中

    <nav>
        <ul id="mainmenu" class="maintablist">
            <li class="@((ViewBag.PageName == "ViewSchedule") ? "selected" : "")">@Html.ActionLink("View OnCall Schedule", "ViewSchedule", "Home")</li>
            <li class="@((ViewBag.PageName == "EditSchedule") ? "selected" : "")">@Html.ActionLink("Edit OnCall Schedule", "EditSchedule", "Home")</li>
            <li class="@((ViewBag.PageName == "Admin") ? "selected" : "")">@Html.ActionLink("Admin OnCall Application", "Admin", "Home")</li>
        </ul>
    </nav>   
    

    在定义选项卡外观的 Style.css 文件中:

    .maintablist {
        list-style:none;
        height: 2em;
        padding: 0;
        margin-top: 20px;
        margin-bottom: 0;
    }
    
    .maintablist li {
        float: left;
        margin-right: 0.13em;
    }
    
    .maintablist li a {
        display:block;
        padding:0 1em;
        text-decoration:none;
        border:0.06em solid #000;
        border-bottom:0;
        font:bold 0.88em/2em arial,geneva,helvetica,sans-serif;
        color:#000;
        background-color:#ccc;
    
        /* CSS 3 elements */
        -webkit-border-top-right-radius:0.50em;
        -webkit-border-top-left-radius:0.50em;
        -moz-border-radius-topright:0.50em;
        -moz-border-radius-topleft:0.50em;
        border-top-right-radius:0.50em;
        border-top-left-radius:0.50em;
    }
    
    .maintablist li a:hover {
        background: #b5dbb6;
        color:#fff;
        text-decoration:none;
    }
    
    .maintablist li.selected a{
        background-color: #b5dbb6;
        color: #fff;
        border-bottom: 0;
    }
    

    【讨论】:

    • 工作顺利。 +1
    【解决方案2】:

    你应该把你的javascript代码放到$(document).ready()函数中:

    <script>
        $(document).ready(function() {
            <!-- put your javascript code here -->
        });
    </script>
    

    更新

    它就在我们眼前:您还需要通过返回false来防止锚元素的默认行为导致页面刷新。

    $("#mainmenu li").click(function () {
        $(this).siblings().removeClass("selected");
        $(this).addClass("selected");
        return false;
    });
    

    另外,我不得不提到你使用了三个对 jQuery 的引用。在第一次使用之前(例如,在文档准备功能之前),它应该只有一个并且在任何地方都被引用。

    【讨论】:

    • 它仍然在跳过点击功能。我可以进入 .ready 函数,但它不会进入 click 函数。
    • 您发布的代码没有其他问题。如果您没有捕捉到单击事件,则可能意味着 jquery 选择器不正确。页面上是否还有 id="menu" 的 html 元素?
    • 没有具有该 ID 的其他元素。我将选择器更改为使用类名“maintablist”。当我从初始选项卡中选择另一个选项卡时,它最初会更改为“选定”颜色,但在页面加载后,该选项卡会变回“未选定”颜色。
    • 在多个页面之间保留状态的一个技巧是将导航放置到它们的布局中,这是一种常见的做法。如果不是这种情况,请发布另一个可能会干扰已发布的代码。
    • 我至少能够通过移除点击事件进入准备好的文档功能。这现在是有道理的,因为“就绪”事件只是初始化了一些东西。但是,该类已被删除。但我无法弄清楚如何将类添加到选定的选项卡。我在上面的“更新”下添加了我的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2014-12-21
    相关资源
    最近更新 更多