Accordion Menu

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

John Cena

John Cena

08/09/2010 14:39:29
Quote Anchor link
Hallo,

Ik heb een menu gemaakt waarbij als ik op een kopje klik het menu uit moet kloppen naar beneden.
Echter, als ik op kopje 1 ram klapt kopje 3 uit, kopje 2 klapt kopje 4 uit.

Wat doe ik fout?

Javascript:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script type="text/javascript">
           ddaccordion.init({
        headerclass: "headerbar", //Shared CSS class name of headers group
        contentclass: "submenu", //Shared CSS class name of contents group
        revealtype: "click", //Reveal content when user clicks or onmouseover the header? Valid value: "click", "clickgo", or "mouseover"
        mouseoverdelay: 200, //if revealtype="mouseover", set delay in milliseconds before header expands onMouseover
        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
        onemustopen: false, //Specify whether at least one header should be open always (so never all headers closed)
        animatedefault: false, //Should contents open by default be animated into view?
        persiststate: true, //persist state of opened contents within browser session?
        toggleclass: ["", "selected"], //Two CSS classes to be applied to the header when it's collapsed and expanded, respectively ["class1", "class2"]
        togglehtml: ["", "", ""], //Additional HTML added to the header when it's collapsed and expanded, respectively  ["position", "html1", "html2"] (see docs)
        animatespeed: "slow", //speed of animation: integer in milliseconds (ie: 200), or keywords "fast", "normal", or "slow"
        oninit:function(headers, expandedindices){ //custom code to run when headers have initalized
            //do nothing
        },
        onopenclose:function(header, index, state, isuseractivated){ //custom code to run whenever a header is opened or closed
            //do nothing
        }
    })
    
    </script>


