jquery动态菜单

1.代码:

//Accordion Content script: By Dynamic Drive, at http://www.dynamicdrive.com
//Created: Jan 7th, 08'

var ddaccordion={
 
 contentclassname:{}, //object to store corresponding contentclass name based on headerclass

 expandone:function(headerclass, selected){ //PUBLIC function to expand a particular header
  this.toggleone(headerclass, selected, "expand")
 },

 collapseone:function(headerclass, selected){ //PUBLIC function to collapse a particular header
  this.toggleone(headerclass, selected, "collapse")
 },

 expandall:function(headerclass){ //PUBLIC function to expand all headers based on their shared CSS classname
  var $headers=$('.'+headerclass)
  $('.'+this.contentclassname[headerclass]+':hidden').each(function(){
   $headers.eq(parseInt($(this).attr('contentindex'))).click()
  })
 },

 collapseall:function(headerclass){ //PUBLIC function to collapse all headers based on their shared CSS classname
  var $headers=$('.'+headerclass)
  $('.'+this.contentclassname[headerclass]+':visible').each(function(){
   $headers.eq(parseInt($(this).attr('contentindex'))).click()
  })
 },

 toggleone:function(headerclass, selected, optstate){ //PUBLIC function to expand/ collapse a particular header
  var $targetHeader=$('.'+headerclass).eq(selected)
  var $subcontent=$('.'+this.contentclassname[headerclass]).eq(selected)
  if (typeof optstate=="undefined" || optstate=="expand" && $subcontent.is(":hidden") || optstate=="collapse" && $subcontent.is(":visible"))
   $targetHeader.click()
 },

 expandit:function($targetHeader, $targetContent, config){
  $targetContent.slideDown(config.animatespeed)
  this.transformHeader($targetHeader, config, "expand")
 },

 collapseit:function($targetHeader, $targetContent, config){
  $targetContent.slideUp(config.animatespeed)
  this.transformHeader($targetHeader, config, "collapse")
 },

 transformHeader:function($targetHeader, config, state){
  $targetHeader.addClass((state=="expand")? config.cssclass.expand : config.cssclass.collapse) //alternate btw "expand" and "collapse" CSS classes
  .removeClass((state=="expand")? config.cssclass.collapse : config.cssclass.expand)
  if (config.htmlsetting.location=='src'){ //Change header image (assuming header is an image)?
   $targetHeader=($targetHeader.is("img"))? $targetHeader : $targetHeader.find('img').eq(0) //Set target to either header itself, or first image within header
   $targetHeader.attr('src', (state=="expand")? config.htmlsetting.expand : config.htmlsetting.collapse) //change header image
  }
  else if (config.htmlsetting.location=="prefix") //if change "prefix" HTML, locate dynamically added ".accordprefix" span tag and change it
   $targetHeader.find('.accordprefix').html((state=="expand")? config.htmlsetting.expand : config.htmlsetting.collapse)
  else if (config.htmlsetting.location=="suffix")
   $targetHeader.find('.accordsuffix').html((state=="expand")? config.htmlsetting.expand : config.htmlsetting.collapse)
 },

 getCookie:function(Name){
  var re=new RegExp(Name+"=[^;]+", "i") //construct RE to search for target name/value pair
  if (document.cookie.match(re)) //if cookie found
   return document.cookie.match(re)[0].split("=")[1] //return its value
  return null
 },

 setCookie:function(name, value){
  document.cookie = name + "=" + value+";path=/";
 },
   
 init:function(config){
 //alert(ddaccordion.getCookie(config.headerclass));
 //让项的内容不可见!
 document.write('<style type="text/css">\n')
 document.write('.'+config.contentclass+'{display: none}\n') //generate CSS to hide contents
 document.write('<\/style>')
 $(document).ready(function(){
  ddaccordion.contentclassname[config.headerclass]=config.contentclass //remember contentclass name based on headerclass
  //设置样式collapse:表示展开之前的样式,expand:表示展开之后的样式;
  config.cssclass={collapse: config.toggleclass[0], expand: config.toggleclass[1]} //store expand and contract CSS classes as object properties
  //在展开前后显示的内容,location:表示显示在什么位置,collapse:表示在展开之前显示的内容,expand:表示在展开之后显示的内容;
  config.htmlsetting={location: config.togglehtml[0], collapse: config.togglehtml[1], expand: config.togglehtml[2]} //store HTML settings as object properties
  var lastexpanded={} //object to hold reference to last expanded header and content (jquery objects)获得最后展开的栏目
  var expandedindices=(config.persiststate)? ddaccordion.getCookie(config.headerclass) : config.defaultexpanded//获得所有展开的栏目
  expandedindices=(typeof expandedindices=='string')? expandedindices.replace(/c/ig, '').split(',') : config.defaultexpanded //test for valid cookie ('string'), otherwise (null, or 1st page load), default to defaultexpanded setting
  var $subcontents=$('.'+config["contentclass"])//获得展开的内容信息
  if (config["collapseprev"] && expandedindices.length>1)
   expandedindices=[expandedindices.pop()] //return last array element as an array (for sake of jQuery.inArray())
   //循环的对头进行操作
  $('.'+config["headerclass"]).each(function(index){ //loop through all headers
   if (/(prefix)|(suffix)/i.test(config.htmlsetting.location) && $(this).html()!=""){ //add a SPAN element to header depending on user setting and if header is a container tag
    $('<span class="accordprefix"></span>').prependTo(this)
    $('<span class="accordsuffix"></span>').appendTo(this)
   }
   //给头加上一个属性headerindex,值等于index+'h'
   $(this).attr('headerindex', index+'h') //store position of this header relative to its peers
   //给栏目加上一个属性contentindex,值等于index+'c'
   $subcontents.eq(index).attr('contentindex', index+'c') //store position of this content relative to its peers
   //获得具体的某个栏目项
   var $subcontent=$subcontents.eq(index)
   //判断是否显示具体的栏目
   if (jQuery.inArray(index, expandedindices)!=-1){ //check for headers that should be expanded automatically
    if (config.animatedefault==false)
     $subcontent.show()
    ddaccordion.expandit($(this), $subcontent, config)
    lastexpanded={$header:$(this), $content:$subcontent}
   }  //end check
   else{
    $subcontent.hide()
    ddaccordion.transformHeader($(this), config, "collapse")
   }
  })
  $('.'+config["headerclass"]).click(function(){ //assign behavior when headers are clicked on
    var $subcontent=$subcontents.eq(parseInt($(this).attr('headerindex'))) //get subcontent that should be expanded/collapsed
    if ($subcontent.css('display')=="none"){
     ddaccordion.expandit($(this), $subcontent, config)
     if (config["collapseprev"] && lastexpanded.$header && $(this).get(0)!=lastexpanded.$header.get(0)){ //collapse previous content?
      ddaccordion.collapseit(lastexpanded.$header, lastexpanded.$content, config)
     }
     lastexpanded={$header:$(this), $content:$subcontent}
    }
    else{
     ddaccordion.collapseit($(this), $subcontent, config)
    }
    return false
  })
  $(window).bind('unload', function(){ //clean up and persist on page unload
   $('.'+config["headerclass"]).unbind('click')
   var expandedindices=[]
   $('.'+config["contentclass"]+":visible").each(function(index){ //get indices of expanded headers
    expandedindices.push($(this).attr('contentindex'))
   })
   if (config.persiststate==true){ //persist state?
    expandedindices=(expandedindices.length==0)? '-1c' : expandedindices //No contents expanded, indicate that with dummy '-1c' value?
    ddaccordion.setCookie(config.headerclass, expandedindices)
   }
  })
 })
 }
}

