Avatar billede mira96ac Novice
13. september 2006 - 17:51 Der er 20 kommentarer og
1 løsning

Sætte fokus på iframe

Hej

Jeg ved ikke lige om det er det rigtige forum, men jeg prøver.

Jeg har en side med en menu som viser/skjuler en div når der trykkes på linket.

I den ene div har jeg en iframe.

Problemet er at når jeg trykker på mit menupunkt, vises min div fint nok og også iframen. Men det som er i iframen (en ekstern side) er ikke aktiveret/i fokus. Dvs. at det galleryscript jeg vil køre i iframen ikke virker.

Kan man ved klik på linket på hovedsiden få iframen til at tage fokus når man viser den pågældende div, eller kan man lave en kode som refresher den eksterne side en gang når man viser iframen.

Forstår i mit problem og kan nogle hjælpe.
Avatar billede mclemens Nybegynder
13. september 2006 - 19:43 #1
Hvad med:


test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<style type="text/css">
#skjul{display:none;}
</style>

<script type="text/javascript">
function vis(t){
  document.getElementById(t).style.display="block";
  framenavn.focus();
}
</script>

</head><body>

<b onclick="vis('skjul');">Turn me on ...</b>

<div id="skjul">
<iframe name="framenavn" src="iframe.html"></iframe>
</div>
</body></html>









iframe.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<script type="text/javascript">
window.onfocus=function(){
  alert("ok");
  window.focus=function(){};
}
</script>

</head><body>
Hej, hej ...
</body></html>


...

Ved dog ikke om script delen skal focusere på body istedet?

<script type="text/javascript">
function vis(t){
  document.getElementById(t).style.display="block";
  framenavn.document.body.focus();
}
</script>

... script delen i iframe.html var kun for at teste at fokus bliver sat...
Avatar billede mira96ac Novice
13. september 2006 - 20:20 #2
Jeg er ikke så skrap til det her, så jeg tror ikke jeg forstår hvad jeg skal gøre:

Her er min skjul/vis funktion:

<script type="text/javascript">
var current = null;
function visskjul(id) {
  var elm = document.getElementById(id);
    if (elm.style.display=="block") {
    elm.style.display =  "none";
    current = null;
  } else {
    elm.style.display = "block";
    if (current != null) {
      current.style.display = "none";
    }
    current = elm;
  }

}
</script>

Her er min div som bliver vist når jeg klikker på mit link i menuen:

<div align="center" class="tabcontent" id="div8" style="display:none">
<iframe width="100%" height="85%" src="billeder1.htm" frameborder="0" scrolling="no" ></iframe>
</div>

Problemet er at billeder1.htm indeholder et gallery sript som åbenbart ikke virker før end billeder1.htm er blevet refreshed. Jeg har et link på billeder1.htm som åbner et nyt gallery i _self. og så snart jeg har trykket der så virker galleriet. men altså ikke når jeg som udgangspunkt bare viser min div
Avatar billede mclemens Nybegynder
13. september 2006 - 20:26 #3
Så prøv istedet for fokuseringen at:

<script type="text/javascript">
var current = null;
function visskjul(id) {
  var elm = document.getElementById(id);
    if (elm.style.display=="block") {
    elm.style.display =  "none";
    current = null;
  } else {
    elm.style.display = "block";


    framenavn.location.reload();


    if (current != null) {
      current.style.display = "none";
    }
    current = elm;
  }

}
</script>




og <iframe width="100%" height="85%" src="billeder1.htm" frameborder="0" scrolling="no" name="framenavn"></iframe>
Avatar billede mira96ac Novice
13. september 2006 - 20:35 #4
Det virker perfekt.

Lige et bonus spørgsmål hvis det er OK.

Hvilken kode skal jeg skrive hvis jeg allerede i hoveddokumentet vil vise en af mine div som ellers kun bliver aktiveret ved klik på menupunkter.

Altså noget ala <body onload="div2">
Avatar billede mclemens Nybegynder
13. september 2006 - 20:38 #5
<body onload="visskjul('div2')"> måske ?
Avatar billede mira96ac Novice
13. september 2006 - 20:42 #6
Ja. Det virker sådan set godt nok, at den så viser min div2, men min menu som også er baseret på en script som viser og skjuler divs virker ikke mere så.

