Newsgroup: it.comp.lang.javascript
Titolo: aggiornare da un Iframe altro iframe

Ciao a tutti,
in una pagina ho due iframe, A e B.
Quando accedo ad una determinata pagina .asp nell'iframe A verrei che
si aggiornasse la pagina .asp presente nell'iframe B.
grazie a tutti
Michele

 si aggiornasse la pagina .asp presente nell'iframe B.
onload:
 top.frames['B'].location.reload();
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

grazie, gentilissimo.
michele

  top.frames['B'].location.reload();

 mi indicate come fare l'iterazione su tutti i livelli i iframe ?
 
� una semplice funzione ricorsiva. Qualcosa del genere:
 
    function getWindowByFunctionName(name, win) {
        win = win || window;
        if (typeof win[name] === 'function')
            return win;
 
        for (var i = 0, frame; frame = win[i++];) {
            return getWindowByFunctionName(name, frame);
        }
 
        return null;
    }
 
Un esempio di uso potrebbe essere:
 
    var winWithFoo = getWindowByFunctionName('foo');
 
    if (winWithFoo)
        winWithFoo.foo();
 
Ovviamente si parte dal presupposto che:
 
1) Ogni frame rispetta la SOP (Same Origin Policy), e quindi le pagine
caricate si trovano sotto lo stesso dominio, porta e protocollo.
2) La funzione in questione � una funzione globale
3) Viene comunque restituita la prima funzione con tale nome

mi correggo, di ogni iframe conosco l'id.
 
ma come faccio ad invocare il frame mediante l'id visto che si trova annidato
dentro chissà quanti altri frame. Questa ad esempio funziona
 
	alert(typeof(parent.frames[1][3].prova));
	parent.frames[1][3].prova();
 
via firebug ho esplorato il dom della window ed ho scoperto la gerarchia dei vari frame.
operativamente dovrei iterare gli elementi frames[][][][] ...
ma qui si tratta di esplorare la gerarchia ...
 
provero' la funzione ricorsiva che mi hai proposto.
 

 provero' la funzione ricorsiva che mi hai proposto.
 
Come il buon Scartabelli mi ha fatto notare, la funzione precedente non
completava mai tutto il ciclo, quella di ora dovrebbe andare, ma non
l'ho testata, quindi possono esserci ancora eventuali errori: provala.
 
Purtroppo sono ormai piï¿½ avvezzo alla programmazione funzionale e sono
abituato a scrivere "predicati", che in questo caso, non sarebbe stata
idonea per limiti attuali delle funzioni presenti nel linguaggio ï¿½
avrebbe finito per iterare comunque tutti gli iframe di un livello,
anche una volta trovato l'elemento giusto. Bisognerï¿½ aspettare ES6.
 

         var node = document.getElementById(id);
 
Questo ovviamente ha da essere:
 
        win.document.getElementById(id);
 

 sistemarla a priori. 
 
un ingegnerizzazione dell'app così articolata deriva dal molteplice uso delle stesse pagine sia nella finestra principale che come popup, ti spiego brevemente così magari mi dai qualche dritta.
 
Dopo il login la main win del browser presenta un iframe a sinistra con menu ad albero e un iframe a destra che fa da main win per l'app. (si tratta di gestire dati di opere pubbliche)
 
es: dal menu (menu.php) seleziono "Progetti", a dx la main win (tabframe.php in cui uso jquery tabs) mi crea la linguetta "Progetti" e all'interno creo iframe con una grid, filtrabile e ordinabile con l'elenco dei progetti (mainview.php che è una pagina generica utilizzata x lo stesso scopo cui di volta in volta includo uno script php e un js dedicati x gestire le specifiche tabelle; anagrafiche varie, contratti, cantieri ecc. la stessa verrà richiamata anche per formare un popup di scelta quando in altri form dovrò scegliere dati provenienti dalle tabelle di base).
A questo punto a dx ho la grid con l'elenco dei progetti, seleziono una riga e vado in modifica o canello (o clic su icona x ins.), quindi tabframe.php apre una nuova linguetta "Progetto" crea in questa tab un iframe che richiama il form x le operazioni di editing (formmd.php). E' un form master-detail dove la parte detail (anche multi-detail) è costituita da altri tab con dentro i frame che gestiscono i vari detail mediante solite grid. Quindi avrò le tab "Progettisti", "Contratti", "Consulenti esterni" ecc. ognuna delle quali
contiene il frame con grid (detailview.php personalizzabile mediante inclusione di script php e js x le varie tabelle).
So che gli iframe sono da evitare, ma non saprei come fare altrimenti, se non agire pesantemente sull'intera architettura dell'app.
 
