Avatar billede travelnow Nybegynder
13. februar 2006 - 10:13 Der er 28 kommentarer og
1 løsning

Afstand til top fra iframe

Kan man fra en side i et iframe finde ud af hvor på siden selve iframet befinder sig, alså afstanden til toppen af dokumentet.

side1.html
<body>
<br><br><br><br><br><br><br><br>
<iframe name="TestFrame" id="TestFrame" src="test2.html" width="500" height="1500"></iframe>
</body>

dvs. fra test2.html vil jeg aflæse positionen af iframen på side1.html.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 10:17 #1
Det burde være muligt, med mindre side1.html og test2.html ligger på forskellige domæner
Avatar billede Slettet bruger
13. februar 2006 - 10:18 #2
Du kan bruge Oles funktion:

function getPos (elm) {
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  return {x:zx,y:zy};
}

Eks:

var pos = getPos(document.testFrame);
alert("x=" + pos.x);
alert("y=" + pos.y);
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 10:26 #3
Ved ikke om det virker, men dette gør i hvert fald i MSIE. Læg det i test2.html:

<SCRIPT LANGUAGE=javascript>
<!--
document.write(parent.document.getElementById('TestFrame').offsetTop);
//-->
</SCRIPT>
Avatar billede Slettet bruger
13. februar 2006 - 10:31 #4
Oles funktion virker perfekt, og ikke kun i IE. Og så er det ligegyldigt hvor dybt i dokumentet, elementet er begravet, da den forsætter hele vejen til det øverste element i hierakiet.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 11:08 #5
hos mig svarer den x=0, og y=0, hvilket ikke passer .... ?
Avatar billede Slettet bruger
13. februar 2006 - 11:12 #6
Jeg vil tro du benytter den forkert så?

Prøv eventuelt følgende som eksempel:

<html>
<body>

<p><div><br><br><table><tr><td>&nbsp;&nbsp;&nbsp;<div id='hej'>hej</div></td></tr></table></div></p>

<script type="text/javascript">
obj = document.getElementById('hej');
function getPos (elm) {
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  return {x:zx,y:zy};
}
pos = getPos(obj);
document.write("x=" + pos.x + "&y=" + pos.y);
</script>

</body>
</html>
Avatar billede Slettet bruger
13. februar 2006 - 11:20 #7
- Afhængigt af browseren skulle den gerne returnere noget lignende x=(71-75) og y=(11-13)
Avatar billede travelnow Nybegynder
13. februar 2006 - 11:20 #8
cirrhosis>> Kan ikke lige få din rutine til at virke, den returnerer altid 0,0

Idanielsen>>
Virker perfekt.

Men jeg har til min skræk set at det iframe jeg skal have fat på ikke altid hedder det samme, hvis jeg skal forklare det nærmere, er det sådan at det produkt jeg udvikler altid bliver inkluderet i en iframe hos kunden, så kunden (eller kundens webmaster, får blot tilsendt iframe linien), og det er åbenbart ikke altid de bare bruger den som den er, jeg har undersøgt en 10 stykker og kan se at de nogle gange ændrer navnet og nogle gange sletter de id eller navn og en enkelt have slettet både id og navn.

Jeg har fundet ud af at i de tilfælde hvor iframet har et navn, kan jeg bruge flg. document.write(parent.document.getElementById(self.name).offsetTop);, men hvad når de ikke har et navn eller id, hvad kan jeg så gøre?
Har prøvet med parent.document.frames(0).offsetTop, men det virker ikke, det vil heller ikke være helt optimal, da kunde jo sagtens kan have flere iframe på siden.

Kan evt. smide nogle flere point, da du jo allerede har besvaret mit oprindelige spørgsmål.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 11:22 #9
Ser lige på det ...

cirrhosis > Det var det med Iframe'en du ikke havde set, ikke?
Avatar billede Slettet bruger
13. februar 2006 - 11:28 #10
Nej, jeg havde set det med iframen, men jeg satte ikke funktionen i en sammenhæng fordi det ikke lød som om problemet bestod i at kommunikere mellem to frames, men at finde den præcise position.

