2012-11-14 12 views
27

Ho tre computer; Server, Client e Viewer. Ho il controllo del server e del visualizzatore. workflowCome aggiornare un browser a livello di programmazione

  1. L'utente del Client collega al Server e si presenta con una pagina web.
  2. Attraverso uno script php l'utente carica un'immagine.
  3. L'immagine è inserita in qualche html.
  4. Il Viewer è un computer totalmente privo di interazione con l'utente - non c'è la tastiera. Il Viewer è sempre in esecuzione con un browser Web, visualizzando la pagina delle immagini.

Il mio problema ora è che anche se l'immagine cambia sul disco del server, la pagina web non viene aggiornata. Come faccio ad aggiornare il browser Web sul visualizzatore o su una parte della pagina Web?

Conosco html, css, javascript, php e ajax, ma apparentemente non abbastanza bene.

+1

Ma si sta già dicendo la browser quando per aggiornare l'immagine src (ogni 5 secondi). In quale evento vuoi aggiornarlo? – devnull69

+0

Intendevi che più utenti stanno caricando immagini e ogni utente deve visualizzare sempre l'ultima immagine? – enenen

+4

c'è anche il meta tag http://www.webmonkey.com/2010/02/refresh_a_page_using_meta_tags/ – Amitd

risposta

43

Ci sono almeno tre modi per farlo.

puro HTML

Come sottolineato da Amitd 's commento, in "show.html" aggiungere il seguente tag <meta> all'elemento del documento <head>:

<meta http-equiv="refresh" content="5" /> 

Questo si aggiorna automaticamente il pagina ogni 5 secondi. Regolare il valore dell'attributo content sul numero desiderato di secondi.

Pure JavaScript:

Come sottolineato da MeNoMore, document.location.reload() sarà aggiornare la pagina quando si chiama esso.

<script type="text/javascript"> 
    //put this somewhere in "show.html" 
    //using window onload event to run function 
    //so function runs after all content has been loaded. 
    //After refresh this entire script will run again. 
    window.onload = function() { 
     'use strict'; 
     var millisecondsBeforeRefresh = 5000; //Adjust time here 
     window.setTimeout(function() { 
      //refresh the entire document 
      document.location.reload(); 
     }, millisecondsBeforeRefresh); 
    }; 
</script> 

E come ha sottolineato tpower richieste AJAX potrebbe essere utilizzato, ma avresti bisogno di scrivere un servizio Web per restituire un URL per l'immagine desiderata.La JavaScript per fare una richiesta AJAX sarebbe simile a questa:

