Avatar billede tblaster Nybegynder
03. juli 2006 - 22:44 Der er 39 kommentarer og
1 løsning

Javascript erstatte billed udfra nuviste billeds navn

Hejsa

Jeg har pt. følgede kode, der opdater et billed og et element:

st = document.getElementById('el'+id+'Child').style;
st.display = (st.display!='block')?'block':'none';
document.getElementById(d.id+'pic').src = (st.display=='block')?"pics/triup.gif":"pics/tridown.gif";

Nu er det sådan at jeg gerne vil have at koden understøtter flere billeder, og jeg vil derfor gerne have udvidet ovenstående til at håndter følgende 3 eksempler:

Eks1:
pics/Button_Send_Down.gif vises og erstattes af pics/Button_Send_Up.gif.

Eks2:
pics/Button_Link_Down.gif vises og erstattes af pics/Button_Link_Up.gif.

Eks3:
pics/tridown.gif vises of skal erstattes pics/triup.gif

Og tilsvarende omvendt, således at hvis alle "up" billederne vises, så skal de erstattes af "down" billederne.

Billederne vil altid være navngivet som Button_XXX_Down.gif og Button_XXX_Up.gif og hvis de ikke er det, så er de navngivet som tridown.gif og triup.gif. Håber I kan hjælpe, og hvis det kan hjælpe jer at jeg omnavngiver mine billeder til Button_Down_XXX.gif så gør jeg gerne det.

På forhånd tak.
Avatar billede farving Nybegynder
03. juli 2006 - 22:49 #1
kan det ikke gøres vha et array?

var picturesUp = new Array()

var picturesDown = new Array()
for (x in picturesUp) {
document.getElementById(d.id+'pic').src = (st.display=='block')?picturesUp[x]:picturesDown[x];
}
Avatar billede tblaster Nybegynder
03. juli 2006 - 22:55 #2
Det kan det vel nok godt. Men da jeg kalder en js include fra mange sider, skal det være siden der selv finder ud af hvilke billeder den skal bruge, og derfor også hvad arrayet skal indeholde. Jeg har ikke mulighed for at rette alle siderne til der kalder js filen, men kun selve js filen.
Avatar billede farving Nybegynder
03. juli 2006 - 22:56 #3
kan du ikke sende navnene med via en onclick? fordi jeg antager det er billeder som bruges som en knap som man skal trykke på?
Avatar billede tblaster Nybegynder
03. juli 2006 - 23:02 #4
Min onclick er pt som følgende:
collapseExpand(this)

Og jeg kan godt ændre i den så jeg sender billednavnet med. Men det skal gerne laves såldes at hvis der ikke sendes et navn med, så benytter den standard knapperne tridown.gif og triup.gif.
Avatar billede farving Nybegynder
03. juli 2006 - 23:15 #5
kan jeg ikke få hele funktionen så kan jeg nemmere overskue det, fordi så skal der noget if..else hældes ind...

Mvh Carsten
Avatar billede tblaster Nybegynder
04. juli 2006 - 17:49 #6
function collapseExpand(d){
  var id = d.id.substring(6); 
  st = document.getElementById('el'+id+'Child').style;
  st.display = (st.display!='block')?'block':'none';
  document.getElementById(d.id+'pic').src = (st.display=='block')?"pics/triup.gif":"pics/tridown.gif";
}
Avatar billede farving Nybegynder
04. juli 2006 - 18:05 #7
function collapseExpand(d,buttonUp,buttonDown){
var picturesUp = new Array();
var picturesDown = new Array();
    if ('variablen' == "") {
        picturesUp.push("pics/triup.gif");
        picturesDown.push("pics/tridown.gif");
    }
    else {
        picturesUp.push(buttonUp);
        picturesDown.push(buttonDown);
    }
  var id = d.id.substring(6); 
  st = document.getElementById('el'+id+'Child').style;
  st.display = (st.display!='block')?'block':'none';
  for (x in picturesUp) {
  document.getElementById(d.id+'pic').src = (st.display=='block')?picturesUp[x]:picturesDown[x];
  }
}