Den står helt forvredet. Linkene virker i menuen, men den bliver vist forkert
Avatar billede mclemens Nybegynder
13. september 2006 - 20:53 #7
Ok, hvordan ser et a href link ud ?
... Opkaldet til funktionen skal startes onload med samme variabler
som når man klikker på linket - derfor skal jeg bruge en a href linje
og evt. hvad for events der er sat på det a href ...
Avatar billede mclemens Nybegynder
13. september 2006 - 20:55 #8
Hov, jeg skal ikke bruge href men et helt a tag med oplysning om hvilke
opkald til bestemte funktioner der foretages via. klik på linket og
oplysninger om hvordan disse funktioner henter oplysningerne ud som de skal
bruge og om et andet script har sat andre event handlers på linket ...
Avatar billede mira96ac Novice
13. september 2006 - 21:07 #9
Her er mit menu script: (jeg ved godt der er meget)

<style type="text/css">
    body{
        font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif;
        margin-top:5px;
        background-color: #808080;    /* Background color of main menu */           
   
    }
    .bodyText{
        padding-left:10px;
        padding-right:10px;
        border-top:1px solid #000000;   
    }
    .bodyText p{
        margin-top:5px;
    }
    #mainContainer{
        width:760px;
        height:700px;
        border:1px solid #afbec5;
    border-color:#afbec5 #afbdc5 #afbdc5 #b0bfc6;
        margin:0 auto;
    background-color: #FFF;    /* Background color of main menu */           
    background-image:url('images/logo.gif');
        background-repeat:no-repeat;
        padding-top:85px;           
    }

