Connecting Tech Pros Worldwide Forums | Help | Site Map

Accordion and ajax

Newbie
 
Join Date: Jan 2009
Posts: 5
#1: Jan 17 '09
Hi,
im using an accordion script but it doesnt work if i use it with ajax.
example:
Expand|Select|Wrap|Line Numbers
  1. <div id="accordion">
  2.      <dl class="accordion" id="slider">
  3.            <dt>click here for the 1st pane</dt>
  4.                  <dd>content of the 1st pane</dd>
  5.            <dt>click here for the 1st pane</dt>
  6.                  <dd>content of the 1st pane</dd>
  7.            <dt>click here for the 1st pane</dt>
  8.                  <dd>content of the 1st pane</dd>
  9.      </dl>
  10. </div>
works ok, but if i do:
Expand|Select|Wrap|Line Numbers
  1. <div id="accordion">
  2.      <dl class="accordion" id="slider">
  3. <?
  4. foreach ($array as $n)
  5.           {
  6.           <dt>click here for the $n pane</dt>
  7.                  <dd>content of $n </dd>
  8.            }
  9. ?>
  10.      </dl>
  11. </div>
it works only for the first page, but when i use the ajax to reload the foreach statement, when i click the script it does nothing, not even an error and the panes are all collapsed.
it seems that the script lack of an onclick function in the <dt> pane, instead the onclick function that's triggered from within the script.


accordion.js
Expand|Select|Wrap|Line Numbers
  1. var accordion=function(){
  2.     var tm=sp=10;
  3.     function slider(n){this.nm=n; this.arr=[]}
  4.     slider.prototype.init=function(t,c,k){
  5.         var a,h,s,l,i; a=document.getElementById(t); this.sl=k?k:'';
  6.         h=a.getElementsByTagName('dt'); s=a.getElementsByTagName('dd'); this.l=h.length;
  7.         for(i=0;i<this.l;i++){var d=h[i]; this.arr[i]=d; d.onclick=new Function(this.nm+'.pro(this)'); if(c==i){d.className=this.sl}}
  8.         l=s.length;
  9.         for(i=0;i<l;i++){var d=s[i]; d.mh=d.offsetHeight; if(c!=i){d.style.height=0; d.style.display='none'}}
  10.     }
  11.     slider.prototype.pro=function(d){
  12.         for(var i=0;i<this.l;i++){
  13.             var h=this.arr[i], s=h.nextSibling; s=s.nodeType!=1?s.nextSibling:s; clearInterval(s.tm);
  14.             if(h==d&&s.style.display=='none'){s.style.display=''; su(s,1); h.className=this.sl}
  15.             else if(s.style.display==''){su(s,-1); h.className=''}
  16.         }
  17.     }
  18.     function su(c,f){c.tm=setInterval(function(){sl(c,f)},tm)}
  19.     function sl(c,f){
  20.         var h=c.offsetHeight, m=c.mh, d=f==1?m-h:h; c.style.height=h+(Math.ceil(d/sp)*f)+'px';
  21.         c.style.opacity=h/m; c.style.filter='alpha(opacity='+h*100/m+')';
  22.         if(f==1&&h>=m){clearInterval(c.tm)}else if(f!=1&&h==1){c.style.display='none'; clearInterval(c.tm)}
  23.     }
  24.     return{slider:slider}
  25. }();
HTML
Expand|Select|Wrap|Line Numbers
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  5. <title>JavaScript Accordion</title>
  6. <link rel="stylesheet" href="style.css" type="text/css" />
  7. <script type="text/javascript" src="accordion.js"></script>
  8. </head>
  9. <body>
  10. <div id="accordion">
  11.     <dl class="accordion" id="slider">
  12.         <dt>CLICK ME</dt>
  13.                <dd>test </dd>
  14.         <dt>CLICK ME</dt>
  15.                 <dd>test 2   </dd>
  16.         <dt>CLICK ME</dt>
  17.                   <dd>Test 3    </dd>
  18.     </dl>
  19. </div>
  20.  
  21. <script type="text/javascript">
  22. var slider1=new accordion.slider("slider1");
  23. slider1.init("slider");
  24. </script>
  25.  
  26. </body>
  27. </html>
