2012-03-11 36 views
0

我有一个MasterPage中的SharePoint ASPMenu,我尝试使用jQuery更改选定的样式类。基本上,当用户点击一个菜单项时,它会导致回发,这样页面将被定向到点击菜单的url。当用户点击一个菜单项时,我把这个URL放在cookie中。然后,当页面加载时,我将设置所选菜单的样式。这里是我到目前为止的代码jQuery addclass和删除类没有正确更新

$(document).ready(function() { 
LinkClicked(); 
FireMe(); 
}); 
function FireMe() 
{ 
    var val = $.cookie('sabValue'); 

    if(val !== null) 
    { 
     $(".s4-tn a").each(function(){   
      $(this).removeClass("selected").closest("li").removeClass("selected"); 
     }); 
     $(".s4-tn a[href='"+val+"']").addClass("selected").closest("li").addClass("selected");   
    }  
} 

function LinkClicked(){ 
    $(".s4-tn a").click(function() { 
     var sabValue = $(this).attr("href"); 
     $.cookie('sabValue',sabValue); 
    });   
} 

我的问题是,页面加载后(在用户点击后菜单)的变化不会发生。我必须再次单击菜单项,以便应用所选样式。

这是ASPMenu声明

<SharePoint:AspMenu 
    ID="TopNavigationMenuV4" 
    Runat="server" 
    EnableViewState="false" 
    DataSourceID="topSiteMap" 
    AccessKey="<%$Resources:wss,navigation_accesskey%>" 
    UseSimpleRendering="true" 
    UseSeparateCss="false" 
    Orientation="Horizontal" 
    StaticDisplayLevels="2" 
    MaximumDynamicDisplayLevels="2" 
    SkipLinkText="" 
    CssClass="s4-tn"/> 

这究竟是为什么。 欣赏任何帮助。 谢谢

+0

请将您生成的HTML和JS代码发布到jsfiddle.net。 ()。s4-tn a“)。each(function()...并不是最好的方法,你可以直接写$('。selected',$('。s4-tn ')).removeClass('selected'); – 2012-03-11 18:35:28

回答

1

你试过从LinkClicked里面调用FireMe()吗? :

function LinkClicked(){ 
    $(".s4-tn a").click(function() { 
     var sabValue = $(this).attr("href"); 
     $.cookie('sabValue',sabValue); 

     FireMe(); //you could pass a value here, too 
    });   
} 
+0

谢谢你试图回答,当用户点击一个菜单时,用户将被引导到被点击的页面,所以当这个页面加载时,我想将选择的类别分配给点击的菜单项。如果我在这里分配选择的类,它将会丢失,这就是为什么我使用cookie来保存点击的href值,以便稍后可以找到它并指定所选的类。是否有其他想法。谢谢 – 2012-03-12 07:47:37

+0

你仍然可以设置cookie,但事件需要触发功能,我相信。 – orolo 2012-03-12 11:52:46

1

在您的点击处理程序中没有任何东西可以改变类。你fireMe(0已经被发射在页面加载时,你可以调用Fireme()内的处理程序,但更高效的只是要添加的类别为“本”

function LinkClicked(){ 
    $(".s4-tn a").click(function() { 
     var sabValue = $(this).attr("href"); 
     $.cookie('sabValue',sabValue); 
     $(".s4-tn a.selected").removeClass("selected"); 
     $(this).addClass('selected'); 
    });   
} 
+0

感谢您尝试回答,当用户点击菜单时,用户将被引导到被点击的页面。因此,当该页面加载时,我想分配所选课程将被点击菜单项目,如果我在这里分配所选课程,它将会丢失为什么我使用cookie来保存点击的href值,以便稍后可以找到它并分配选定的类。你有什么其他的想法。谢谢 – 2012-03-12 07:04:58

+0

你可以记录值到控制台,这样你就可以比较第一次加载和第二次点击并寻找差异 – charlietfl 2012-03-12 12:42:03

2

我遇到了同样的问题试图整理一个菜单,这是我最终使用的代码,我必须提供一个cookie的路径,这样它就可以通过每个页面来使用,我也必须每次都删除cookie,因为我仍然在我的一个cookie上获取重复的cookie菜单项。

$(document).ready(function() { 
    $("#menu li").click(function() { 
     $.cookie('selectedPage', null); 
     var selectedPage = $(this).attr("id"); 
     $.cookie('selectedPage', selectedPage, { path: '/' }); 

     RemoveClass(); 
    }); 

    AddClass(); 
}); 

function RemoveClass() { 
    $("#menu li").each(function() { 
     $(this).removeClass("selected"); 
    }); 
} 

function AddClass() { 
    var selectedPage = $.cookie('selectedPage'); 

    if (selectedPage !== null) { 
     $("#menu li[id='" + selectedPage + "']").addClass("selected"); 
    } 
} 

我的菜单看起来像这样...

<ul id="menu"> 
    <li id="mm-one"><a href="#">Item One</a></li> 
    <li id="mm-two"><a href="#">Item Two</a></li> 
    <li id="mm-three"><a href="#">Item Three</a></li> 
    <li id="mm-four"><a href="#">Item Four</a></li> 
</ul>