_______
Så skal du kalde den som // Onclick="collapseExpand(d, 'link til knap op', 'billede til knap down')"
_______

Prøv om det virker...

Mvh Carsten
Avatar billede tblaster Nybegynder
04. juli 2006 - 18:11 #8
Det virker ikke. Får ingen fejl, men der sker heller ikke noget når jeg trykker på mine knapper:

onClick="collapseExpand(d, 'pics/Button_Send_Up.gif', 'pics/Button_Send_Down.gif');"
Avatar billede farving Nybegynder
04. juli 2006 - 18:11 #9
sov lige i timen... her:

function collapseExpand(d,buttonUp,buttonDown){
var picturesUp = new Array();
var picturesDown = new Array();
    if ((buttonUp == "") || (buttonDown == "")) {
        picturesUp.push("pics/triup.gif");
        picturesDown.push("pics/tridown.gif");
    }
    else {
        picturesUp.push(buttonUp);
        picturesDown.push(buttonDown);
    }
  var id = d.id.substring(6); 
  st = document.getElementById('el'+id+'Child').style;
  st.display = (st.display!='block')?'block':'none';
  for (x in (picturesUp && picturesDown)) {
  document.getElementById(d.id+'pic').src = (st.display=='block')?picturesUp[x]:picturesDown[x];
  }
}
====

Mvh Carsten
Avatar billede tblaster Nybegynder
04. juli 2006 - 18:18 #10
Så får jeg id er null eller ikke et objekt
Avatar billede tblaster Nybegynder
04. juli 2006 - 18:28 #11
Fandt fejlen. Linket skulle være:
collapseExpand(this, 'pics/Button_Link_Up.gif', 'pics/Button_Link_Down.gif', 'on')
Avatar billede tblaster Nybegynder
04. juli 2006 - 18:30 #12
Måden vi er kommet omkring de forskellige billeder giver mig et problem med følgende:

    divs = document.getElementsByTagName('DIV');
    if(closeall=='on')
    {
          for(i=0;divs.length>i;i++)
        {
            if(divs[i].id.indexOf('el')==0&&divs[i].id.indexOf('el'+id)!=0)
            {
              divs[i].style.display='none';
              document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src = "pics/tridown.gif";
              }
        }
    }

Ovenstående benyttes til at sikre at kun et div element vises på siden, men som det er nu så bliver alle andre billeder jo erstattet af standard billedet.
Avatar billede farving Nybegynder
04. juli 2006 - 18:44 #13
hmmm, kan jeg ikke umiddelbart se hvorfor...

Mvh Carsten
Avatar billede farving Nybegynder
04. juli 2006 - 22:48 #14
Må jeg spørge omhvorfor du kun vil have et div element på siden? og kunne det ikke gøres på en anden måde?

Men virker koden der skifter billedet?

Mvh Carsten
Avatar billede tblaster Nybegynder
04. juli 2006 - 22:59 #15
Koden der skifter billedet virker fint. Og årsagen til at jeg kun vil vise et elemtnt er at jeg har 2 ser skal vises samme sted.
Avatar billede farving Nybegynder
05. juli 2006 - 00:03 #16
hmm okay...

dvs du har to elementer som skal vises hvert for sig, dvs når den ene er synlig så skal den anden være "usynlig"

eller?

Mvh Carsten
Avatar billede tblaster Nybegynder
05. juli 2006 - 17:39 #17
Yep det er rigtigt. Men jeg bruger også koden et sted hvor jeg udskriver 50 elementer hvor de til tider alle skal vises.
Avatar billede farving Nybegynder
05. juli 2006 - 17:48 #18
hmmm... Den del kan jeg så ikke lige umiddelbart hjælpe med, kræver snart jeg har hele siden for at ku hjælpe der...