style.css
Expand|Select|Wrap|Line Numbers
  1. * {margin:0; padding:0}
  2.  
  3. #accordion {width:459px; margin:50px auto}
  4. .accordion {width:459px; font:12px Verdana,Arial; color:#033}
  5. .accordion dt {width:439px; border:2px solid #9ac1c9; padding:8px; font-weight:bold; margin-top:5px; cursor:pointer; background:url(images/header.gif)}
  6. .accordion dt:hover {background:url(images/header_over.gif)}
  7. .accordion dd {overflow:hidden; background:#fff}
  8. .accordion span {display:block; width:425px; border:2px solid #9ac1c9; border-top:none; padding:15px}
  9.  
  10. #accordion2 {width:259px; margin:50px auto; border:1px solid #333; border-top:none}
  11. .accordion2 {width:259px; font:12px Verdana,Arial; color:#333}
  12. .accordion2 dt {width:247px; padding:4px 6px; font-weight:bold; cursor:pointer; background-color:#666; background-image:url(images/arrow_down.gif); background-position:right center; background-repeat:no-repeat; color:#fff; border-top:1px solid #333}
  13. .accordion2 dt:hover {background-color:#555}
  14. .accordion2 .open {background-color:#444; background-image:url(images/arrow_up.gif)}
  15. .accordion2 dd {overflow:hidden; background:#fff}
  16. .accordion2 span {display:block; width:229px; border-top:none; padding:15px}
So my question is:
would it be possible to create an onClick function, like "onClick=open_pane($pane_id)", instead of how is doing now?

Thanks.

acoder's Avatar
Site Moderator
 
Join Date: Nov 2006
Location: UK
Posts: 14,581
#2: Jan 18 '09

re: Accordion and ajax


Can you show the Ajax code that rewrites the foreach statement.
Newbie
 
Join Date: Jan 2009
Posts: 5
#3: Jan 18 '09

re: Accordion and ajax


sure,
i use the basic (only 1k) 'cos i dont need the fancy stuff of jquery, mootools, etc..., i also tried to wrap the whole accordion.js with a "function abc(){
$#!$@#
}, but no luck.



ajax.js
Expand|Select|Wrap|Line Numbers
  1. function ajaxFunction(_1,_2,pag,res_div,ldr){
  2. //    alert(ldr);
  3. var vi = document.getElementById(ldr);
  4. vi.style.visibility = "visible";
  5. var _3;
  6. try{
  7. _3=new XMLHttpRequest();
  8. }
  9. catch(e){
  10. try{
  11. _3=new ActiveXObject("Msxml2.XMLHTTP");
  12. }
  13. catch(e){
  14. try{
  15. _3=new ActiveXObject("Microsoft.XMLHTTP");
  16. }
  17. catch(e){
  18. alert("Your browser broke!Need faster, safer, better browser? Get Firefox! Free!");
  19. return false;
  20. }}}
  21. _3.onreadystatechange=function(){
  22. var _4=document.getElementById(res_div);
  23. if(_3.readyState==4){
  24. vi.style.visibility = "hidden";
  25.  _4.innerHTML=_3.responseText;
  26. };
  27. var _5="?var1="+_1+"&var2="+_2;
  28. _3.open('GET',pag+_5,true);
  29. _3.send(null);
  30. };
  31.  
Newbie
 
Join Date: Jan 2009
Posts: 5
#4: Jan 18 '09

re: Accordion and ajax


forgot the link.
i use : <a href="#" onclick="ajaxFunction('var1','var2','page_to_query .php','result_div','loader_div')">
click for ajax</a>
i like 'cos extremely simple, light, efficient.
acoder's Avatar
Site Moderator
 
Join Date: Nov 2006
Location: UK
Posts: 14,581
#5: Jan 18 '09

re: Accordion and ajax


This Ajax code obviously doesn't appear in the HTML code that you posted earlier. Can you post that version of the page? I'd also like to see what page_to_query returns and the div "result_div". A link would probably be better in this case.
Newbie
 
Join Date: Jan 2009
Posts: 5
#6: Jan 18 '09

re: Accordion and ajax


hey men,
is all here, test page and files:
JavaScript Accordion
i still think it's a js issue, however thanks for your time, whatever the result.
acoder's Avatar
Site Moderator
 
Join Date: Nov 2006
Location: UK
Posts: 14,581
#7: Jan 19 '09

re: Accordion and ajax


In your test.php file, you've got a div with id "accordion" which will cause problems (duplicate IDs).

Also, since you're overwriting content, you will have to set up the accordion again.
Newbie
 
Join Date: Jan 2009
Posts: 5
#8: Jan 19 '09

re: Accordion and ajax


this way "sort of" works", just added an (ugly) onclick function, but stays open.
JavaScript Accordion

'ssorait, getting kinda tired of it.......
acoder's Avatar
Site Moderator
 
Join Date: Nov 2006
Location: UK
Posts: 14,581
#9: Jan 19 '09

re: Accordion and ajax


You have two possibilities:

1. Add the init statement after the content is replaced in the Ajax function; or
2. Modify the Ajax function to replace each dt/dd element individually.
Reply

Tags
accordion