คือเวลา refresh หน้า เราอยากให้sub menu ที่เราคลิ๊กไว้มัน show ค้างไว้อ่ะค่ะ
แต่ทีนี้มันมีปัญหาตรงที่ว่า บางครั้งมันก้อ show บางครั้งก็ไม่ show และบางครั้งก็ show ผิด submenu
คาดว่าน่าจะเป็นที่ตอน set cookie ใน javascript อ่ะค่ะ เลยวานให้ผู้รู้มาชี้นำทีว่าควรแก้ไข coding อย่างไรดี
พอดีไม่ค่อยถนัด js อ่ะค่ะ ช่วยดูให้ทีนะคะ
File menu.php
Code (PHP)
<script type="text/javascript" src="jquery-1.2.2.pack.js"></script>
<script type="text/javascript" src="ddaccordion.js"></script>
<script type="text/javascript">
ddaccordion.init({
headerclass: "submenuheader", //Shared CSS class name of headers group
contentclass: "submenu", //Shared CSS class name of contents group
revealtype: "click",
collapseprev: true, //Collapse previous content (so only one open at any time)? true/false
defaultexpanded: [], //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: ["", "header_selected"], //Two CSS classes to be applied to the header when it's collapsed and expanded, respectively ["class1", "class2"]
togglehtml: ["suffix", "", ""], //Additional HTML added to the header when it's collapsed and expanded, respectively ["position", "html1", "html2"] (see docs)
animatespeed: "fast" //speed of animation: "fast", "normal", or "slow"
})
</script>
<style type="text/css">
.glossymenu{
width: 200px;
border:1px solid #CCCCCC;
}
.arrowlistmenu .header_selected{ /*CSS class to apply to expandable header when it's expanded*/
color: #b30505;
}
.glossymenu a.menuitem{
font: bold 12px Arial, Helvetica, sans-serif;
display: block;
background: #CCC;
height: 24px; /*Set to height of bg image- padding within link (ie: 32px - 4px - 4px)*/
padding: 4px 0px 4px 10px;
line-height: 24px; /*Set line-height of bg image- padding within link (ie: 32px - 4px - 4px)*/
text-decoration: none;
color:#333333;
position: relative; /*To help in the anchoring of the ".statusicon" icon image*/
}
.glossymenu a.menuitem .statusicon{ /*CSS for icon image that gets dynamically added to headers*/
position: absolute;
top: 15px;
right: 15px;
border: none;
}
.glossymenu a.menuitem:visited, .glossymenu .menuitem:active{
color: #333333;
}
.glossymenu a.menuitem:hover{
color: #b30505;
}
.glossymenu div.submenu{ /*DIV that contains each sub menu*/
background: #ECECEC;
}
.glossymenu div.submenu ul{ /*UL of each sub menu*/
list-style-type: none;
margin: 0;
padding: 0;
}
.glossymenu div.submenu ul li{
border-bottom: 1px solid #d9d9d9;
}
.glossymenu div.submenu ul li a{
display: block;
font: bold 11px Arial, Helvetica, sans-serif;
color: #b30505;
text-decoration: none;
padding: 6px 0;
padding-left: 20px;
}
.glossymenu div.submenu ul li a:hover{
background: #c1c0c0;
color: #333333;
}
.glossymenu div.submenu ul li a.selected {
background-position:100% -64px;
color:#b30505;
}
</style>
<div class="glossymenu">
<a class="menuitem" href="<?=$PHP_SELF?>">Home</a>
<a class="menuitem submenuheader" href="#" >Product</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Add Product</a></li>
<li><a href="<?=$PHP_SELF?>">View Product</a></li>
</ul>
</div>
<a class="menuitem submenuheader" href="#">Base Data</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Color</a></li>
<li><a href="<?=$PHP_SELF?>">Theme</a></li>
</ul>
</div>
<a class="menuitem submenuheader" href="#">Main Features</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Jewelry Types</a></li>
<li><a href="<?=$PHP_SELF?>">Product Materials</a></li>
<li><a href="<?=$PHP_SELF?>">Body Piercing Parts</a></li>
</ul>
</div>
<a class="menuitem submenuheader" href="#">Features List</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Jewelry Types</a></li>
<li><a href="<?=$PHP_SELF?>">Product Materials</a></li>
<li><a href="<?=$PHP_SELF?>">Body Piercing Parts</a></li>
<li><a href="<?=$PHP_SELF?>">Material Colors</a></li>
<li><a href="<?=$PHP_SELF?>">Crystal Colors</a></li>
</ul>
</div>
<a class="menuitem submenuheader" href="#" >Campaigns</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Theme</a></li>
<li><a href="<?=$PHP_SELF?>">Promotion</a></li>
</ul>
</div>
<a class="menuitem" href="<?=$PHP_SELF?>">Order</a>
<a class="menuitem" href=".<?=$PHP_SELF?>">Setting</a>
<a class="menuitem" href="<?=$PHP_SELF?>">Banner</a>
<a class="menuitem submenuheader" href="#">Newletter & Subscribers</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">Newletter</a></li>
<li><a href="<?=$PHP_SELF?>">Subscribers</a></li>
</ul>
</div>
<a class="menuitem submenuheader" href="#">User & Permission</a>
<div class="submenu">
<ul>
<li><a href="<?=$PHP_SELF?>">User</a></li>
<li><a href="<?=$PHP_SELF?>">Permission</a></li>
</ul>
</div>
</div>
</div>
File ddaccordion.js
Code (JavaScript)
//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
//kk alert(document.cookie.match(re));
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
//kk alert(value);
},
init:function(config){
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
config.cssclass={collapse: config.toggleclass[0], expand: config.toggleclass[1]} //store expand and contract CSS classes as object properties
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)
}
$(this).attr('headerindex', index+'h') //store position of this header relative to its peers
$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)
}
})
})
}
}