2012-11-14 16 views
27

Mam trzy komputery; Server, Client i Viewer. Kontroluję serwer i przeglądarkę. workflowJak programowo odświeżyć przeglądarkę?

  1. Użytkownik na Client łączy się z Server i prezentowana jest na stronie internetowej.
  2. Poprzez skrypt php użytkownik przesyła obraz.
  3. Obraz jest osadzony w jakimś html.
  4. Viewer to komputer całkowicie pozbawiony interakcji użytkownika - nie ma klawiatury. Viewer zawsze działa w przeglądarce internetowej, wyświetlając stronę ze zdjęciem.

Mój problem polega na tym, że nawet jeśli obraz zmienia się na dysku serwera, strona internetowa nie jest aktualizowana. Jak odświeżyć przeglądarkę internetową w przeglądarce lub jej części?

Znam html, css, javascript, php i ajax, ale najwyraźniej nie wystarczająco dobrze.

+1

Ale już mówisz przeglądarce, kiedy odświeżyć obraz src (co 5 sekund). Na którym wydarzeniu chcesz zamiast tego odświeżyć? – devnull69

+0

Czy chcesz powiedzieć, że wielu użytkowników przesyła obrazy, a każdy z nich musi za każdym razem oglądać najnowszy obraz? – enenen

+4

jest również metatag http://www.webmonkey.com/2010/02/refresh_a_page_using_meta_tags/ – Amitd

Odpowiedz

43

Istnieją co najmniej trzy sposoby osiągnięcia tego.

czysty HTML

Jak podkreślił Amitd „s komentarzu w "show.html" dodaj następujący <meta> tag do dokumentu <head> element:

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

To automatycznie odświeżyć Strona co 5 sekund. Ustaw wartość atrybutu content na pożądaną liczbę sekund.

Czysta JavaScript:

Jak podkreślił MeNoMore, document.location.reload() będzie odświeżyć stronę, kiedy to nazwać.

<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> 

I jak podkreślił tpower żądań AJAX może być używany, ale trzeba by napisać usługi internetowej, aby powrócić url do żądanego obrazu.Kod JavaScript, aby zrobić żądania AJAX będzie wyglądać mniej więcej tak:

<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> 

Inne metody:

Wreszcie, aby odpowiedzieć na to pytanie odpowiedzieć tpower „s ... $.ajax() korzysta jQuery wykonać Połączenie AJAX. jQuery jest biblioteką JavaScript, która znacznie upraszcza połączenia AJAX i manipulacje DOM. Aby korzystać z biblioteki jQuery, trzeba by zawierać odniesienie do niej w swoim elemencie <head> (wersja 1.4.2 jako przykład):

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

Można również pobrać „jquery.min.js” i hostuj go lokalnie zamiast tego, ale to oczywiście zmieniłoby tylko adres URL, od którego skrypt jest załadowany.

Funkcja AJAX powyżej, kiedy napisany przy użyciu jQuery będzie wyglądać mniej więcej tak:

<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> 

jak mam nadzieję jest oczywiste, wersja jQuery jest znacznie prostsze i czystsze. Jednak biorąc pod uwagę mały zakres twojego projektu, nie wiem, czy chciałbyś zawracać sobie głowę dodatkowym obciążeniem jQuery (nie, że to wszystko tyle). Nie wiem też, czy Twoje wymagania projektowe pozwalają na możliwość jQuery. Zawarłem ten przykład po prostu, aby odpowiedzieć na pytanie, co to jest $.ajax().

Jestem równie pewny, że istnieją inne metody, dzięki którym można odświeżyć obraz. Osobiście, jeśli adres URL obrazu zawsze się zmienia, skorzystam z trasy AJAX. Jeśli adres URL obrazu jest statyczny, prawdopodobnie użyję tagu odświeżania <meta>.

+0

Fajne podsumowanie różnych opcji otwartych dla OP, fajna praca na dobro innych ludzi też ... i +1 specjalnie dla uwzględnienia _nie_ do używania jQuery dla jednej z wielu możliwości bo to jest rzeczywiście przesada –

3

Użyj.

document.location.reload(); 

na przykład reagować na kliknięcia przycisku:

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

Jak mogę wywołać tę funkcję? – hpekristiansen

+0

Przepraszam, zapomniałem powiedzieć, że muszę to zrobić od klienta. - zobacz moją edycję. – hpekristiansen

11

Można użyć żądania AJAX, aby pomóc. Na przykład, co robisz, to odpytywanie serwera o obraz co pięć sekund. Zamiast tego możesz sondować serwer pod kątem nowego identyfikatora obrazu i użyć tego identyfikatora zamiast losowej liczby dla źródła obrazu. W takim przypadku atrybut src zmieni/przeładuje tylko wtedy, gdy pojawi się nowy obraz.

<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"> 

Alternatywą jest uzyskanie powiadomienia z serwera, gdy obraz zmienia się za pośrednictwem gniazda internetowego.

+0

OK - Zajrzę do AJAX. Byłoby po prostu bardziej eleganckie, gdyby serwer kazał odświeżyć, np. przez przesłanie skryptu php. – hpekristiansen

+0

1+ .. Zobacz także przykład dla websockets http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/ – Amitd

+0

Mimo że przeglądarka znajduje się na tym samym komputerze, z punktu widzenia rozwoju strony internetowej nadal musisz napisać stronę jak każda inna strona klienta. Chyba, że ​​chcesz zewnętrznie poinformować przeglądarkę o odświeżeniu, co może być bardzo trudne w zależności od przeglądarki i systemu operacyjnego. – tpower

1

Musisz zaimplementować długoterminowe połączenie klienta z serwerem o nazwie COMET lub skorzystać z gniazda, jeśli twoja przeglądarka obsługuje websocket.