Skal vi lukke her eller skal vi forsøge med den del her også?

Mvh Carsten
Avatar billede tblaster Nybegynder
07. juli 2006 - 23:02 #19
Jeg vil gerne have løst det i samme omgang. Og jeg tror du har fået hele siden, men jeg kan da lige give dig en opdateret:

function collapseExpand(d,buttonUp,buttonDown,closeall){
   
    var id = d.id.substring(6);
   
    var picturesUp = new Array();
    var picturesDown = new Array();
    if ((buttonUp == "") || (buttonDown == "")) {
        picturesUp.push("pics/triup.gif");
        picturesDown.push("pics/tridown.gif");
    }
    else {
        picturesUp.push(buttonUp);
        picturesDown.push(buttonDown);
    }
   
    divs = document.getElementsByTagName('DIV');
    if(closeall=='on')
    {
          for(i=0;divs.length>i;i++)
        {
            if(divs[i].id.indexOf('el')==0&&divs[i].id.indexOf('el'+id)!=0)
            {
              divs[i].style.display='none';
              document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src = "pics/tridown.gif";
              }
        }
    }
     
    st = document.getElementById('el'+id+'Child').style;
      st.display = (st.display!='block')?'block':'none';
      for (x in (picturesUp && picturesDown))
    {
          document.getElementById(d.id+'pic').src = (st.display=='block')?picturesUp[x]:picturesDown[x];
      }
}

Det er altså den midterste del der skal justeres til. For at gøre det så nemt som muligt kan jeg ændre alle billed navne så de bliver i formatet som føglgende:
Button_Send_Up.gif

Det gør at man for hver div-tag skal finde det nuværende viste billed og erstatte Up med Down, altså Button_Send_Up.gif ->Button_Send_Down.gif
Avatar billede farving Nybegynder
08. juli 2006 - 10:34 #20
Jeg er lidt usikker på den kode, fordi jeg synes den virker underlig, men kan du i dit for loop ikke:

var img = document.getElementById('Parent' + divs[i].id.match(/\d+/g)[0]+'pic').src;
if (img.search(/Up/i) > 0) {
img = "Button_Send_Down.gif";
}
else {
img = "Button_Send_Down.gif
}

Mvh Carsten
Avatar billede tblaster Nybegynder
09. juli 2006 - 17:04 #21
Den skal erstatte "Down" med "Up" så
Button_Send_Down.gif -> Button_Send_Up.gif
Button_Link_Down.gif -> Button_Send_Up.gif
Button_XXX_Down.gif -> Button_XXX_Up.gif
Avatar billede farving Nybegynder
09. juli 2006 - 18:55 #22
var img = document.getElementById('Parent' + divs[i].id.match(/\d+/g)[0]+'pic').src;
if (img.search(/Down/i) != -1) {
img = "Button_Send_Up.gif";
}
else {
img = "Button_Send_Down.gif
}
Avatar billede tblaster Nybegynder
09. juli 2006 - 22:02 #23
Det virker vel kun hvis min knap er navngivet Button_Send_Up.gif. Det skal også virke hvis den er navngivet Button_Link_Up.gif eller ligende.
Avatar billede farving Nybegynder
09. juli 2006 - 23:14 #24
var img = document.getElementById("button" + Id).src;
if (img.search(/Up/i) != -1) {
    var imgLocation = (img.search(/Button_/i));
    imgLocation = img.slice(0, imgLocation);
    var begin = (img.search(/_/i)) + 1;
    var end = (img.search(/Up/i)) - 1;
    var part = img.slice(begin, end);
    img = imgLocation + "Button_" + part + "_Up.gif";
}
else {
    var imgLocation = (img.search(/Button_/i));
    imgLocation = img.slice(0, imgLocation);
    var begin = (img.search(/_/i)) + 1;
    var end = (img.search(/Down/i)) - 1;
    var part = img.slice(begin, end);
    img = imgLocation + "Button_" + part + "_Down.gif";
}

