Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Frame Onload

  1. #1

    Frame Onload

    Scusate per il doppio post...
    spero sia almeno un modo per venire "letta e risposta".

    Data una pagina con tanti frame, devo risalire a quale
    effettivamente è stato caricato.
    Le pagine non le creo io, altrimenti potrei fare nella
    onload di ognuna un'alert "ho caricato tale pagina".
    Posso solo manipolarle attraverso il dom.

    Ho messo una funzione che nell'onload del frameset (pagina
    index) scorre tutti i frame e imposta onload alla funzione
    che stampa il nome della pagina.

    Ora ho 2 problemi.
    Il primo, è che non funziona... cioè non va a modificarmi
    l'evento onload!! qualche idea? (ho come l'impressione che
    non finisca di caricare la pagina..)

    Il secondo si porrebbe se il primo fosse risolto.

    Se ho frame annidati, ma dichiarati tutti in una pagina
    tramite il dom ci accedo con frames[0], frames[1]...
    mentre io pensavo che funzionasse il frames[0].frames[1]..
    giusto? e mi andrebbe anche bene. il problema è che
    ho frame che hanno come src pagine che hanno frame, e così
    via. e come faccio ad accedere a quelli interni!?!?!?

    il codice è questo:


    <html>
    <head>

    <script type="text/javascript" language="Javascript">

    function loaded()
    { alert("Ho caricato"); }

    function modificaOnload() {

    var frs = document.getElementsByTagName('frame');

    for (i = 0; i < frs.length; i++) {
    var frame = frs[i];
    name = frame.getAttribute('name');
    alert("Opero su frames["+i+"] = "+name);
    frame.onload = loaded;
    }

    }

    </script>

    </head>


    <frameset cols="10%,*" onload="modificaOnload()">
    <frame name=a src="http://www.google.it">
    <frameset rows="80%,*" >
    <frameset cols="10%,*">
    <frame name=c src="http://www.google.it">
    <frameset rows="50%,*">
    <frame name=d src="http://www.google.it">
    <frame name=e src="http://www.google.it">
    </frameset>
    </frameset>
    <frame name=b src="http://www.google.it">
    </frameset>
    <noframes>

    <body>



    La pagina corrente utilizza i frame. Questa caratteristica non è supportata
    dal browser in uso.</p>

    </body>
    </noframes>
    </frameset>

    </html>

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Alcune note:
    1. la parola "frame" come pure "frames" e` riservata:" usandola come nome di una variabie puoi incorrere in comportamenti imprevedibili.

    2. tutti i frame definiti dentro un frameset fanno parte della stessa collezione, quindi se nella finestra top c'e` un frameset, tutti i suoi frame vengono indirizzati in uno dei seguenti modi:
    top.NOMEFRAME
    top.frames['nomeframe']
    top.frames[N] // dove N va da 0 al max-1

    Se invece in una pagina dentro un frame c'e` un nuovo frameset, i frame di questo fanno parte di una collezione nuova, che dipende dalla collezione precedente:
    top.NOMEFRAMEPRINC.NOMEFRAMESECOND.
    (con le stesse opzioni di sintassi di cui sopra).


    Per la risposta al primo quesito, dovresti prima sostituire il nome della variabile frame, dato che personalmente ho una riserva grossa su tale nome.

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    1. la parola "frame" come pure "frames" e` riservata:" usandola come nome di una variabie puoi incorrere in comportamenti imprevedibili.
    Mi era venuto il dubbio.. infatti l'ho cambiato.. ma niente...
    non mi imposta ancora la onload. (se in un qualunque frame
    scelgo un link di google non appare il messaggio)

    2. tutti i frame definiti dentro un frameset fanno parte della stessa collezione, quindi se nella finestra top c'e` un frameset, tutti i suoi frame vengono indirizzati in uno dei seguenti modi:
    top.NOMEFRAME
    top.frames['nomeframe']
    top.frames[N] // dove N va da 0 al max-1
    Infatti così riesco ad accervi, ma solo per farmi stampare il
    nome.. già se provo ad accedere al rispettivo document
    mi da null (top.frames[0].document == null, anche con
    top.sinistra.* mi da errore, come se non trovasse il frame
    con tale nome, ma esiste!!!)

    Se invece in una pagina dentro un frame c'e` un nuovo frameset, i frame di questo fanno parte di una collezione nuova, che dipende dalla collezione precedente:
    top.NOMEFRAMEPRINC.NOMEFRAMESECOND.
    (con le stesse opzioni di sintassi di cui sopra).
    Come detto sopra, non riesco ad accedere al frame in se..
    quindi neanche ai frame "figli".
    Ad es, il seguente codice non mi da il numero dei sotto frame,
    anche se la pag. contiene frame!!

    function modificaOnload() {
    var frs = document.getElementsByTagName('frame');
    for (i = 0; i < frs.length; i++) {
    var fr = frs[i];
    name = fr.getAttribute('name');
    alert("Opero su frames["+i+"] = "+name);
    fr.onload = loaded;
    var frs2 = fr.document.getElementsByTagName('frame');
    if (frs2!=null) alert(frs2.length);
    }
    }

    OR ORA MI SORGE UN DUBBIO : non dovrebbe esserci
    differenza tra
    .. = document.getElementsByTagName('frame');
    e
    .. = window.frames;


    e quindi anche tra (visto che frames[] è un window)

    .. = fr.document.getElementsByTagName('frame');
    e
    .. = fr.frames;


    allora perche mi danno risultati diversi?!?!?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so cosa sia window.frames[] . Dipende dal contesto.

    Devi usare top.frames[] .

    Lo stesso dovrebbe valere per getElementById() e getElementByTagName()

    usa top.getElementByTagName()

    oppure, meglio, getElementById()

    Ciao
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Non so cosa sia window.frames[] . Dipende dal contesto.
    Devi usare top.frames[] .
    Window è la stessa cosa di top!!

    Lo stesso dovrebbe valere per getElementById() e getElementByTagName()
    usa top.getElementByTagName()
    oppure, meglio, getElementById()
    Vanno tutti applicati a un document, non ad una window (=top).
    semmai si usa window.document.getXXX, ma window puo essere anche
    omesso perchè è scontato.. se però fai top.document.getxxx
    dice che il metodo non è supportato...

    e vuoi sapere l'ultima?!

    se faccio
    fr = document.getElementsByTagName("frame")
    mi ritorna la stessa cosa di
    fr.getElementsByTagName("frame")

    quindi non riesco a percorrere l'annidamento,
    allo stesso modo di frames[0].frames[1]!!!!!

    Grazie mille cmq per l'impegno!


    p.s:
    gerarchia del dom

    window --has--- frames[] --isa--- window
    --has--- top --isa--- window
    --has--- parent --isa--- window
    --has--- document
    --has--- link[]
    --has--- anchor[]
    ...

  6. #6
    posto che la pagina che richiamo nei miei frame è
    mia, non vedo perche non posso accedervi.

    secondo me i problemi sono questi:
    1.
    si dovrebbe accedere ai frame direttamente con
    frs = window.frames;
    invece devo fare frs = document.getElementByTagName("frame")
    senno non funziona.
    quindi anche quando cerco di fare
    frs_int = fr.frames (dove fr = frs[i]) non posso pretendere
    chissachè, ma mi aspetto che con l'escamotage di prima
    funzioni.
    invece no: se faccio
    frs_int = fr.document.getElementByTagName("frame") non mi ritorna la cosa giusta. se controllo con frs_int == frs
    trovo che sono identici!!!!

    2.
    ma non mi scoraggio. provo ad accedervi esplicitamente,
    con top.p.c e settare l'evento. e cosa ottengo? un bel niente!!!

  7. #7
    Ciao la soluzione è tanto semplice e banale...

    basta solo guardare un pochino il codice per vedere l'errore...

    codice:
    <frameset cols="10%,*" onload="modificaOnload()"> 
    <frame name=a src="http://www.google.it"> 
    <frameset rows="80%,*" > 
    <frameset cols="10%,*"> 
    <frame name=c src="http://www.google.it"> 
    <frameset rows="50%,*"> 
    <frame name=d src="http://www.google.it"> 
    <frame name=e src="http://www.google.it"> 
    </frameset> 
    </frameset> 
    <frame name=b src="http://www.google.it"> 
    </frameset>
    E' giusta l'osservazione di non utilizzare le parole riservate...ma il nome del frame deve essere scritto così:
    codice:
    <frame name='a'  src="http://www.google.it">
    Prova e vedrai che funzia tutto!!!

    Ciauz

  8. #8
    guarda, ti ringrazio per l'informazione..
    ma non penso che sia quello il problema..
    funziona, o meglio, non funziona, uguale.


  9. #9
    Ho risolto con un piccolo sotterfugio il mio problema di passare un argomento ad un listener di eventi... usando.. uno switch.
    Non è proprio quello che volevo :master: , ma intanto funziona :bubu: . Invio il frammento di codice così se qualcuno vuole darci un'occhiata e sa come risolverlo... grazie e a presto

    function loaded0()
    { alert("Ho caricato "+top.p.frames[0].location.href+" in frames[0]="+top.p.frames[0].name); }
    function loaded1()
    { alert("Ho caricato "+top.p.frames[1].location.href+" in frames[1]="+top.p.frames[1].name); }
    function loaded2()
    { alert("Ho caricato "+top.p.frames[2].location.href+" in frames[2]="+top.p.frames[2].name); }
    function loaded3()
    { alert("Ho caricato "+top.p.frames[3].location.href+" in frames[3]="+top.p.frames[3].name); }
    function loaded4()
    { alert("Ho caricato "+top.p.frames[4].location.href+" in frames[4]="+top.p.frames[4].name); }


    function modificaOnload() {

    var frs = top.p.document.getElementsByTagName('frame');
    for (var i = 0; i < frs.length; i++) {
    var fr = frs[i];
    var name = fr.name;
    //alert("Opero su frames["+i+"] = "+name);
    switch (i) {
    case 0:
    addListener(fr,"load",loaded0);
    break;
    case 1:
    addListener(fr,"load",loaded1);
    break;
    case 2:
    addListener(fr,"load",loaded2);
    break;
    case 3:
    addListener(fr,"load",loaded3);
    break;
    case 4:
    addListener(fr,"load",loaded4);
    break;
    }

    }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.