1

W javascript istnieje kilka sposobów odświeżania programowego.

Preferowaną metodą jest location.reload()

Innym sposobem jest ustawienie właściwości location.href, przeglądarka automatycznie przechodzi do nowego adresu URL, więc location=location lub location.href=location.href również zrobić.

Chociaż druga metoda prawdopodobnie wygląda dziwnie.

Reasumując, to:

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


Mam nadzieję, że to pomogło.

5

Ponowne załadowanie strony w określonym przedziale czasu może załatwić sprawę.

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

Powyższy kod ponownie załaduje bieżącą stronę w ciągu 5 sekund.

LUB

Można także udać się do wywołania AJAX, która będzie assynchronous a także przyzwyczajenie się do odświeżania całej strony.Kasy następujący kod:

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

ten może być używany instaed z window.location.reload(1);

[** test.html: ** Ta strona musi wnieść we wszystkich src obrazu na obciążenia do niego tj usługa, która przenosi obrazy na stronę.]

W ten sposób otrzymasz wynik data w done(function(), który możesz przypisać do elementu html na bieżącej stronie. Przykład:

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

Spowoduje to ustawienie znacznika img src do data z test.aspx

Advantage: Cała strona nie zostanie odświeżona i tylko nowy obraz jest dodany.

Idź dokładny ten link wiedzieć więcej o jQuery Ajax ...

17

Mam dokładnie taką samą aplikację. Po prostu użyj WebSockets.

Można uruchomić websocket connection, a serwer będzie informować o tym, Viewer, gdy pojawi się aktualizacja. Możesz wysłać zaktualizowany obraz za pomocą websocket, w pełni asynchronicznie, bez zakłócania działania wyświetlacza i interakcji użytkownika.

Jeśli używasz timerów, nie otrzymasz szybkich aktualizacji lub będziesz odświeżać stronę bez użycia.


Szczegóły:

będzie potrzebował serwera websocket jak pywebsocket lub phpwebsocket.

Klient:

będzie potrzebować wsparcia websocket HTML5, wszystkich obecnych przeglądarek ją wspierać.

Konieczność zarejestrowania się w wiadomości po aktualizacji obrazu. To jest jak rejestracja wywołania zwrotnego.

Przykład:

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); 
} 

Gdy serwer wysyła aktualizację, funkcja odwzorowane na wSocket.onmessage będzie nazwany, i można robić, co trzeba zrobić.

Serwer:

będzie nasłuchiwać na połączenie z klientem (może być wykonane do obsługi wielu klientów). Po nawiązaniu połączenia i odebraniu wiadomości "sendImageUpdates" serwer będzie czekał na wszelkie aktualizacje obrazu. Po załadowaniu nowego obrazu serwer utworzy nową wiadomość i wyśle ​​ją do klienta.

Plusy

  1. dostanie aktualizacji tak szybko jak obraz jest przesyłany i tylko wtedy, gdy obraz jest przesłany.
  2. Klient będzie wiedział, że obraz się zmienił i może wykonywać dodatkowe funkcje .
  3. W pełni asynchroniczny i oparty na serwerze.
+2

Gniazda internetowe to droga, nie trzeba nawet odświeżać strony, wystarczy zaktualizować zawartość, która ma być zaktualizowana i jest całkowicie asynchroniczna i sterowana przez serwer zgodnie z opisem. Przeglądarka, można określić, czy przeglądarka obsługuje to. – Leeish

+0

Miałem zamiar zasugerować websockets ale zorientowałem się, że ktoś już to zrobił. To idealny scenariusz dla websockets. Przy wszystkich możliwych obrazach przeładowanie strony trwałoby zbyt długo. Serwer zostałby zbyt zbombardowany, wykonując w kółko ankietę. Dodaj zdolność offline, a Twoja przeglądarka to fajna aplikacja. –

+0

Gniazda internetowe do wygrania. Podejście głosowania jest tak nieefektywne w porównaniu. –

1

Najłatwiej jest użyć łączenia AJAX.
Do tego w pliku php przekazanie upload, kiedy nowe zdjęcie zostanie dodane zapisać uniksowy znacznik czasu w pliku:

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

utworzyć kolejny plik php (np polling.php), które będą obsługiwać połączenia i AJAX powrót uniksowego znacznika czasu ostatniej Dodano:

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

w przeglądarce JavaScript kod dokonania sondowanie AJAX, które będą wykrywać zmiany w datownik i odświeżenie wizerunku, gdy są potrzebne:

$(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; 
      } 
     } 
    }); 
} 

Nie przetestowałem kodu, więc mogą wystąpić błędy, ale taki jest pomysł.

1

Nie sądzę, że potrzebujesz dużo skryptów do tego. Rozwiązałem ten problem, dodając znak zapytania i liczbę losową zaraz po adresie URL obrazu. Jeśli nie zmienisz przeglądarki URL obrazu, wywoła ją z pamięci podręcznej.

Aby wyświetlić najnowszy pic na stronie:

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

Drukuje coś takiego:

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

pytanie i moje rozwiązanie jest odświeżana URL obrazu, zmieniając ją z liczbą losową przy użyciu jQuery oraz funkcja liczb losowych javascript w moim problemie. Myślę, że masz rację i dostosujesz ją do swoich potrzeb.

$('#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

Najlepszym rozwiązaniem byłoby napisanie mały skrypt php na przeglądarce Web Viewer okresowo sprawdzać, czy jego wizerunek i zmieniło to go przeładować. Ponieważ kod php działa po stronie serwera, możesz to łatwo zrobić. Mam nadzieję, że to pomoże, jeśli potrzebujesz fragmentu kodu, daj mi znać.