2.使用:

<script src="http://www.cnblogs.com/JS/command.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/JS/Menu.js" type="text/javascript"></script>
<script type="text/javascript">
ddaccordion.init({
 headerclass: "expandable", //Shared CSS class name of headers group that are expandable//头的样式名称
 contentclass: "categoryitems", //Shared CSS class name of contents group//展开项的样式名称
 collapseprev: false, //Collapse previous content (so only one open at any time)? true/false 表示是否只允许同时展开一个!
 defaultexpanded: [0], //index of content(s) open by default [index1, index2, etc]. [] denotes no content//默认展开的项
 animatedefault: false, //Should contents open by default be animated into view?//默认项展开时是否有动态效果
 persiststate: true, //persist state of opened contents within browser session?//是否保存展开的栏目
 toggleclass: ["", "openheader"], //Two CSS classes to be applied to the header when it's collapsed and expanded, respectively ["class1", "class2"]//展开前后头的样式
 togglehtml: ["prefix", "", ""], //Additional HTML added to the header when it's collapsed and expanded, respectively  ["position", "html1", "html2"] (see docs)//展开前后要显示的html
 animatespeed: "normal" //speed of animation: "fast", "normal", or "slow"//展开效果选择
})
</script>

posted on 2011-11-11 13:06  carekee  阅读(3048)  评论(0编辑  收藏  举报