Extern bestand:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
var ddaccordion={
    ajaxloadingmsg: '<img src="loading2.gif" /><br />Loading Content...', //customize HTML to output while Ajax content is being fetched (if applicable)

    headergroup: {}, //object to store corresponding header group based on headerclass value
    contentgroup: {}, //object to store corresponding content group based on headerclass value

    preloadimages:function($images){
        $images.each(function(){
            var preloadimage=new Image()
            preloadimage.src=this.src
        })
    },

    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=this.headergroup[headerclass]
        this.contentgroup[headerclass].filter(':hidden').each(function(){
            $headers.eq(parseInt($(this).attr('contentindex'))).trigger("evt_accordion")
        })
    },

    collapseall:function(headerclass){ //PUBLIC function to collapse all headers based on their shared CSS classname
        var $headers=this.headergroup[headerclass]
        this.contentgroup[headerclass].filter(':visible').each(function(){
            $headers.eq(parseInt($(this).attr('contentindex'))).trigger("evt_accordion")
        })
    },

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

    ajaxloadcontent:function($targetHeader, $targetContent, config, callback){
        var ajaxinfo=$targetHeader.data('ajaxinfo')

        function handlecontent(content){ //nested function
            if (content){ //if ajax content has loaded
                ajaxinfo.cacheddata=content //remember ajax content
                ajaxinfo.status="cached" //set ajax status to cached
                if ($targetContent.queue("fx").length==0){ //if this content isn't currently expanding or collapsing
                    $targetContent.hide().html(content) //hide loading message, then set sub content's HTML to ajax content
                    ajaxinfo.status="complete" //set ajax status to complete
                    callback() //execute callback function- expand this sub content
                }
            }
            if (ajaxinfo.status!="complete"){
                setTimeout(function(){handlecontent(ajaxinfo.cacheddata)}, 100) //call handlecontent() again until ajax content has loaded (ajaxinfo.cacheddata contains data)
            }
        } //end nested function

        if (ajaxinfo.status=="none"){ //ajax data hasn't been fetched yet
            $targetContent.html(this.ajaxloadingmsg)
            $targetContent.slideDown(config.animatespeed)
            ajaxinfo.status="loading" //set ajax status to "loading"
            $.ajax({
                url: ajaxinfo.url, //path to external menu file
                error:function(ajaxrequest){
                    handlecontent('Error fetching content. Server Response: '+ajaxrequest.responseText)
                },
                success:function(content){
                    content=(content=="")? " " : content //if returned content is empty, set it to "space" is content no longer returns false/empty (hasn't loaded yet)
                    handlecontent(content)
                }
            })
        }
        else if (ajaxinfo.status=="loading")
            handlecontent(ajaxinfo.cacheddata)
    },

    expandit:function($targetHeader, $targetContent, config, useractivated, directclick, skipanimation){
        var ajaxinfo=$targetHeader.data('ajaxinfo')
        if (ajaxinfo){ //if this content should be fetched via Ajax
            if (ajaxinfo.status=="none" || ajaxinfo.status=="loading")
                this.ajaxloadcontent($targetHeader, $targetContent, config, function(){ddaccordion.expandit($targetHeader, $targetContent, config, useractivated, directclick)})
            else if (ajaxinfo.status=="cached"){
                $targetContent.html(ajaxinfo.cacheddata)
                ajaxinfo.cacheddata=null
                ajaxinfo.status="complete"
            }
        }
        this.transformHeader($targetHeader, config, "expand")
        $targetContent.slideDown(skipanimation? 0 : config.animatespeed, function(){
            config.onopenclose($targetHeader.get(0), parseInt($targetHeader.attr('headerindex')), $targetContent.css('display'), useractivated)
            if (config.postreveal=="gotourl" && directclick){ //if revealtype is "Go to Header URL upon click", and this is a direct click on the header
                var targetLink=($targetHeader.is("a"))? $targetHeader.get(0) : $targetHeader.find('a:eq(0)').get(0)
                if (targetLink) //if this header is a link
                    setTimeout(function(){location=targetLink.href}, 200) //ignore link target, as window.open(targetLink, targetLink.target) doesn't work in FF if popup blocker enabled
            }
        })
    },

    collapseit:function($targetHeader, $targetContent, config, isuseractivated){
        this.transformHeader($targetHeader, config, "collapse")
        $targetContent.slideUp(config.animatespeed, function(){config.onopenclose($targetHeader.get(0), parseInt($targetHeader.attr('headerindex')), $targetContent.css('display'), isuseractivated)})
    },

    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)
    },

    urlparamselect:function(headerclass){
        var result=window.location.search.match(new RegExp(headerclass+"=((\\d+)(,(\\d+))*)", "i")) //check for "?headerclass=2,3,4" in URL
        if (result!=null)
            result=RegExp.$1.split(',')
        return result //returns null, [index], or [index1,index2,etc], where index are the desired selected header indices
    },

    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){
    document.write('<style type="text/css">\n')
    document.write('.'+config.contentclass+'{display: none}\n') //generate CSS to hide contents
    document.write('a.hiddenajaxlink{display: none}\n') //CSS class to hide ajax link
    document.write('<\/style>')
    jQuery(document).ready(function($){
        ddaccordion.urlparamselect(config.headerclass)
        var persistedheaders=ddaccordion.getCookie(config.headerclass)
        ddaccordion.headergroup[config.headerclass]=$('.'+config.headerclass) //remember header group for this accordion
        ddaccordion.contentgroup[config.headerclass]=$('.'+config.contentclass) //remember content group for this accordion
        var $headers=ddaccordion.headergroup[config.headerclass]
        var $subcontents=ddaccordion.contentgroup[config.headerclass]
        config.cssclass={collapse: config.toggleclass[0], expand: config.toggleclass[1]} //store expand and contract CSS classes as object properties
        config.revealtype=config.revealtype || "click"
        config.revealtype=config.revealtype.replace(/mouseover/i, "mouseenter")
        if (config.revealtype=="clickgo"){
            config.postreveal="gotourl" //remember added action
            config.revealtype="click" //overwrite revealtype to "click" keyword
        }
        if (typeof config.togglehtml=="undefined")
            config.htmlsetting={location: "none"}
        else
            config.htmlsetting={location: config.togglehtml[0], collapse: config.togglehtml[1], expand: config.togglehtml[2]} //store HTML settings as object properties
        config.oninit=(typeof config.oninit=="undefined")? function(){} : config.oninit //attach custom "oninit" event handler
        config.onopenclose=(typeof config.onopenclose=="undefined")? function(){} : config.onopenclose //attach custom "onopenclose" event handler
        var lastexpanded={} //object to hold reference to last expanded header and content (jquery objects)
        var expandedindices=ddaccordion.urlparamselect(config.headerclass) || ((config.persiststate && persistedheaders!=null)? persistedheaders : config.defaultexpanded)
        if (typeof expandedindices=='string') //test for string value (exception is config.defaultexpanded, which is an array)
            expandedindices=expandedindices.replace(/c/ig, '').split(',') //transform string value to an array (ie: "c1,c2,c3" becomes [1,2,3]
        if (expandedindices.length==1 && expandedindices[0]=="-1") //check for expandedindices value of [-1], indicating persistence is on and no content expanded
            expandedindices=[]
        if (config["collapseprev"] && expandedindices.length>1) //only allow one content open?
            expandedindices=[expandedindices.pop()] //return last array element as an array (for sake of jQuery.inArray())
        if (config["onemustopen"] && expandedindices.length==0) //if at least one content should be open at all times and none are, open 1st header
            expandedindices=[0]
        $headers.each(function(index){ //loop through all headers
            var $header=$(this)
            if (/(prefix)|(suffix)/i.test(config.htmlsetting.location) && $header.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)
            }
            $header.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)
            var $hiddenajaxlink=$subcontent.find('a.hiddenajaxlink:eq(0)') //see if this content should be loaded via ajax
            if ($hiddenajaxlink.length==1){
                $header.data('ajaxinfo', {url:$hiddenajaxlink.attr('href'), cacheddata:null, status:'none'}) //store info about this ajax content inside header
            }
            var needle=(typeof expandedindices[0]=="number")? index : index+'' //check for data type within expandedindices array- index should match that type
            if (jQuery.inArray(needle, expandedindices)!=-1){ //check for headers that should be expanded automatically (convert index to string first)
                ddaccordion.expandit($header, $subcontent, config, false, false, !config.animatedefault) //3rd last param sets 'isuseractivated' parameter, 2nd last sets isdirectclick, last sets skipanimation param
                lastexpanded={$header:$header, $content:$subcontent}
            }  //end check
            else{
                $subcontent.hide()
                config.onopenclose($header.get(0), parseInt($header.attr('headerindex')), $subcontent.css('display'), false) //Last Boolean value sets 'isuseractivated' parameter
                ddaccordion.transformHeader($header, config, "collapse")
            }
        })
        $headers.bind("evt_accordion", function(e, isdirectclick){ //assign CUSTOM event handler that expands/ contacts a header
                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, true, isdirectclick) //2nd last param sets 'isuseractivated' parameter
                    if (config["collapseprev"] && lastexpanded.$header && $(this).get(0)!=lastexpanded.$header.get(0)){ //collapse previous content?
                        ddaccordion.collapseit(lastexpanded.$header, lastexpanded.$content, config, true) //Last Boolean value sets 'isuseractivated' parameter
                    }
                    lastexpanded={$header:$(this), $content:$subcontent}
                }
                else if (!config["onemustopen"] || config["onemustopen"] && lastexpanded.$header && $(this).get(0)!=lastexpanded.$header.get(0)){
                    ddaccordion.collapseit($(this), $subcontent, config, true) //Last Boolean value sets 'isuseractivated' parameter
                }
         })
        $headers.bind(config.revealtype, function(){
            if (config.revealtype=="mouseenter"){
                clearTimeout(config.revealdelay)
                var headerindex=parseInt($(this).attr("headerindex"))
                config.revealdelay=setTimeout(function(){ddaccordion.expandone(config["headerclass"], headerindex)}, config.mouseoverdelay || 0)
            }
            else{
                $(this).trigger("evt_accordion", [true]) //last parameter indicates this is a direct click on the header
                return false //cancel default click behavior
            }
        })
        $headers.bind("mouseleave", function(){
            clearTimeout(config.revealdelay)
        })
        config.oninit($headers.get(), expandedindices)
        $(window).bind('unload', function(){ //clean up and persist on page unload
            $headers.unbind()
            var expandedindices=[]
            $subcontents.filter(':visible').each(function(index){ //get indices of expanded headers
                expandedindices.push($(this).attr('contentindex'))
            })
            if (config.persiststate==true && $headers.length>0){ //persist state?
                expandedindices=(expandedindices.length==0)? '-1c' : expandedindices //No contents expanded, indicate that with dummy '-1c' value?
                ddaccordion.setCookie(config.headerclass, expandedindices)
            }
        })
    })
    }
}

