Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [focus browser e richiamo javascript da applet

    ciao ragazzi.

    Vorrei chiedervi:

    - come fa Javascript(con quale istruzione) per controllare (true o false) se la finestra del browser, che visualizza la pagina web su cui la funzione risiede, è in primo piano? (ovvero se ha il focus)

    - come fa una applet a richiamare una funziona javascript presente sulla pagina web su cui la applet gira?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Per il focus, meglio se posti direttamente in javascript.
    Per l'altra questione, avevo postato molto tempo fa un piccolo esempio di interazione applet/javascript

    http://forum.html.it/forum/showthrea...let+javascript

    questo è collegato alla pressione di determinati JButton nell'applet, ma nulla vieta di applicare lo stesso principio (showDocument di AppletContext) in altro luogo nell'applet.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    nella pagina considerata, la applet è invisibile, non ci sono quindi pulsanti ecc.. ma ha la funzione di aprire un socket ecc..

    nel metodo init() della applet vorrei una istruzione che mi richiama una funzione javascript creata da me e che sta nella pagina web dove la applet risiede.

    supponiamo che la funzione sia



    codice:
    <script type="text/javascript">
    
    function funzione() {
    ...
    };
    
    </script>
    come faccio da dentro il metodo init() a richiamarla?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da soundsgood
    nel metodo init() della applet vorrei una istruzione che mi richiama una funzione javascript
    Io farei il contrario: javascript notifica la applet quando la finestra riceve/perde il focus. Perché la interazione è più semplice.

    Molto "abbozzato" (verifica poi tu) nella pagina HTML:

    codice:
    <script>
    function setup() {
        window.onfocus = riceveFocus;
        window.onblur = perdeFocus;
    }
        
    function riceveFocus() {
        document.applets[0].riceveFocus();
    }
    
    function perdeFocus() {
        document.applets[0].perdeFocus();
    }
    </script>
    
    ....
    
    <body onload="setup()">
    
    ...
    
    <applet code="TuaApplet.class" ...... >
    La tua classe che estende Applet/JApplet deve semplicemente avere 2 metodi pubblici riceveFocus() e perdeFocus(), che sono quelli invocati da Javascript sulla prima applet nel documento.

    In linea di massima dovrebbe essere ok (a meno delle solite, possibili, incongruenze tra browser vari).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    il dubbio sarebbe:
    la funzione setup viene attivata ogni volta che la pagina prende o perde il focus? o solo una volta al caricamento iniziale della pagina?

    se è la prima allora è ok..

    se ci stava una istruzione diretta (ovvero senza abbinarla a pulsanti o che) che richiamasse dall'applet una funzione javascript era un attimo

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da soundsgood
    la funzione setup viene attivata ogni volta che la pagina prende o perde il focus? o solo una volta al caricamento iniziale della pagina?
    Solo al caricamento della pagina (onload appunto).

    Originariamente inviato da soundsgood
    se è la prima allora è ok..
    No è la seconda ... ma quale è il problema? Al caricamento il setup() assegna le funzioni per gli eventi onfocus/onblur ... ed è questo che conta. Perché da lì in avanti sono le due funzioni javascript riceveFocus e perdeFocus che vengono chiamate di volta in volta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    si il codice funziona.. per provarlo invece di utilizzare le istruzioni per i metodi della applet ho provato con una semplice sostituzione del colore dello sfondo della pagina web e funziona.


    codice:
    function setup() {
    	
        window.onfocus = riceveFocus;
        window.onblur = perdeFocus;
    }
        
    function riceveFocus() {
       document.bgColor = '#0000FF';
    }
    
    function perdeFocus() {
        document.bgColor = '#00FF00';
    }

    se invece utilizzo i medoti della applet, la pagina web si blocca e si impalla..

    codice javascript:
    codice:
    function setup() {
    	
        window.onfocus = riceveFocus;
        window.onblur = perdeFocus;
    }
        
    function riceveFocus() {
       document.applets[0].riceveFocus();
    }
    
    function perdeFocus() {
    	document.applets[0].perdeFocus();
    }


    Lo scopo della applet è quella di aprire un socket e rimanere in ascolto.. Quando arriva un messaggio ("ref") fa il refresh della pagina web in cui si trova. Questo refresh lo si vuole solo se la pagina non ha il focus (da qui l'esigenza delle funzioni javascript che facciano il test se il browser è in primo piano, dato che con la applet non ci riesco a verificare questa condizione)
    Quindi l'idea è che le funzioni javascript aggiornino l'attributo "focus" della applet continuamente in modo che quando il messaggio "ref" arriva l'applet vede se "focus" è true o false.

    Il problema è come detto che il tutto si impalla.. e la pagina web si blocca. (forse perche l'applet è bloccata nell'attesa del messaggio? e non puo eseguire altre istruzioni?)

    posto il codice della applet, il codice di interesse è in grassetto:
    codice:
    <applet code="ClassApplet.class"  width=0 height=0> </applet>
    
    import java.io.*; 
    import java.net.*; 
    import java.util.*;
    
    
    
    import java.applet.Applet;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.Socket;
    import java.net.URL;
    
    import java.applet.*;
    import java.awt.*;
    import java.*;
    
    import java.lang.Object;
    
    public class ClassApplet extends Applet{
    	
    	private URL url = null;
    	private String pageURL="http://localhost:8080/SM4ALL/index.jsp";
    	private MulticastSocket socket;
    	
    
    private boolean focus = false;
    	
    public void riceveFocus() {
    	focus = true;
    	System.out.println("focus: " + focus);
    }
    
    public void perdeFocus() {
    	focus = false;
    	System.out.println("focus: " + focus);	
    }
    
    public boolean getFocus() {
    	return focus;
    }
    
    
    
    public void init()  {
    	super.init();
    	
    	
    	
    	System.out.println("init()");
    	
    	
    	
    	
    	
    
    	
    	try {
    	
    		socket = new MulticastSocket(5009);
    		}
    	
    		catch (IOException e) {
    			
    			e.printStackTrace();	
    		}
    
    	
    	try {
    		
    		
    	
    		
    		InetAddress group = InetAddress.getByName("230.0.0.9");
    		System.out.println("Eseguito inet");
    		socket.joinGroup(group);
    		
    		System.out.println("joingroup");
    		
    		byte[] buf = new byte[255];
    		DatagramPacket packet;
    		System.out.println("datagram");
    		packet = new DatagramPacket(buf, buf.length);  
    				
    			System.out.println("getdocument: " + getDocumentBase());
    			System.out.println("");
    			System.out.println("");
    			System.out.println("while");
    			System.out.println("Attesa dal server");
    			
    			socket.receive(packet);
    			
    			
    			String received = new String(packet.getData());
    			String messaggio = received.substring(0,3);
    			
    			 if(messaggio.equals("ref") ) {
    				System.out.println("ref ricevuto");
    				
    			
    				// refresh tramite comando applet
    				
    				if(!getFocus()) {
    					System.out.println("refres");
    					
    					
    					this.getAppletContext().showDocument(getDocumentBase());
    					socket.close();
    					System.out.println("Uscita ref");	
    				}
    		
    			} 
    			 
    		
    		} 
    	
    	catch (Exception e) {
    			
    			e.printStackTrace();
    			socket.close();
    			
    		}
    				
    		
    	}// metod 
    	
    	
    	
    	public void stop()  {
    				super.stop();
    		
    			System.out.println("Uscita stop");
    			socket.close();
    		}
    	
    	
    	
    	
    	public void destroy()  {
    				super.destroy();
    		
    			System.out.println("Uscita des");
    			socket.close();
    		}
    
    }

  8. #8
    il motivo per cui si impalla è che la applet, mentre rimane in ascolto sul socket, non puo eseguire altre istruzioni, come l'aggiornamento dell'attributo focus.

    Per questo ho pensato di creare un thread nella applet.. in modo che dovrei avere due thread in totale giusto?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da soundsgood
    il motivo per cui si impalla è che la applet, mentre rimane in ascolto sul socket, non puo eseguire altre istruzioni, come l'aggiornamento dell'attributo focus.
    Il init() viene invocato nel contesto di un thread creato appositamente (che non è tra l'altro di certo il EDT). Ma il init() chiaramente deve terminare (e il più presto possibile, sarebbe meglio). Tu lo stai tenendo impegnato (troppo). Non è nel init() che devi fare operazioni "lunghe".

    Anche per quanto riguarda riceveFocus()/perdeFocus() ci sono questioni con i thread. Da JavaScript vengono invocati sulla applet nel contesto di un thread particolare (quale sia potrebbe anche non interessare) ma anche qui non è di certo il EDT.
    Essi aggiornano la variabile 'focus'. Se il getFocus() è fatto da un altro thread es. il EDT o, nel tuo caso, uno "tuo" dove farai la gestione, ci possono essere problemi.
    Quindi in questi casi bisogna cercare di stare il più possibile "dalla parte dei bottoni". Dovrebbe bastare dichiarare la variabile 'volatile' o meglio ancora marcare quei metodi come synchronized.

    Come al solito ribadisco che le questioni sui thread sono le più complicate e anche subdole. Quindi è sempre ottima cosa capire bene la questione a fondo e cercare di fare le cose nel modo più accurato possibile.

    Le considerazioni sui thread tra JavaScript e applet Java sono oltretutto ben documentate qui:
    Thread Considerations
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    non sto capendo tanto il discorso sui thread perche non li ho quasi mai usati.. perdona la mia ignoranza..

    Per quanto riguarda il codice del socket nell'init della applet penso sia giusto.. deve rimanere in ascolto per tutto il tempo che la applet gira.

    La questione è questa: voglio che la applet faccia refresh solo se la pagina su cui si trova è in primo piano cioè ha il focus.

    Visto che un applet contemporaneamente non puo fare le due cose.. potrei mettere due applet (invisibili) nella pagina web.. una che rimanga in attesa del messaggio "ref" sul socket (e questa gia esiste e funziona) ed un altra che memorizzi lo stato della pagina (se ha il focus o no)

    Il fatto è come far comunicare la due applet? Nel senso quando arriva il messaggio di "ref", la prima applet dovrebbe chiedere alla seconda applet il suo stato (se focus è true o false)

    Esiste un modo per farle comunicare? Oppure dovrei pensare ad un'altra soluzione

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.