======

Sådan der, nu kan den skifte det :)

Mvh Carsten
Avatar billede tblaster Nybegynder
10. juli 2006 - 17:46 #25
Jeg får "Et objekt er obligatorisk" i denne linie:
if (img.search(/Up/i) != -1) {

Hvis jeg laver en alert(img) inden får jeg ikke udskrevet nogen alert på siden.
Avatar billede farving Nybegynder
10. juli 2006 - 19:01 #26
argh min fejl...

var img = document.getElementById('Parent' + divs[i].id.match(/\d+/g)[0]+'pic').src;
if (img.search(/Up/i) != -1) {
    var imgLocation = (img.search(/Button_/i));
    imgLocation = img.slice(0, imgLocation);
    var begin = (img.search(/_/i)) + 1;
    var end = (img.search(/Up/i)) - 1;
    var part = img.slice(begin, end);
    img = imgLocation + "Button_" + part + "_Up.gif";
}
else {
    var imgLocation = (img.search(/Button_/i));
    imgLocation = img.slice(0, imgLocation);
    var begin = (img.search(/_/i)) + 1;
    var end = (img.search(/Down/i)) - 1;
    var part = img.slice(begin, end);
    img = imgLocation + "Button_" + part + "_Down.gif";
}
Avatar billede tblaster Nybegynder
10. juli 2006 - 19:27 #27
Så finder den det rigtige billed (testet med alert), men jeg får ikke lukket dem som jeg skal. Istedet får jeg:

'divs[...].id.match(...).0' er null eller ikke et objekt
Avatar billede farving Nybegynder
10. juli 2006 - 21:11 #28
udskift lige alle dine '' til "" og indsæt scriptet igen... har en idé om at det godt kan skabe problemer...

Mvh Carsten
Avatar billede tblaster Nybegynder
10. juli 2006 - 21:22 #29
Så får jeg "Et Objekt var ventet". Altså ved at lave:
"Button_" + part + "_Up.gif";

Om til:
""Button_"" + part + ""_Up.gif"";

Og tilsvarrende for Down billedet.
Avatar billede tblaster Nybegynder
10. juli 2006 - 21:35 #30
Hvis jeg sætter en alert efter var img ... så får jeg fint udskrevet billed navnet. Det samme gør jeg hvis jeg udskriver en alert efter hele din stump kode. Ved ikke om det kan hjælpe dig til at fejlfinde.
Avatar billede farving Nybegynder
10. juli 2006 - 21:38 #31
tænkte mere på  ' ' om til " " dvs

var img = document.getElementById('Parent' + divs[i].id.match(/\d+/g)[0]+'pic').src;

bliver til

var img = document.getElementById("Parent" + divs[i].id.match(/\d+/g)[0]+"pic").src;

Mvh Carsten
Avatar billede tblaster Nybegynder
10. juli 2006 - 21:46 #32
Fandt ud af jeg havde en fejl omkring min if. Så nu lader der til at virke, bortset fra at den vil erstatte med et forkert billed. Koden er pt. som følgende:

    if(closeall=='on')
    {
        divs = document.getElementsByTagName('DIV');
            for(i=0;divs.length>i;i++)
        {
            if(divs[i].id.indexOf('el')==0&&divs[i].id.indexOf('el'+id)!=0) {
                    divs[i].style.display='none';
               
                var img = document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src;
                alert(img);
                var imgLocation = (img.search(/Button_/i));
                imgLocation = img.slice(0, imgLocation);
                var begin = (img.search(/_/i)) + 1;
                var end = (img.search(/Up/i)) - 1;
                var part = img.slice(begin, end);
               
                if (img.search(/Up/i) != -1) {
                    img = imgLocation + "Button_"+part+"_Up.gif";
                }
                else {
                    img = imgLocation + "Button_"+part+"_Down.gif";
                }
                alert(img);
                    document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src = img;
                  }
        }
    }

Hvor første alert giver:
Button_Link_Down.gif

Og den anden giver:
Button_Link_Down.g_Down.gif
Avatar billede tblaster Nybegynder
10. juli 2006 - 21:56 #33
Min fejl. Havde overset at der var en lille forskel i de 2 var end = (img.search(/Up/i)) - 1;  :-D

Nu fjerner den mine divs som den skal, men det er som om den ikke håndter billederne rigtigt for den ændre dem ikke som den skal.

Opdateret kode:
if(closeall=='on')
{
    divs = document.getElementsByTagName('DIV');
        for(i=0;divs.length>i;i++)
    {
        if(divs[i].id.indexOf('el')==0&&divs[i].id.indexOf('el'+id)!=0) {
                divs[i].style.display='none';
           
            var img = document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src;
            var imgLocation = (img.search(/Button_/i));
            imgLocation = img.slice(0, imgLocation);
            var begin = (img.search(/_/i)) + 1;
           
            if (img.search(/Up/i) != -1) {
                var end = (img.search(/Up/i)) - 1;
                var part = img.slice(begin, end);
                img = imgLocation + "Button_"+part+"_Up.gif";
            }
            else {
                    var end = (img.search(/Down/i)) - 1;
                var part = img.slice(begin, end);
                img = imgLocation + "Button_"+part+"_Down.gif";
            }
                document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src = img;
              }
    }
}

Du kan se det i test her:
http://www.j2f.dk/test/flash.asp?Vis=Flash&ID=1196&ParentID=0-6

Tryk på "Tip en ven" eller "Link" knapperne til højre. Når informationerne vises skal pilen pege op og den skal så pege ned når det tilhørende div felt ikke vises.
Avatar billede farving Nybegynder
10. juli 2006 - 22:39 #34
Jeg skal åbenbart logge ind for at få adgang til den side :)