#mainbottom{
        width:760px;
        height:20px;
        border-left:1px solid #afbec5;
    border-bottom:1px solid #afbdc5;
        border-right:1px solid #afbdc5;   
        margin:0 auto;
    background-image:url(images/grd-1px_1.1.gif);
    background-repeat:repeat-x;       
    background-position:0 -300px;
        padding-top 685px;       
    font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif;    /* Fonts of main menu items */
        font-size:0.8em;    /* Font size of main menu items */
    color: #afbec5;    /* Text color */
    text-align: center;
    }
    #mainMenu{
        font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif;    /* Fonts of main menu items */
        font-size:0.9em;    /* Font size of main menu items */
        height:30px;    /* Height of main menu */
        background-color:#fcfcfc;    /* Background color of sub menu items */
    position:relative;    /* Don't change this position attribute */
       
    }
    #mainMenu a{
        padding-left:20px;    /* Spaces at the left of main menu items */
        padding-right:20px;    /* Spaces at the right of main menu items */
        font-weight:bold;
    background-color:#fcfcfc;    /* Background color of sub menu items */
   
        /* Don't change these two options */
        position:absolute;
        bottom:-1px;    /* Change this value to -2px if you're not using a strict doctype */
 
    }
    #submenu{       
        font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif;    /* Font  of sub menu items */
        background-color:#fbfbfb;    /* Background color of sub menu items */
    width:100%;    /* Don't change this option */
       
    border-top:1px solid #afbdc5;
        border-bottom:1px solid #b0bfc6;
   
    }   
    #submenu div{
        white-space:nowrap;    /* Don't change this option */
       
    }
    /*
    Style attributes of active menu item
    */
    #mainMenu .activeMenuItem{
        /* Border options */
        background-image:url(images/grd-1px_1.1.gif);
    background-repeat:repeat-x;       
    background-position:0 -310px;
    border-top:1px solid #afbdc5;
        border-right:1px solid #afbdc5;   
      cursor:pointer;    /* Cursor like a hand when the user moves the mouse over the menu item */
    }
    #mainMenu2 .activeMenuItem{
        /* Border options */
        background-image:url(images/grd-1px_1.1.gif);
    background-repeat:repeat-x;       
    background-position:0 -310px;
    border-left:1px solid #afbec5;
    border-top:1px solid #afbdc5;
        border-right:1px solid #afbdc5;   
      cursor:pointer;    /* Cursor like a hand when the user moves the mouse over the menu item */
    }
    #mainMenu .activeMenuItem img{
        position:absolute;
        bottom:0px;
        right:0px;
    }
       
    /*
    Style attributes of inactive menu items
    */
    #mainMenu .inactiveMenuItem{       
        color: #afbec5;    /* Text color */
    background-image:url(images/grd-1px_1.1.gif);
    background-repeat:repeat-x;       
    background-position:0 -300px;
    border-top:1px solid #afbdc5;
        border-right:1px solid #afbdc5;   
      border-bottom:1px solid #b0bfc6;
        cursor:pointer;    /* Cursor like a hand when the user moves the mouse over the menu item */
    }
    #mainMenu2 .inactiveMenuItem{       
        color: #afbec5;    /* Text color */
    background-image:url(images/grd-1px_1.1.gif);
    background-repeat:repeat-x;       
    background-position:0 -300px;
    border-left:1px solid #afbec5;
        border-top:1px solid #afbdc5;
        border-right:1px solid #afbdc5;   
      border-bottom:1px solid #b0bfc6;
        cursor:pointer;    /* Cursor like a hand when the user moves the mouse over the menu item */
    }
    #submenu a{   
        text-decoration:none;    /* No underline on sub menu items - use text-decoration:underline; if you want the links to be underlined */
        padding-left:15px;    /* Space at the left of each sub menu item */
        padding-right:5px;    /* Space at the right of each sub menu item */
        color: #afbec5;    /* Text color */
        font-size:0.9em;
   
    }
   
    #submenu a:hover{
        color: #000;    /* Red color when the user moves the mouse over sub menu items */
 
   
    }
   
    </style>
    <script type="text/javascript">
       
    var topMenuSpacer = 0; // Horizontal space(pixels) between the main menu items   
    var activateSubOnClick = false; // if true-> Show sub menu items on click, if false, show submenu items onmouseover
    var leftAlignSubItems = false;     // left align sub items t
   
    var activeMenuItem = false;    // Don't change this option. It should initially be false
    var activeTabIndex = 0;    // Index of initial active tab    (0 = first tab) - If the value below is set to true, it will override this one.
    var rememberActiveTabByCookie = false;    // Set it to true if you want to be able to save active tab as cookie
   
    var MSIE = navigator.userAgent.indexOf('MSIE')>=0?true:false;
    var Opera = navigator.userAgent.indexOf('Opera')>=0?true:false;
    var navigatorVersion = navigator.appVersion.replace(/.*?MSIE ([0-9]\.[0-9]).*/g,'$1')/1;
       
    /*
    These cookie functions are downloaded from
    http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
    */   
    function Get_Cookie(name) {
      var start = document.cookie.indexOf(name+"=");
      var len = start+name.length+1;
      if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
      if (start == -1) return null;
      var end = document.cookie.indexOf(";",len);
      if (end == -1) end = document.cookie.length;
      return unescape(document.cookie.substring(len,end));
    }
    // This function has been slightly modified
    function Set_Cookie(name,value,expires,path,domain,secure) {
        expires = expires * 60*60*24*1000;
        var today = new Date();
        var expires_date = new Date( today.getTime() + (expires) );
        var cookieString = name + "=" +escape(value) +
          ( (expires) ? ";expires=" + expires_date.toGMTString() : "") +
          ( (path) ? ";path=" + path : "") +
          ( (domain) ? ";domain=" + domain : "") +
          ( (secure) ? ";secure" : "");
        document.cookie = cookieString;
    }   
   
    function showHide()
    {
        if(activeMenuItem){
            activeMenuItem.className = 'inactiveMenuItem';    
            var theId = activeMenuItem.id.replace(/[^0-9]/g,'');
            document.getElementById('submenu_'+theId).style.display='none';
            var img = activeMenuItem.getElementsByTagName('IMG');
            if(img.length>0)img[0].style.display='none';           
        }

        var img = this.getElementsByTagName('IMG');
        if(img.length>0)img[0].style.display='inline';
               
        activeMenuItem = this;       
        this.className = 'activeMenuItem';
        var theId = this.id.replace(/[^0-9]/g,'');
        document.getElementById('submenu_'+theId).style.display='block';
       

               
        if(rememberActiveTabByCookie){
            Set_Cookie('dhtmlgoodies_tab_menu_tabIndex','index: ' + (theId-1),100);
        }
    }
   
    function initMenu()
    {
        var mainMenuObj = document.getElementById('mainMenu');
        var menuItems = mainMenuObj.getElementsByTagName('A');
        if(document.all){
            mainMenuObj.style.visibility = 'hidden';
            document.getElementById('submenu').style.visibility='hidden';
        }       
        if(rememberActiveTabByCookie){
            var cookieValue = Get_Cookie('dhtmlgoodies_tab_menu_tabIndex') + '';
            cookieValue = cookieValue.replace(/[^0-9]/g,'');
            if(cookieValue.length>0 && cookieValue<menuItems.length){
                activeTabIndex = cookieValue/1;
            }           
        }
       
        var currentLeftPos = 0;
        for(var no=0;no<menuItems.length;no++){           
            if(activateSubOnClick)menuItems[no].onclick = showHide; else menuItems[no].onmouseover = showHide;
            menuItems[no].id = 'mainMenuItem' + (no+1);
            menuItems[no].style.left = currentLeftPos + 'px';
            currentLeftPos = currentLeftPos + menuItems[no].offsetWidth + topMenuSpacer;
           
            var img = menuItems[no].getElementsByTagName('IMG');
            if(img.length>0){
                img[0].style.display='none';
                if(MSIE && !Opera){
                    img[0].style.bottom = '-1px';
                    img[0].style.right = '-1px';
                }
            }
                       
            if(no==activeTabIndex){
                menuItems[no].className='activeMenuItem';
                activeMenuItem = menuItems[no];
                var img = activeMenuItem.getElementsByTagName('IMG');
                if(img.length>0)img[0].style.display='inline';   
                           
            }else menuItems[no].className='inactiveMenuItem';
            if(!document.all)menuItems[no].style.bottom = '-1px';
            if(MSIE && navigatorVersion < 6)menuItems[no].style.bottom = '-2px';
           

        }       
       
        var mainMenuLinks = mainMenuObj.getElementsByTagName('A');
       
        var subCounter = 1;
        var parentWidth = mainMenuObj.offsetWidth;
        while(document.getElementById('submenu_' + subCounter)){
            var subItem = document.getElementById('submenu_' + subCounter);
           
            if(leftAlignSubItems){
                // No action
            }else{                           
                var leftPos = mainMenuLinks[subCounter-1].offsetLeft;
                document.getElementById('submenu_'+subCounter).style.paddingLeft =  leftPos + 'px';
                subItem.style.position ='absolute';
                if(subItem.offsetWidth > parentWidth){
                    leftPos = leftPos - Math.max(0,subItem.offsetWidth-parentWidth);    
                }
                subItem.style.paddingLeft =  leftPos + 'px';
                subItem.style.position ='static';
                   
               
            }
            if(subCounter==(activeTabIndex+1)){
                subItem.style.display='block';
            }else{
                subItem.style.display='none';
            }
           
            subCounter++;
        }
        if(document.all){
            mainMenuObj.style.visibility = 'visible';
            document.getElementById('submenu').style.visibility='visible';
        }       
        document.getElementById('submenu').style.display='block';
    }
    window.onload = initMenu;   
    </script>