Hvis du bare benytter offSet vil den angive afstanden til det nærmeste element, ikke til toppen af dokumentet. Kun hvis der ingen forskel er på de to.

Som udvidelse af ovenstående eksempel, kan du/I prøve dette i stedet:

<html>
<body>

<p><div><br><br><table><tr><td>&nbsp;&nbsp;&nbsp;<div id='hej'>hej</div></td></tr></table></div></p>

<script type="text/javascript">
obj = document.getElementById('hej');
function getPos (elm) {
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  return {x:zx,y:zy};
}
pos = getPos(obj);
document.write("x=" + pos.x + "&y=" + pos.y);
document.write("<br>x=" + obj.offsetLeft + "&y=" + obj.offsetTop);
</script>

</body>
</html>

- Den udskriver øverst den fulde afstand til kanten af dokumentet, og nedenunder afstanden til kanten af elementet den er indeholdt i. Forskellen er markant.
Avatar billede travelnow Nybegynder
13. februar 2006 - 11:44 #11
cirrhosis>>
Du mangler det med at det er iframens position jeg vil finde, det med at kunne læse positionen på et element på samme side, kan jeg finde mange eksempler på.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 11:48 #12
De lykkes mig ikke at få det til at virke, måske du selv kan prøve cirrhosis.

Jeg kan nu heller ikke få mit til at virke hvis jeg ikke kender ID'et, kan du?
Avatar billede Slettet bruger
13. februar 2006 - 12:05 #13
Det tror jeg godt jeg kan løse. Giv mig lige lidt tid, så skriver jeg et eksempel.
Avatar billede Slettet bruger
13. februar 2006 - 12:21 #14
Har du mulighed for at indsætte en standardfunktion i din topfil, eller skal alt foregå i framen?
Avatar billede Slettet bruger
13. februar 2006 - 12:59 #15
Ok, såfremt du har den mulighed er der forslag til løsning her.
Det er ikke fantastisk pænt, men det er lidt svært at styre events som onload i flere frames. Den tjekker på indholdet af src i dokumentets forskellige frames, for at identificere den korrekte.

:: INDEX.HTML ::

<html>
  <head>
    <script type="text/javascript">
    <!--
      var distances = new Array;
      var checkPoint = 0;
      function getPos(elm) {
        for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
        return {x:zx,y:zy};
      }
      window.onload = function() {
        frs = document.getElementsByTagName('iframe');
        for(i = 0; i < frs.length; i++) {
          distances[frs[i].getAttribute('src')] = getPos(frs[i]).y;
        }
        checkPoint = 1;
      }
    //-->
    </script>
  </head>
  <body>
    <iframe name='asethrd' src='hoho.html' width='300px' height='200px'></iframe>
    <div style='margin: 10px;'>
      &nbsp; &nbsp;
      <iframe name='blrthrtha' src='frame.html' width='300px' height='200px'></iframe>
    </div>
  </body>
</html>

:: FRAME.HTML ::

<html>
  <head>
    <script type="text/javascript">
    <!--
      function getPos() {
        frs = parent.document.getElementsByTagName('iframe');
        for(i = 0; i < frs.length; i++) {
          frslen = frs[i].getAttribute('src').length;
          if(document.URL.substring(document.URL.length - frslen) == frs[i].getAttribute('src')) {
            document.getElementById('pixels').innerHTML = parent.distances[frs[i].getAttribute('src')];
          }
        }
      }
      function checkThePoint() {
        if(parent.checkPoint > 0) {
          getPos();
        } else {
          setTimeout("checkThePoint()", 10);
        }
      }
      window.onload = checkThePoint;
    //-->
    </script>
  </head>
  <body>
    this is your frame - it is <span id='pixels'></span>px from top
  </body>
</html>

:: HOHO.HTML ::

<html>
  <body>
    <p>&nbsp; &nbsp; &nbsp;<div>this is some other frame</div></p>
  </body>
</html>


- Koden er abstrakt nok til at du ikke behøver ændre noget, hvis du ændrer filnavn m.m.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 13:16 #16
Hvis der kun er én iframe på parent-siden, kan du nøjes med dette:

