!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

JavaScript
Børre Stenseth
JavaScript >Expand

Expand

Hva
Ekspansjon av komponenter på en vevside

Vi har ofte behov for å lage vevsider der leseren kan velge og ekspandere deler av siden. Behovet oppstår fordi vi ikke vil overbelaste siden med for mye informasjon eller detaljer eller fordi forskjellige lesere har forskjellige ønsker.

Du ser eksempler på dette i dette materialet, der det brukes en AJAX-løsning for å ekspandere materiale som kodebiter eller annet materiale som det bare sporadisk er interessant å lese i detalj.

I denne modulen skal vi se på en enkle løsning der vi ekspanderer eller kollapser deler av siden som er lastet opp, men er skjult. Først skal vi se på en enkel løsning der vi håndskriver detaljene, og etterpå skal vi se på en løsning der vi bruker Javascript til å konfigurere siden.

Enkelt håndarbeid

Vi begynner med en enkel vevside og to javascript-funkjsoner:

test0.html:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8"/>    
    <title>Expand</title>
  <script  type="text/javascript" src="expander0.js"> </script>        
</head>    
<body>
  <h2>Testing expand</h2>
  <div>
    <div id="handmade-on" 
         style="cursor:pointer"  
         onclick="javascript:exp_show('handmade');exp_hide('handmade-on');">
      expand
    </div>
   <div id="handmade" style="display:none">
   <div  style="cursor:pointer" 
         onclick="javascript:exp_hide('handmade');exp_show('handmade-on');">
     collaps
   </div>
      Dette kommer og går
   </div>
</div>
</body>
</html>

expander0.js:

function exp_show(eltid)
{
    var element=document.getElementById(eltid);
    element.style.display='block';
}
function exp_hide(eltid)
{
    var element=document.getElementById(eltid);
    element.style.display='none';
}
Testside http://www.it.hiof.no/~borres/dw/expander/test0.html

Automatikk

Vi ønsker å generalisere, og vi lager en testside med to potensielle ekspansjonselementer. Disse er kalt Nr1 og Nr2. Det er div'ene med class="expand" som skal være ekspanderbare.

test1.html:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8"/>    
    <title>Expand</title>
    <title>expandtest1</title>
    <style>
        .exp_on,.exp_off
        {font-size:24px; color:black;
            cursor:pointer; width:20px;
            background-color:green}
        .exp_off{background-color:red}
    </style>
    <script  type="text/javascript" src="expander.js">
    </script>        
</head>
    
<body onload="setTogle()">
    <h2>Testing expand</h2>
   
    <h4>Nr1:</h4>        
    <div class="expand">
        <h2>Heisann</h2>
        <p>Dette kommer og går</p>
    </div>
            
    <h4>Nr2:</h4>
    <div class="expand">
        <h2>Hallo</h2>
        <p>
        <img src="bs1.gif" alt="bs1" />
        </p>
    </div>       
    <hr/>       
    <p onclick="alert(body.innerHTML);">
        Klikk her for å se modifisert DOM
    </p>        
</body>
</html>

Vi lage en funksjon som kalle når siden er lastet. Denne funksjonen, setTogle(), går gjennom siden, lokaliserer alle div'er med class="expand", og preparerer, prepareElement(), disse elementene slik at de er klare for ekspansjon og kollaps.

expander.js:

function exp_show(eltid)
{
    var element=document.getElementById(eltid);
    element.style.display='block';
}
function exp_hide(eltid)
{
    var element=document.getElementById(eltid);
    element.style.display='none';
}
function prepareElement(hostelement)
{
    hostelement.setAttribute('class','expanded');
    var r_no = Math.ceil(Math.random()*100);
    plussid='pluss'+r_no;
    contentid='content'+r_no;
    // make expander
    plusselt=document.createElement('div');
    plusselt.id=plussid;
    plusstext=document.createTextNode('+');
    plusselt.setAttribute('class','exp_on');
    tmp="javascript:exp_hide('"+plussid+"');exp_show('"+contentid+"');"
    plusselt.setAttribute("onclick",tmp);
    plusselt.appendChild(plusstext);
    // make collapser
    minuselt=document.createElement('div');
    minustext=document.createTextNode('-');
    minuselt.setAttribute('class','exp_off');
    tmp="javascript:exp_show('"+plussid+"');exp_hide('"+contentid+"');"
    minuselt.setAttribute("onclick",tmp);
    minuselt.appendChild(minustext);
    // make new content
    wrapper=document.createElement('div');
    wrapper.appendChild(plusselt);
    // make the inner content with minus and the original
    contentelt=document.createElement('div');
    contentelt.id=contentid;
    contentelt.appendChild(minuselt);
    childs=hostelement.childNodes;
    for(ix=0;ix < childs.length; ix++)
        contentelt.appendChild(childs[ix].cloneNode(true));
    wrapper.appendChild(contentelt);
    hostelement.innerHTML=wrapper.innerHTML;
    exp_show(plussid);
    exp_hide(contentid);
}
function setTogle()
{
    var tlist=document.getElementsByTagName('div');
    for(ix=tlist.length-1; ix > -1; ix--)
    {
        var elt=tlist[ix];
        if(elt.getAttribute('class') || elt.getAttribute('className'))
        {
          var v=elt.getAttribute('class');
          if(!v)
              v=elt.getAttribute('className');
          if(v == 'expand')
              prepareElement(elt);
        }
    }
}
Testside http://www.it.hiof.no/~borres/dw/expander/test1.html

WXT

I dette materialet er det brukt en løsning for å vise og skjule deler av en side. Motivasjonen for dette er lik motivasjonen for å bruke popup:

_request1.txt

Denne mekanismen er ganske enkel. Den involverte javascriptkoden, sammen med noen andre nyttige funkjsoner som brukes på disse sidene, ser slik ut:

_wxtjs.js

Referanser

All kode er sitert i teksten.

Vedlikehold

B. Stenseth, august 2008

( Velkommen ) JavaScript >Expand ( Dynamiske script )