//preload any images defined inside ajaxloadingmsg variable
ddaccordion.preloadimages(jQuery(ddaccordion.ajaxloadingmsg).filter('img'))


Menu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<div class="nav">

            <h3 class="headerbar"><a href="#">Home</a></h3>

<h3 class="headerbar"><a href="#">Team</a></h3>

<h3 class="headerbar"><a href="index.php?id=95&sub_id=22">Werkzaamheden</a></h3>

<ul class="submenu">

<li><a href="index.php?id=95&sub_id=21">Luchthaven</a></li>

<li><a href="index.php?id=95&sub_id=23">Afvalverwerking</a></li>

<li><a href="index.php?id=96&sub_id=13">Jacht</a></li>

<li><a href="index.php?id=98">Demonstraties</a></li>

</ul>

<h3 class="headerbar"><a href="#">Roofvogels</a></h3>

<ul class="submenu">

<li><a href="">Buizerd</a></li>

<li><a href="">Harris Hawk</a></li>

</ul>

<h3 class="headerbar"><a href="index.php?id=97">Links</a></h3>

<h3 class="headerbar"><a href="index.php?page_id=1&sub_id=14">Contact</a></h3>

</ul>        

    </div>
Gewijzigd op 24/09/2010 12:20:52 door Bas IJzelendoorn
 