<script type="text/javascript">
var current = null;
function visskjul(id) {
  var elm = document.getElementById(id);
    if (elm.style.display=="block") {
    elm.style.display =  "none";
    current = null;
  } else {
    elm.style.display = "block";


    billeder.location.reload();


    if (current != null) {
      current.style.display = "none";
    }
    current = elm;
  }

}
</script>

Og her er min menu:

<div id="mainContainer">
<!-- This is the start of the menu -->
<div id="mainMenu" >
    <a >Punkt 1</a>
    <div id="mainMenu2" >
  <a>Punkt 2</a>
    <a>Punkt 3</a>
</div>
</div>

<div id="submenu">
    <!-- The first sub menu -->
    <div id="submenu_1">
        <a href="#" onclick="visskjul('div1')">Underpunkt1</a>
    </div>
    <!-- Second sub menu -->
    <div id="submenu_2">
        <a href="#" onclick="visskjul('div2')">Underpunkt2</a>
    <a href="#" onclick="visskjul('div3')">Underpunkt3</a>
        <a href="#" onclick="visskjul('div4')">Underpunkt4</a>
  <a href="#" onclick="visskjul('div5')">Underpunkt5</a>
    <a href="#" onclick="visskjul('div6')">Underpunkt6</a>

    </div>
    <!-- Third sub menu -->
    <div id="submenu_3">
    <a href="#" onclick="visskjul('div7')">Underpunkt7</a>
        <a href="#" onclick="visskjul('div8')">Underpunkt8</a>
        <a href="#" onclick="visskjul('div9')">Underpunkt9</a>
    </div>