<script type="text/javascript"> 
    //put this somewhere in "show.html" 
    //using window onload event to run function 
    //so function runs after all content has been loaded. 
    window.onload = function() { 
     'use strict'; 
     var xhr, 
      millisecondsBeforeNewImg = 5000; // Adjust time here 
     if (window.XMLHttpRequest) { 
      // Mozilla, Safari, ... 
      xhr = new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { 
      // IE 
      try { 
       // try the newer ActiveXObject 
       xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try { 
        // newer failed, try the older one 
        xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e) { 
        // log error to browser console 
        console.log(e); 
       } 
      } 
     } 
     if (!xhr) { 
      // log error to browser console 
      console.log('Giving up :(Cannot create an XMLHTTP instance'); 
     } 
     xhr.onreadystatechange = function() { 
      var img; 
      // process the server response 
      if (xhr.readyState === 4) { 
       // everything is good, the response is received 
       if (xhr.status === 200) { 
        // perfect! 
        // assuming the responseText contains the new url to the image... 
        // get the img 
        img = document.getElementById('theImgId'); 
        //set the new src 
        img.src = xhr.responseText; 
       } else { 
        // there was a problem with the request, 
        // for example the response may contain a 404 (Not Found) 
        // or 500 (Internal Server Error) response code 
        console.log(xhr.status); 
       } 
      } else { 
       // still not ready 
       // could do something here, but it's not necessary 
       // included strictly for example purposes 
      } 
     }; 
     // Using setInterval to run every X milliseconds 
     window.setInterval(function() { 
      xhr.open('GET', 'http://www.myDomain.com/someServiceToReturnURLtoDesiredImage', true); 
      xhr.send(null); 
     }, millisecondsBeforeNewImg) 
    }; 
</script> 

Altri metodi:

Infine, per rispondere alla tua domanda a cui rispondere tpower s' ... $.ajax() sta usando jQuery per fare il Chiamata AJAX. jQuery è una libreria JavaScript che rende le chiamate AJAX e la manipolazione DOM molto più semplici. Per utilizzare la libreria jQuery, avresti bisogno di includere un riferimento ad esso nel vostro <head> elemento (versione 1.4.2 utilizzato come esempio):

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 

Si potrebbe anche scaricare il "jquery.min.js" e lo ospitano localmente, ma questo, ovviamente, cambierà solo l'URL da cui è stato caricato lo script.

La funzione AJAX sopra, quando scritto usando jQuery sarebbe più simile a questo:

<script type="text/javascript"> 
    //put this somewhere in "show.html" 
    //document.ready takes the place of window.onload 
    $(document).ready(function() { 
     'use strict'; 
     var millisecondsBeforeNewImg = 5000; // Adjust time here 
     window.setInterval(function() { 
      $.ajax({ 
       "url": "http://www.myDomain.com/someServiceToReturnURLtoDesiredImage", 
       "error": function (jqXHR, textStatus, errorThrown) { 
        // log error to browser console 
        console.log(textStatus + ': ' + errorThrown); 
       }, 
       "success": function (data, textStatus, jqXHR) { 
        //get the img and assign the new src 
        $('#theImgId').attr('src', data); 
       } 
      }); 
     }, millisecondsBeforeNewImg); 
    }); 
</script> 

Come spero sia evidente, la versione jQuery è molto più semplice e più pulito. Tuttavia, dato il piccolo scopo del tuo progetto, non so se vorresti preoccuparti del sovraccarico di jQuery (non che sia così tanto). Né so se i requisiti del tuo progetto permetteranno la possibilità di jQuery. Ho incluso questo esempio semplicemente per rispondere alla tua domanda su cosa fosse $.ajax().

Sono altrettanto sicuro che esistono altri metodi con cui è possibile eseguire l'aggiornamento dell'immagine. Personalmente, se l'URL dell'immagine è in continua evoluzione, utilizzerei la rotta AJAX. Se l'URL dell'immagine è statico, probabilmente utilizzerò il tag di aggiornamento <meta>.

+0

Nice riepilogo delle varie opzioni aperte all'OP, bel lavoro che accredita anche altre persone ... e +1 soprattutto per considerare _non_ utilizzare jQuery solo per una delle sue numerose funzionalità dato che, in effetti, è eccessivo. –

3

Utilizzo.

document.location.reload(); 

ad esempio per reagire a un clic del pulsante:

<input type="button" value="Reload Page" onClick="window.location.reload()"> 
+0

Come si chiama questa funzione? – hpekristiansen

+0

Scusa se ho dimenticato di dirti che ho bisogno di farlo dal client. - guarda la mia modifica. – hpekristiansen

11

È possibile utilizzare richieste AJAX per aiutare. Ad esempio, ciò che stai facendo è il polling del server per l'immagine ogni cinque secondi. Invece è possibile eseguire il polling del server per un nuovo ID immagine e utilizzare tale id invece del numero casuale per la fonte dell'immagine. In questo caso l'attributo src cambierà/ricaricherà solo quando c'è una nuova immagine.

<script language="JavaScript"><!-- 
function refreshIt() { 
    if (!document.images) return; 
    $.ajax({ 
     url: 'latest-image-id.json', 
     success: function(newId){ 
      document.images['doc'].src = 'doc.png?' + newId;   
     } 
    }); 
    setTimeout(refreshIt, 5000); // refresh every 5 secs 
} 
//--></script> 
</head> 
<body onLoad=" setTimeout(refreshIt, 5000)"> 
<img src="doc.png" name="doc"> 

Un'alternativa è quella di ricevere una notifica dal server quando cambia immagine tramite una presa di rete.

+0

OK: cercherò AJAX. Sarebbe semplicemente più elegante, se al server venisse detto di aggiornare, ad es. dallo script php in upload. – hpekristiansen

+0

1+ .. Vedere anche questo esempio per websockets http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/ – Amitd

+0

Anche se il browser si trova sulla stessa macchina, da un punto di vista dello sviluppo del web è ancora necessario scrivere la pagina come qualsiasi altra pagina client. A meno che non si desideri informare esternamente il browser per l'aggiornamento, il che potrebbe rivelarsi molto complicato a seconda del browser e del sistema operativo. – tpower

1

È necessario implementare una connessione a lungo polling del client con il server denominata COMET o utilizzare socket se il browser supporta websocket.

1

In javascript, ci sono alcuni modi per aggiornare a livello di programmazione.

Il metodo preferito è location.reload()

Un altro modo è impostando la proprietà location.href, il browser passa automaticamente al nuovo URL, quindi location=location o location.href=location.href sarebbe anche farlo.

Anche se il secondo metodo probabilmente sembra strano.

Per ricapitolare, questo è:

location.reload(); 
//or 
location.href=location.href; 
//or 
location=location; 


Spero che questo ha aiutato.

5

Ricaricare la pagina in un intervallo di tempo specifico potrebbe fare il trucco.

setTimeout(function(){ 
window.location.reload(1); 
}, 5000); 

Il codice sopra riportato ricarica la pagina corrente in 5 secondi.

O

Si potrebbe anche andare per una chiamata AJAX che sarà assynchronous e anche non dovrete aggiornare l'intera pagina.Verifica il codice seguente:

$.ajax({ 
    url: "test.aspx", 
    context: document.body 
}).done(function() { 
    $(this).addClass("done"); 
}); 

Questo può essere usato instaed del window.location.reload(1);

[** test.html: ** Questa pagina deve portare in tutto lo src dell'immagine sul carico in esso Per esempio, un servizio che porta le immagini alla pagina.]

In tal modo si otterrà il risultato come data nello done(function() che è possibile assegnare a un elemento html nella pagina corrente. Esempio:

done(function() { 
$('#ImageId').attr('src', data); 
}); 

Questo imposterà lo src del tag img per data da Test.aspx

Vantaggio: Tutta la pagina non viene aggiornata e viene aggiunto solo la nuova immagine.

Vai approfondita questa link per sapere di più su jQuery Ajax ...

17

ho la stessa esatta applicazione. Basta usare WebSockets.

È possibile avviare un websocket connection e il server informerà il Viewer ogni volta che ottiene un aggiornamento. È possibile inviare l'immagine aggiornata tramite websocket, completamente asincrona senza disturbare la visualizzazione o l'interazione dell'utente.

Se si utilizzano i timer, non si otterranno aggiornamenti rapidi o si manterrà la pagina di aggiornamento senza l'uso.


Dettagli:

necessario un server websocket come pywebsocket o phpwebsocket.

Cliente:

avranno bisogno di sostegno websocket HTML5, tutti i browser attuali lo supportano.

È necessario registrarsi per un messaggio quando si verifica un aggiornamento dell'immagine. È come registrare un callback.

Esempio:

wSocket = new WebSocket('ws://' + serverIP + ':' + serverPort + '/images'); 

wSocket.onopen = function() { 
    console.log("Primary Socket Connected."); 

    connectedPrimary = true; 

    wSocket.send("sendImageUpdates"); 
}; 

wSocket.onmessage = function(evt) { 
    // evt is the message from server 

    // image will be representated as a 64 encoded string 

    // change image with new one 
    $("#image").attr('src', 'data:image/png;base64,' + evt.data); 
} 

wSocket.onclose = function() { 
    console.log("Primary Socket Closed."); 

    wSocket = null; 
}; 

wSocket.onerror = function(evt) { 
    alert(evt); 
} 

Ogni volta che il server invia un aggiornamento, la funzione mappato wSocket.onmessage saranno chiamati, e si può fare quello che devi fare con esso.

Server:

ascolterà per una connessione dal client (può essere fatto per supportare più client). Una volta effettuata la connessione e ricevuto il messaggio "sendImageUpdates", il server attenderà eventuali aggiornamenti nell'immagine. Quando viene caricata una nuova immagine, il server crea un nuovo messaggio e lo invia al client.

Pro

  1. andranno aggiornamenti non appena un'immagine è caricato e solo quando un'immagine viene caricato.
  2. cliente saprà che l'immagine è cambiata e può fare ulteriori funzioni.
  3. completamente asincrono e il server driven.
+2

I socket Web sono la strada da percorrere. Non è nemmeno necessario aggiornare la pagina, basta aggiornare il contenuto che si desidera aggiornare ed è totalmente asincrono e guidato dal server come indicato. il Viewer, è possibile determinare se il Viewer lo supporta. – Leeish

+0

Stavo per suggerire le websocket ma ho pensato che qualcuno lo avesse già fatto. Questo è lo scenario perfetto per i websocket. Con tutte le possibili immagini, la ricarica della pagina richiederebbe troppo tempo. Il server verrebbe troppo bombardato facendo ripetutamente il polling. Aggiungi capacità offline e il tuo spettatore è una bella app. –

+0

Prese Web per la vittoria. Un confronto elettorale è così inefficiente in confronto. –

1

Il metodo più semplice è quello di utilizzare AJAX pooling.
Per questo nel file php consegnando il caricamento, quando una nuova foto viene caricata Salva un timestamp UNIX in un file:

file_put_contents('lastupload.txt', strval(time())); // Save timestamp of upload 

creare un altro file php (es: polling.php) che gestirà le chiamate AJAX e restituire il timestamp unix dell'ultimo upload:

echo file_get_contents('lastupload.txt'); // Send last upload timestamp 

nel Visualizzatore codice javascript fare un polling AJAX che rileverà un cambiamento nella timestamp e aggiornare l'immagine quando necessario:

$(function() { 
    setInterval(polling, 1000); // Call polling every second. 
}); 
var lastupload = 0; 
function polling() { 
    $.ajax({ 
     url: 'polling.php', 
     success: function(timestamp){ 
      if (timestamp > lastupload) { // Is timestamp newer? 
       document.images['image'].src = 'image.png?' + timestamp; // Refresh image 
       lastupload = timestamp; 
      } 
     } 
    }); 
} 

Non ho ancora testato il codice, quindi ci potrebbero essere degli errori, ma questa è l'idea.

1

non credo che avete bisogno di molti script per questo. Ho risolto il problema aggiungendo solo un punto interrogativo e un numero casuale subito dopo l'URL dell'immagine. Se non si modifica il browser dell'URL dell'immagine, lo chiama dalla cache.

Per visualizzare la nuova foto a pagina:

<img src="<?php echo $image_url; ?>?<?php echo rand(10,99); ?>"/> 

Esso stampa qualcosa come:

http://static.example.com/myimage.jpg?56 

la tua domanda e la mia soluzione è rinfrescante l'URL dell'immagine cambiando con un numero casuale utilizzando jQuery e la funzione numero casuale javascript nel mio problema. Penso che tu abbia capito e adattato alle tue necessità.

$('#crop_image').live('click',function(){ 
    $(this).html(ajax_load_fb); 
    var x = $('#x').val(); 
    var y = $('#y').val(); 
    var w = $('#w').val(); 
    var h = $('#h').val(); 
    var dataString = 'process=image_crop&x='+x+'&y='+y+'&w='+w+'&h='+h; 
    $.ajax({ 
     type: 'POST', 
     url: '<?php echo $siteMain;?>ajax/ajaxupload.php', 
     data: dataString, 
     cache: false, 
     success: function(msg) { 
      $('#crop_image').html('Crop Selection'); 
      $('.crop_success_msg').slideDown('slow'); 
      var numRand = Math.floor(Math.random()*101); 
      $('#current_img').html('<img src="/images/large_<?php echo $user['username'];?>.jpg?'+numRand+'"/>'); 
     }, 
     error: function(response, status, error) 
     { 
      $(this).html('Try Again'); 
     } 
    }); 
}); 
0

La soluzione migliore sarebbe quella di scrivere un piccolo script php sul browser visualizzatore Web di controllare periodicamente l'immagine e se sarà cambiato ricaricarlo. Poiché il codice php viene eseguito sul lato server, è possibile farlo facilmente. Spero che questo aiuti se hai bisogno di snippet di codice fammi sapere.

Problemi correlati