PHP hulp

PHP hulp

05/04/2025 08:32:43
 
Johan Dam

Johan Dam

08/09/2010 14:42:36
Quote Anchor link
Is dit allemaal relevante code?? heb je niet ergens een online voorbeeld hiervan?
 
John Cena

John Cena

08/09/2010 14:48:25
Quote Anchor link
Niet echt relevant misschien, maar ik ben geen held hiermee.
Geen online voorbeeld nee, im sorry!
 
Johan Dam

Johan Dam

08/09/2010 14:51:23
Quote Anchor link
Krijg je foutmeldingen in de java console? (ctrl + shift + j in firefox)
 
Niek s

niek s

08/09/2010 14:55:57
Quote Anchor link
Verwacht je nou dat wij al die code gaan doorlezen & debuggen?

Wat dacht je er van om alleen relevante code te plaatsen, voor zo ver dat mogelijk is.
Of meer informatie geven waar we moeten kijken (ongeveer)

want hier zal niemand zin in hebben ;-)
 
John Cena

John Cena

08/09/2010 14:59:14
Quote Anchor link
Nee, heb geen foutmeldingen :-)

@reactie boven mij, ik weet het niet. Niet mijn eigen werk, heb het via een tutje gedaan ;)

Toevoeging op 08/09/2010 15:37:05:

http://www.chilion.nl/valk/ is de online versie
Gewijzigd op 08/09/2010 15:00:42 door John Cena
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.