<SCRIPT LANGUAGE=javascript>
<!--
document.write(parent.document.getElementsByTagName("iframe")[0].offsetTop);
//-->
</SCRIPT>
Avatar billede Slettet bruger
13. februar 2006 - 13:17 #17
ldanielsen >> Kun hvis den iframe ligger direkte i <body> og ikke inde i andre elementer.
Avatar billede travelnow Nybegynder
13. februar 2006 - 13:18 #18
Jeg har ingen adgang til den side hvor iframen ligger, det er jo kundens egen side.
Avatar billede Slettet bruger
13. februar 2006 - 13:19 #19
Øh... Hvis de sider der skal vises i iFrame ligger på et helt andet domæne, kan du slet ikke kommunikere mellem dem af sikkerhedsårsager.
Avatar billede Slettet bruger
13. februar 2006 - 13:20 #20
- Som ldanielsen i øvrigt startede med at skrive!
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 13:26 #21
Så er det hele måske forgæves? :o(
Avatar billede travelnow Nybegynder
13. februar 2006 - 13:36 #22
Idanielsen>>
Fint, jeg kiggede selv på den kommando getElementsByTagName, men vidste ikke lige hvordan den skulle kaldes. Så med mindre du i mellemtiden har fundet en bedre løsning, har jeg nu en brugbar løsning på problemet, først kalder jeg med getElementsByid(self.name), hvis den fejler bruger jeg getElementsByTagName, på den måde vil det ikke fejle hos ret mange kunder.
De kunder som det så fejler hos vil opleve at placeringen af nogle infobokse står forkert, så det er ikke nogen katastrofe, de ringer jo højst sandsynlig, og så kan jeg jo hurtig fortælle dem hvad de skal gøre.

Så kom med et svar så du kan få dine point.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 13:58 #23
Har du hørt det med to forskellige domænenavne? Du siger at du ikke har adgang til "hovedsiden", det lyder jo som om det er på et andet domæne, og så kan du godt glemme det.
Avatar billede travelnow Nybegynder
13. februar 2006 - 13:58 #24
Jeg glemte lige at nævne at de fleste ca 2/3 af sitene har vi også selv, bare i en anden afdeling end jeg sidder i, men jeg vil/kan ikke forlange at de skal gå ind i måske 300-400 sites for at tilføje en funktion, og desuden vil det jo uanset ikke hjælpe den sidste 1/3.

Men det er godt nok træls hvis det forholder sig sådan ang. det med de forskellige domæner.
Men nu bliver det som jeg beskrev før, har ikke mere tid til at fedte rundt med det, med mindre i komme med en eller anden genial løsning
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 14:01 #25
Det forholder sig sådan, så du har ingen løsning.

Det KUNNE du jo have fortalt os fra starten.
Avatar billede roenving Novice
13. februar 2006 - 14:02 #26
Man kan dog med javascript sætte domænet, hvis de ligger på samme hoveddomæne, altså kan man sætte alles domæne til xxx.dk, hvis de ligger på det domæne eller underdomæner som aa.xxx.dk eller aa.bbb.ccc.xxx.dk, men det skal så gøres på selve siden:

<script type="text/javascript">
  document.domain = "xxx.dk";
</script>
Avatar billede travelnow Nybegynder
13. februar 2006 - 14:15 #27
Idanielsen>>
ROLIG nu, den løsning jeg har nu er en fin løsning, opgaven jeg sidder med er primært rettet mod nogle enkelte kunder, og deres site har vi. Men det forholder sig jo sådan at vi så vidt mulig altid laver vores funktioner sådan at det gælder for alle vores kunder, det er jo en forbedring vi snakker om, så det vil bare sige at den 1/3 kunder vi ikke har, kører bare videre med den (udmærkede) løsning de har på nuværende, indtil vi evt. finder en løsning.
Avatar billede travelnow Nybegynder
13. februar 2006 - 14:16 #28
roenving>>
De ligger ikke på samme hoveddomæne.
Avatar billede ldanielsen Nybegynder
13. februar 2006 - 14:38 #29
Tak for Point
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