Avatar billede henriksteen Nybegynder
10. februar 2006 - 13:00 Der er 8 kommentarer

Kontrollere IMG i DOM-script

Dette er ikke mitt spørsmål, men bare en tanke: Burde ikke DOM være en egen kategori på eksperten?

Jeg har et script som åpner/lukker seksjoner (DomCollapse), det utstyrer også trigger-tittelen med ett ikon (som står foran). Jeg skulle gjernen ha flyttet dette bildet til høyre (float: right), men aner ikke hvordan (kan ingenting om DOM, men bruker dette scriptet:

/*
* DOMcollapse
*/

dc={
    triggerElements:'*',     // elementer som trigger (sparer tid)
    parentElementId:null,    // ID foreldreelement ('null' om ingen)
    uniqueCollapse:false,    // kun én om gangen?

    // CSS class
    trigger:'trigger',
    triggeropen:'expanded',
    hideClass:'hide',
    showClass:'show',
   
    // bilde og tekst
    closedPic:'../img/closeAll.gif',
    closedAlt:'Utvid seksjonen',
    openPic:'../img/openAll.gif',
    openAlt:'Lukk seksjonen',
    /* Funker ikke med Safari:
        hoverClass:'hover',
    */

    init:function(e){
        var temp;
        if(!document.getElementById || !document.createTextNode){return;}
        if(!dc.parentElementId){
            temp=document.getElementsByTagName(dc.triggerElements);
        } else if(document.getElementById(dc.parentElementId)){
            temp=document.getElementById(dc.parentElementId).getElementsByTagName(dc.triggerElements);
        }else{
            return;
        }
        dc.tempLink=document.createElement('a');
        dc.tempLink.setAttribute('href','#');
        dc.tempLink.appendChild(document.createElement('img'));
        for(var i=0;i<temp.length;i++){
            if(dc.cssjs('check',temp[i],dc.trigger) || dc.cssjs('check',temp[i],dc.triggeropen)){
                dc.makeTrigger(temp[i],e);
            }
        }
    },
    makeTrigger:function(o,e){
        var tl=dc.tempLink.cloneNode(true);
        var tohide=o.nextSibling;
        while(tohide.nodeType!=1)
        {
            tohide=tohide.nextSibling;
        }
        o.tohide=tohide;
        if(!dc.cssjs('check',o,dc.triggeropen)){
            dc.cssjs('add',tohide,dc.hideClass);
            tl.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
            tl.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
            o.setAttribute('title',dc.closedAlt);
            o.setAttribute('img',dc.closedAlt);
        }else{
            dc.cssjs('add',tohide,dc.showClass);
            tl.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
            tl.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
            o.setAttribute('title',dc.openAlt);
            dc.currentOpen=o;
        }
        dc.addEvent(o,'click',dc.addCollapse,false);
        /* Doesn't work with Safari
        dc.addEvent(o,'mouseover',dc.hover,false);
        dc.addEvent(o,'mouseout',dc.hover,false);
        */
        o.insertBefore(tl,o.firstChild);
        dc.addEvent(tl,'click',dc.addCollapse,false);
        // Safari hacks
        tl.onclick=function(){return false;}
        o.onclick=function(){return false;}
    },
    /* Doesn't work with Safari
    hover:function(e){
        var o=dc.getTarget(e);
        var action=dc.cssjs('check',o,dc.hoverClass)?'remove':'add';
        dc.cssjs(action,o,dc.hoverClass)
    },
    */
    addCollapse:function(e){
        var action,pic;
        if(dc.uniqueCollapse && dc.currentOpen){
            dc.currentOpen.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
            dc.currentOpen.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
            dc.currentOpen.setAttribute('title',dc.closedAlt);
            dc.cssjs('swap',dc.currentOpen.tohide,dc.showClass,dc.hideClass);
            dc.cssjs('remove',dc.currentOpen,dc.triggeropen);
            dc.cssjs('add',dc.currentOpen,dc.trigger);
        }
        var o=dc.getTarget(e);
        if(o.tohide){
            if(dc.cssjs('check',o.tohide,dc.hideClass)){
                o.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
                o.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
                o.setAttribute('title',dc.openAlt);
                dc.cssjs('swap',o.tohide,dc.hideClass,dc.showClass);
                dc.cssjs('add',o,dc.triggeropen);
                dc.cssjs('remove',o,dc.trigger);
            }else{
                o.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
                o.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
                o.setAttribute('title',dc.closedAlt);
                dc.cssjs('swap',o.tohide,dc.showClass,dc.hideClass);
                dc.cssjs('remove',o,dc.triggeropen);
                dc.cssjs('add',o,dc.trigger);
            }
            dc.currentOpen=o;
            dc.cancelClick(e);
            //document.getElementById('debug').innerHTML=o.tohide.className;
        }
        else{
            dc.cancelClick(e);
        }
    },
    /* helper methods */
    getTarget:function(e){
        var target = window.event ? window.event.srcElement : e ? e.target : null;
        if (!target){return false;}
        while(!target.tohide && target.nodeName.toLowerCase()!='body')
        {
            target=target.parentNode;
        }
        // if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;} Safari fix not needed here
        return target;
    },
    cancelClick:function(e){
        if (window.event){
            window.event.cancelBubble = true;
            window.event.returnValue = false;
            return;
        }
        if (e){
            e.stopPropagation();
            e.preventDefault();
        }
    },
    addEvent: function(elm, evType, fn, useCapture){
        if (elm.addEventListener)
        {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        } else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            return r;
        } else {
            elm['on' + evType] = fn;
        }
    },
    cssjs:function(a,o,c1,c2){
        switch (a){
            case 'swap':
                o.className=!dc.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
            break;
            case 'add':
                if(!dc.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
            break;
            case 'remove':
                var rep=o.className.match(' '+c1)?' '+c1:c1;
                o.className=o.className.replace(rep,'');
            break;
            case 'check':
                return new RegExp("(^|\\s)" + c1 + "(\\s|$)").test(o.className)
            break;
        }
    }
}
dc.addEvent(window, 'load', dc.init, false);

***

Henrik, Oslo
Avatar billede horsmark Nybegynder
10. februar 2006 - 13:01 #1
har du en url ?
Avatar billede henriksteen Nybegynder
10. februar 2006 - 13:32 #2
Ja, ta en titt på http://henrik.steen.net/1f/test.html
Se øverst i sidespalten: <h3>Funksjonstaster</h3>
Trigger er også montert på <h1> i hovedfeltet.

Jeg kunne lett løst oppgaven ved å angi background-position: 50% right i stilsettet. MEN, jeg vil helst ha det løst i DOM-scriptet, slik at jeg kan *beholde eksisterende bakgrunner som de er i stilsettet* og bruke open/close-ikonet *i tillegg*. Comprende!?
Avatar billede horsmark Nybegynder
10. februar 2006 - 13:42 #3
Er der nogen grund til at du vil manipulere med DOM istedet for at lave en showHide på en <div> ?
Avatar billede henriksteen Nybegynder
10. februar 2006 - 13:59 #4
Hvordan? (Jeg er en novise!)
Da må jeg sette inn en <div> alle steder jeg vil bruke trigger-funksjonen?
Avatar billede horsmark Nybegynder
10. februar 2006 - 14:16 #5
yes vil det være et problem ?
Avatar billede olebole Juniormester
10. februar 2006 - 14:21 #6
<ole>

Du bør altid undgå dynamisk skift af CSS-klasser, da det performer elendigt i de fleste scenarier ... så du bør under alle omstændigheder nok skrive scriptet om fra bunden  :)

/mvh
</bole>
Avatar billede henriksteen Nybegynder
10. februar 2006 - 15:48 #7
Hmmm. Det er bare et spørsmål om å plassere IMG ('openPic' 'closedPic') til høyre i stedet for nåværende til venstre -- insertObjectBefore... After...? alignRight?? Jeg kan ikke programmeringsspråk! Burde ikke det være mulig å endre i eksisterende script?
Avatar billede horsmark Nybegynder
10. februar 2006 - 15:56 #8
sikkert :-) men nok nemmere og hurtigere at bygge sit eget ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester