Avatar billede Noam-9 Praktikant
27. marts 2003 - 20:22 Der er 9 kommentarer og
1 løsning

Begrænse script til div-tag

Jeg bruger nedenstående til at bestemme om links skal åbnes i '_self', '_blank' eller 'onewin'. Brugeren kan i sin profil selv bestemme hvad han/hun foretrækker.

******************************************************
function targetLinks(userdef)
{ if (userdef)
    where = userdef;
  else
    where = "_self";
  for (var i=0; i<=(document.links.length-1); i++)
  { document.links[i].target = where;}
    }
******************************************************
Scriptet virker egentlig fint nok, bortset fra at det kun er links på en bestemt del af siden det skal gælde.
Strukturen er lavet som nedenstående:
******************************************************
<body onload="targetLinks('<%=session("wind")%>');">

<div id=firstleft>

<div id=msg>
<div id=cont>link_ok</div>
<div id=stamp>link_nej</div>
</div>

<div id=msg>
<div id=cont>link_ok</div>
<div id=stamp>link_nej</div>
</div>

<div id=msg>
<div id=cont>link_ok</div>
<div id=stamp>link_nej</div>
</div>

</div>

<div id=secondleft>
</div>
</body>
******************************************************
Det skal altså kun gælde for de links der er i det div-tag der hedder id=cont.

Hvordan kan man gøre det?
Avatar billede olebole Juniormester
27. marts 2003 - 22:07 #1
<ole>

Du laver et array med div'ets links:

var divLinks = document.getElementById("firstleft").getElementsByTagName("A");

Så anvender du det array i din for-løkke i stedet  :)

/mvh
</bole>
Avatar billede Noam-9 Praktikant
31. marts 2003 - 14:10 #2
Det kunne jeg nu ikke få til at virke, men måske jeg ikke gør det rigtigt?

function targetLinks(userdef)
{
  var divLinks = document.getElementById("firstleft").getElementsByTagName("A");
  if (userdef)
    where = "_self";
  else
    where = "_self";
  for (var i=0; i<=(divLinks.links.length-1); i++)
  {   
    divLinks.links[i].target = where;}
    }

Error msg.-->"links.length er null eller ikke et objekt"

Hvad gør jeg forkert?
Avatar billede Noam-9 Praktikant
31. marts 2003 - 14:45 #3
Jeg fik det til at virke. Men jeg må indrømme at jeg ikke helt forstår logikken i det. Ifølge DOM burde nogle af de _mange_ andre løsninger jeg prøvede vist egentlig også virke.
Anyways nu virker det, tak for hjælpen.

Løsning:
****************************************************
function targetLinks(userdef)
{
  var divLinks = document.getElementById("firstleft").getElementsByTagName("A");
  if (userdef)
    where = userdef;
  else
    where = "_self";
  for (var i=0; i<=(divLinks.length-1); i++)
  {   
    divLinks[i].target = where;}
    }
Avatar billede olebole Juniormester
31. marts 2003 - 19:40 #4
Denne del finder div'et og laver en reference til det:
  var divLinks = document.getElementById("firstleft");

Her laver vi et array af de links, der ligger i div'et - og ændrer divLinks indhold til dette array:
  divLinks = divLinks.getElementsByTagName("A");

De er blot skrevet sammen til denne linie:
  var divLinks = document.getElementById("firstleft").getElementsByTagName("A");

For-løkken kunne måske skrives lidt mere 'sexy':
  for (var i=0; i<divLinks.length; i++) {
    divLinks[i].target = (userdef)? userdef : "_self";
  }

Hvor linien:
  divLinks[i].target = (userdef)? userdef : "_self";
er en short-hand version af din if-else sætning

Det giver tilsammen funktionen:
function targetLinks(userdef) {
  var divLinks = document.getElementById("firstleft").getElementsByTagName("A");
  for (var i=0; i<divLinks.length; i++) {
    divLinks[i].target = (userdef)? userdef : "_self";
  }
}

/mvh
Avatar billede olebole Juniormester
31. marts 2003 - 19:41 #5
... og en endnu slankere:

function targetLinks(userdef) {
  var divLinks = document.getElementById("firstleft").getElementsByTagName("A");
  for (var i=0; i<divLinks.length; i++) divLinks[i].target = (userdef)? userdef : "_self";
}
Avatar billede Noam-9 Praktikant
31. marts 2003 - 19:58 #6
Ups, det virker ikke alligevel.
Måske jeg ikke beskrev strukturen helt klart i starten.
Der også links i 'stamp' men de skal ikke have ændret deres target. Og det får de med din løsning. Med min er det tilgengæld kun den første forekomst af '<div id=cont>' der bliver berørt.

Jeg prøvede med flg. men det virker slet ikke

function targetLinks(userdef)
{
  var divs = document.getElementById("firstleft").document.getElementById("cont");
  if (userdef)
    where = userdef;
  else
    where = "_self";
    for (var d=0; d<=(divs.length-1); d++)
    {
      var divLinks = divs[d].getElementsByTagName("A");
      for (var i=0; i<=(divLinks.length-1); i++)
      {   
        divLinks[i].target = where;}
        }
          }

Har du nogen forslag?
Avatar billede olebole Juniormester
31. marts 2003 - 22:17 #7
Det er noget totalt rod, du har lavet. Alle id'er på en side _skal_ være unikke. At du overhovedet kan få noget til at virke med flere, må bero på en browserbug.
Dø bør afgjort skrive siden om med unikke id'er
/mvh
Avatar billede Noam-9 Praktikant
31. marts 2003 - 22:23 #8
Ingen grund til at bryde hovedet med det mere. Siden bliver allivel genereret fra en db, så jeg har fikset det ad den vej. Det er ikke lækkert, men det virker.

<div id=cont><%=Replace(rs("besked"),"<a href=","<a target="&session("wind")&"" href=)%></div>

Tak for hjælpen under alle omstændigheder, jeg har da lært en del alligevel.
~Littleboy
Avatar billede Noam-9 Praktikant
31. marts 2003 - 22:26 #9
Hov var lige lidt lang tid om at skrive sidste post.

Hm, til det med id'er.
Det eneste jeg bruger dem til er CSS...
Avatar billede olebole Juniormester
31. marts 2003 - 22:37 #10
Det er ligegyldigt, hvad du bruger dem til ... visse browsere kan gå ned af det. Brug class i stedet ... det giver også langt bedre performance. Det er langsomt at tildele et element style-properties via en id.
/mvh
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

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