Grazie per l'attenzione, ogni suggerimento/critica è ben accetto.

Alla fine ho scordato di chiarire il problema ...
 
Quando dall'iframe della grid elenco progetti apro un altro tab con iframe contenente il form, le modifiche o il nuovo inserimento deve comparire nell'iframe della grid. Ecco quindi che mi serve invocare la funzione di aggiornamento (via ajax) che sta nel frame della grid.
Tutto era più semplice quando usavo finestre separate in quanto per aggiornare invocavo window.opener ed era fatta !
 
 

 Quando dall'iframe della grid elenco progetti apro un altro tab con iframe contenente il form, le modifiche o il nuovo inserimento deve comparire nell'iframe della grid. Ecco quindi che mi serve invocare la funzione di aggiornamento (via ajax) che sta nel frame della grid.
 
Dal frame puoi usare `window.parent` per accedere alla finestra parente,
non hai bisogno di iterare nulla. Volendo, potresti aprire il documento
dalla grid usando il tab iframe come target, in questo modo avresti pure
`window.opener`.
 
Sia come sia, a primo acchito, tutti questi frame sono sbagliati: "ajax"
dovrebbe essere usato per l'appunto per evitare questo genere di
situazioni. Tant'� che prima di "ajax", era un prolificare di frame.
Adesso si parla di applicazioni a pagina singola, senza iframe, e il
resto viene gestito tutto dinamicamente.
 
A ogni modo appena ho tempo legger� bene l'altro tuo post per darti
indicazioni pi� precise, ma in linea generale mi sembra questo il tuo
problema di design.
 

 Dopo il login la main win del browser presenta un iframe a sinistra con menu ad albero e un iframe a destra che fa da main win per l'app.
 
Perchï¿½ iframe e non come contenuti della stessa pagina? Usi php, puoi
tranquillamente fare la separazione delle pagine nonostante al client la
presenti su di un'unica pagina.
 
Considera che ï¿½ anche piï¿½ performante: con una pagina e due iframe, fai
tre richieste http al server, con conseguente latency, in piï¿½ c'ï¿½ il
caricamento di ognuna di esse.
 
[cut]
 
Taglio perchï¿½ i tuoi messaggi mi vengono sparati in orizzontale ï¿½ mi
viene da sospettare che il tuo newsreader non rispetti il limite di 80
colonne.
 
Il mio consiglio spassionato ï¿½: agire pesantemente sull'architettura
dell'app, come hai detto tu.
 
Gli iframe sono da evitare per problemi di sicurezza, indicizzazione,
history, etc. Anche senza riscrivere l'app da zero, sono sicuro che puoi
fare qualche passaggio intermedio: includere delle cose giï¿½ da php,
invece che client side. A livello client, usare "ajax" per richiedere le
"pagine" e fare l'inject del contenuto in dei div invece che iframe ï¿½
hai detto che usi jQuery, jQuery ï¿½ pieno di esempi cosï¿½.
 
Puoi fare una transizione abbastanza indolore, mantenendo piï¿½ o meno
l'architettura che hai, con le stesse pagine che hai. E poi, fare un
refactoring piï¿½ pesante col tempo.
 
Ma intanto, ti sei tolto gli iframe di torno.
 
 

 Ma intanto, ti sei tolto gli iframe di torno.
 
Dovrò rimboccarmi le maniche e studiare prima di lavorare.
 
Ti ringrazio, ed un augurio di un buon anno !

 Ti ringrazio, ed un augurio di un buon anno !
 
Grazie, e altrettanto. Speriamo proprio lo sia.