</div>
<br>
<div id="div1" class="tabcontent" style="display:none">
<iframe width="100%" height="85%" src="minside.htm" frameborder="0"></iframe>

</div>
Avatar billede mclemens Nybegynder
13. september 2006 - 22:04 #10
Jeg tror det er fordi du har en window.onload ... window.onload
og body onload konflikter med hinanden ... så måske:

window.onload = initMenu; til slut i scriptet

rettes til:

window.onload = function(){initMenu();visskjul('div1');};

alternativt kan du prøve at fjerne

window.onload = initMenu; til slut i scriptet

og skrive <body onload="initMenu();visskjul('div1');">
Avatar billede mclemens Nybegynder
13. september 2006 - 22:05 #11
Undskyld den sene respons :)
Avatar billede mclemens Nybegynder
13. september 2006 - 22:06 #12
22:04:49, hjalp ved min lokale test - men om det virker
i forbindelse med resten af sitet's design ved jeg ikke...
Avatar billede mira96ac Novice
13. september 2006 - 22:15 #13
window.onload = function(){initMenu();visskjul('div1');};

Ovenstående virker perfekt.

Og du behøver da ikke undskylde den sene respons, du hjælper mig jo.

Lige en lille bemærkning til mit oprindelige spørgsmål. Efter at jeg har tilføjet

framenavn.location.reload();

så er min menu, når jeg har mouseover (farveskift) lige blevet to sekunder langsommere. Siger det dig noget hvorfor ?
Avatar billede mclemens Nybegynder
13. september 2006 - 22:58 #14
Den kan jeg ikke lige sige ...
... Jeg kan ikke lige se det i min
lokale test - om det er fordi jeg ikke har
siden læggende eksternt på nettet eller om jeg
mangler noget ved jeg ikke helt ...

evt. kan du sætte timeout på kaldet til refresh af
billede framen men om det hjælper på det ved jeg ikke ...
window.onload = function(){initMenu();setTimeout("visskjul('div1');",100);};
... Et link til siden kan måske hjælpe i denne sammenhæng ...
Avatar billede mira96ac Novice
14. september 2006 - 08:29 #15
OK. det overlever jeg nok.

Nu har jeg lige lagt min side på min computer på arbejdet og nu virker fokus på iframen ikker mere ???

Jeg bruger den nye beta version af ie derhjemme og her på arbejdet har jeg ie 6.0
Avatar billede mclemens Nybegynder
14. september 2006 - 08:44 #16
Tør ikke sige hvorfor ... IE 6 virker hos
mig - men jeg har heller ikke IE 7 endnu ...

Du kan evt. sætte
<script type="text/javascript">
window.onfocus=function(){
  alert("ok");
}
</script>

Ind på den i siden som vises i den frame som scriptet
forsøger at sætte i focus og så se om alert'en kommer
... Hvis den gør det så virker fokusseringen ...

eller måske timeout på
setTimeout("billeder.location.reload();",100); // måske flere ms. ?

- Kast evt. selv et svar jeg kan ikke hjælpe med IE 7 beta...
Avatar billede mclemens Nybegynder
14. september 2006 - 08:53 #17
- Hvis fejlen også viser sig i Firefox kan jeg kigge på det iaften
hvis du lægger en fuldt eksempel så jeg kan se fejlen eller et link
til siden så jeg kan se den...
Avatar billede mira96ac Novice
14. september 2006 - 09:00 #18
Fokuseringen er OK og alerten kommer fint.

Men alligevel kan jeg ikke anvende mit gallery script ???

Meget mærkeligt.

Du får selvfølgelig point. Så roder jeg selv lidt videre med det
Avatar billede mclemens Nybegynder
14. september 2006 - 09:42 #19
Tak for point :) , Håber du får løst den i IE 7 ...
Avatar billede mira96ac Novice
14. september 2006 - 09:57 #20
Jeg har lige fundet ud af det.

Jeg havde glemt et gammelt stykke kode i mit dokument som vises i iframen. Det var fra igår hvor jeg selv prøvede at lege lidt.

Det virker perfekt nu.
Avatar billede mclemens Nybegynder
14. september 2006 - 10:03 #21
Ok, fedt nok :o)
( var lige ved at blive nervøs for
hvilke ændringer IE 7 kom med :D )
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