Mvh Carsten
Avatar billede tblaster Nybegynder
11. juli 2006 - 21:03 #35
Det havde jeg lige glemt :-D

Du skulle kunne se den nu.
Avatar billede farving Nybegynder
11. juli 2006 - 21:27 #36
ahhh, ja det ser lidt underligt ud...

Hvor meget kendskab har du til JavaScript, for det ser ud til at den ikke ændrer andre billeder end det ene, dvs den skal have alle andre billeder og sætte dem som standard lukket?

Mvh Carsten
Avatar billede tblaster Nybegynder
11. juli 2006 - 21:45 #37
Forstår ikke lige dit spørgsmål.

Men der er kun en knap der skal vises med en pil op, og alle andre skal så vises med en pil ned.

Men hvis man trykker på en knap for at åbne div'en og så trykker igen for at lukke den, så virker det fint. På samme måde med de anden knap. Det går først galt når man trykker åbner den ene og så trykker på den anden knap.
Avatar billede tblaster Nybegynder
11. juli 2006 - 21:53 #38
Og det virker jo fint nok med at lukke de forskellige divs, således at der kun vises en på siden. Det er altså kun lige delen med billederne der går galt.

Som du skriver, så ændre den ikke billedet. Hvis jeg ændre koden til nedenstående, så får jeg ændret billedet som jeg skal, dog med en på forhånd valgt billed:
document.getElementById('Parent'+divs[i].id.match(/\d+/g)[0]+'pic').src = "pics/storknap.gif"
Avatar billede tblaster Nybegynder
11. juli 2006 - 22:00 #39
Fandt det. Knappen skal jo altid hedde XXX_Down.gif. Så det var nok at erstatte det i delen hvor der søges efter Up.

Mange tak for hjælpen, det har været rigtig godt!
Avatar billede farving Nybegynder
11. juli 2006 - 22:57 #40
ja :) og lærerigt for mig også...

Men er glad for jeg kunne hjælpe :)

Mvh Carsten
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