Asynchroniczne wczytywanie obrazków

Asynchroniczne wczytywanie obrazków
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0

Jakoś tak

index.html

Kopiuj
<html>
<body>
<span id="value"></span>
<img id="image1"/>
<img id="image2"/>

<script>
const span = document.getElementById("value");

const image1 = document.getElementById("image1");
const image2 = document.getElementById("image2");

fetchIteratively(data => {
  span.innerText = data.text;
  const images = data.images; // tutaj będzie to co jest w pliku JSON
  console.log(images);
  image1.src = images[0];
  image2.src = images[1];
});

function fetchIteratively(callback) {
  fetchValue(data => {
    callback(data);
    setTimeout(() => fetchIteratively(callback), 5000);
  });
}

function fetchValue(callback) {
  fetch('/values.php')
    .then(response => response.json())
    .then(data => callback(data));
}

</script>
</body>
</html>

Oraz values.php:

Kopiuj
if (file_exists("file.txt")) {
  $text = file_get_contents("file.txt");
}
else {
  $text = "";
}

if (file_exists("images.json")) {
  $file = json_decode(file_get_contents("images.json"), true);
  $images = $file['images'];
} else {
  $images = [];
}

echo json_encode([
  'text' => $text,
  'images' => $images
]);

Oraz images.json:

Kopiuj
{
  "images": ["obrazek1.png", "obrazek2.png"]
}

Teraz jak chcesz wrzucić nowy obrazek, to po prostu uploadujesz obrazek o nazwie powiedzmy obrazek-nowy.png - on się jeszcze nie wyświetli. Ale wtedy zmieniasz images.json na np "images": ["obrazek1.png", "obrazek-nowy.png"] i wtedy już się powinien zmienić.

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Mam jakiś błąd którego nie mogę zlokalizować:

Kopiuj
Uncaught (in promise) TypeError: images is undefined

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Odpaliłem w drugiej przeglądarce (Chrome):

Kopiuj
br />
<b>Fatal error</b>:  Uncaught Error: Cannot use object of type stdClass as array in C:\xampp\htdocs\robo\values.php:11
Stack trace:
#0 {main}
  thrown in <b>C:\xampp\htdocs\robo\values.php</b> on line <b>11</b><br />

Linia 11...
screenshot-20220603135251.png

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Teraz nie czyta ( nie wyświetla poprawnie ) pliku txt.
Chyba dlatego że w pliku values.php $file się miesza....tak na moje oko ;-)

Mała korekta z mojej strony:

Kopiuj
if (file_exists("kotlin/wynik.txt")) {
  $text = file_get_contents("kotlin/wynik.txt");// Zmiana na $text
}
else {
  $text = "";// Zmiana na $text
}

if (file_exists("images.json")) {
  $file = json_decode(file_get_contents("images.json"), true);
  $images = $file['images'];
} else {
  $images = [];
}

echo json_encode([
  'text' => $text, // Zmiana na $text
  'images' => $images
]);

I śmiga !!! :-)

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Jeszcze pytanie za 100 punktów.
Czy na stronie www mogę mieć kłopoty z działaniem JSON,a?
Pytam bo aktualnie mam.:-)
W sensie, że czegoś tam może brakować ?
Myślałem, że to kwestia ścieżek ale wydaje się, że nie....bo niby to sprawdziłem.
Mam na konsoli taki błąd:
Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Zwykły html chodzi ;-)
http://maciekk.pl/robo/index2.html

A strona z JSONem nie.
http://maciekk.pl/robo/obrazki.html

Z AJAXem też działa:
http://maciekk.pl/robo/index.html

EDIT podobno na tym serwerze jest PHP 4 więc może to jest przyczyną. :-)

Edit 2. Potwierdzam. Na innym serwerze z nowszym oprogramowaniem hula!

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Pytanie pomocnicze.
Chodzi mi o przesyłanie danych przez JSONa.

Kopiuj
echo json_encode([
  'array' => $arr_all,
  'images' => $images
]);

Jak bym chciał przesłać klika array albo images to jak to zapisać ?
Dokładałem kolejne linijki ale to wydaje się nie działać
.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
2
Waran3 napisał(a):

Pytanie pomocnicze.
Chodzi mi o przesyłanie danych przez JSONa.

Kopiuj
echo json_encode([
  'array' => $arr_all,
  'images' => $images
]);

Jak bym chciał przesłać klika array albo images to jak to zapisać ?
Dokładałem kolejne linijki ale to wydaje się nie działać
.

O to Ci chodzi?

Kopiuj
echo json_encode([
  'array' => $arr_all,
  'images1' => $images,
  'images2' => $images,
  'images3' => $images,
  'images4' => $images,
]);

albo

Kopiuj
echo json_encode([
  'array' => $arr_all,
  'images' => [
    $images1,
    $images2,
    $images3,
    $images4, 
  ]
]);
Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Program przeszedł trochę transformacji i znowu coś mi nie działa :-)
I znowu ten JSON :-)

Program mam zapisany w 3 plikach:
index.html
values_wyniki.php
obrazki.js

index.html w większości to div'y
i wywołanie obrazki.js:

Kopiuj

    <p class = "rozgrywka1"> #1</p>
    <p class = "rozgrywka2"> #2</p>
    <p class = "rozgrywka3"> #3</p>
    <p class = "rozgrywka4"> #4</p>
    <p class = "rozgrywka5"> #5</p>


</div> 

<script src="obrazki.js"></script>

</body>
</html>

js wrzucam na wszelki wypadek w całości:

Kopiuj
const span = document.getElementById("value");

const image1 = document.getElementById("image1");
const image2 = document.getElementById("image2");

var s1 = document.getElementById("sedzia_1");
var s2 = document.getElementById("sedzia_2");
var s3 = document.getElementById("sedzia_3");

fetchIteratively(data => {
  span.innerText = data.array;
  const images = data.images; // tutaj będzie to co jest w pliku JSON
  console.log(images);
  console.log(data);
//   image1.src = images[0];
//   image2.src = images[1];
//   const arr = data.array;
//   s1 = arr[0];
//   s2 = arr[1];
//   s3 = arr[2];
// console.log("s1= " +s1);
// console.log("s2= " +s2);
// console.log("s3= " +s3);

// if (s1 == 1){
// document.getElementById("kafelek_lewy_1").style.backgroundColor = "red";    
// console.log("s1= " +s1);
// }
// else{
//   document.getElementById("kafelek_lewy_1").style.backgroundColor = "blue";    
// console.log("s1= " +s1);
// }
// if (s1==0){
//   document.getElementById("kafelek_lewy_1").style.backgroundColor = "white";    
// }


});

function fetchIteratively(callback) {
  fetchValue(data => {
    callback(data);
    setTimeout(() => fetchIteratively(callback), 5000);
  });
}

function fetchValue(callback) {
  fetch('/robo/values_wyniki.php')
    .then(response => response.json())
    .then(data => callback(data));
}

no i fragment values_wyniki.php

Kopiuj
//dla sedziego 3
$szukanaFraza = "*$sedziowie[2]*";// szukamie pliku z nazwa pierwszego sedziego
print("szukanaFraza= $szukanaFraza<br>"); //np. *Maciekk*
$katalog= 'wyniki/final/';
$lista = glob($katalog.$szukanaFraza);//$lista - tablica ze siezka do znalezionego pliku
$znalezionyPlik = $lista[0]; // znaleziony plik ze sciezka dostepu
print_r ("lista= $lista<br>");
print("znalezionyPlik= $znalezionyPlik<br>");
$arr_sedzia3 = file_get_contents("$znalezionyPlik");
print_r ("arr_sedzia1= $arr_sedzia1<br>");

$arr_all = array($arr_sedzia1,$arr_sedzia2,$arr_sedzia3);
print_r("arr_all = $arr_all");


  if (file_exists("images.json")) {
    $file = json_decode(file_get_contents("images.json"), true);
    $images = $file['images'];
    print_r("images= $images<br>");
  } else {
    $images = [];
  }
  
  echo json_encode([
    //'array' => $arr_all,
    'images' => $images
  ]);

Na stronie index.html ( konsola), mam błąd:
Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

PoREmowałem podejrzane rzeczy ale błąd ciągle się wyświetla.

echo json_encode daje taki wynik:
{"images":["breck_1.jpg","breck_2.jpg"]}

CH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 449
1
Kopiuj
<p class = "rozgrywka1"> #1</p>
    <p class = "rozgrywka2"> #2</p>
    <p class = "rozgrywka3"> #3</p>
    <p class = "rozgrywka4"> #4</p>
    <p class = "rozgrywka5"> #5</p>

NaRpierw zacznijmy od tego ze klasa jest zawsze jedna a ID sie roznia wiec musisz zapisac to tak

Kopiuj
    <p id = "rozgrywka1" class="rozrywka"> #1</p>
    <p id = "rozgrywka2" class="rozrywka"> #2</p>
    <p id = "rozgrywka3" class="rozrywka"> #3</p>
    <p id = "rozgrywka4" class="rozrywka"> #4</p>
    <p id = "rozgrywka5" class="rozrywka"> #5</p>
Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

To jeszcze raz:

index.html

Kopiuj
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="styleDance.css" >
</head>

<body>
    




    
    <img src="jpg/breck_1.jpg" alt="zawodnik po lewej"  class="fotoBox left" >
   
    <div class="box2">
        <img src = "jpg/pftu_niebieski_waski.png" >
    </div>


<img src="jpg/breck_1.jpg" alt="zawodnik po prawej"  class="fotoBox right" >


<div class="container2">
    
        <p class = "box zawodnik1"> ZAWODNIK 1</p>
   
    <div class="box wynik1"> 0 </div>

    <div class="box wynik2"> 2 </div>

        <p class = "box zawodnik2"> ZAWODNIK 2</p>


        <p class = "sedzia1"> Sedzia 1</p>
        <p class = "sedzia2"> Sedzia 2</p>
        <p class = "sedzia3"> Sedzia 3</p>

      
    <div class = "kafelek_lewy_1" ></div>
    <div class = "kafelek_srodkowy_1" ></div>
    <div class = "kafelek_prawy_1" ></div>

    <div class = "kafelek_lewy_2" ></div>
    <div class = "kafelek_srodkowy_2" ></div>
    <div class = "kafelek_prawy_2" ></div>

    <div class = "kafelek_lewy_3" ></div>
    <div class = "kafelek_srodkowy_3" ></div>
    <div class = "kafelek_prawy_3" ></div>

    <div class = "kafelek_lewy_4" ></div>
    <div class = "kafelek_srodkowy_4" ></div>
    <div class = "kafelek_prawy_4" ></div>

    <div class = "kafelek_lewy_5" ></div>
    <div class = "kafelek_srodkowy_5" ></div>
    <div class = "kafelek_prawy_5" ></div>



    <p class = "rozgrywka1"> #1</p>
    <p class = "rozgrywka2"> #2</p>
    <p class = "rozgrywka3"> #3</p>
    <p class = "rozgrywka4"> #4</p>
    <p class = "rozgrywka5"> #5</p>
    

    

</div> 

<script src="obrazki.js"></script>




</body>
</html>

obrazki.js

Kopiuj
const span = document.getElementById("value");

const image1 = document.getElementById("image1");
const image2 = document.getElementById("image2");

var s1 = document.getElementById("sedzia_1");
var s2 = document.getElementById("sedzia_2");
var s3 = document.getElementById("sedzia_3");

fetchIteratively(data => {
  span.innerText = data.array;
  const images = data.images; // tutaj będzie to co jest w pliku JSON
  console.log(images);
  console.log(data);
//   image1.src = images[0];
//   image2.src = images[1];
//   const arr = data.array;
//   s1 = arr[0];
//   s2 = arr[1];
//   s3 = arr[2];
// console.log("s1= " +s1);
// console.log("s2= " +s2);
// console.log("s3= " +s3);

// if (s1 == 1){
// document.getElementById("kafelek_lewy_1").style.backgroundColor = "red";    
// console.log("s1= " +s1);
// }
// else{
//   document.getElementById("kafelek_lewy_1").style.backgroundColor = "blue";    
// console.log("s1= " +s1);
// }
// if (s1==0){
//   document.getElementById("kafelek_lewy_1").style.backgroundColor = "white";    
// }


});

function fetchIteratively(callback) {
  fetchValue(data => {
    callback(data);
    setTimeout(() => fetchIteratively(callback), 5000);
  });
}

function fetchValue(callback) {
  fetch('/robo/values_wyniki.php')
    .then(response => response.json())
    .then(data => callback(data));
}

values_wyniki.php

Kopiuj
<?php

//odczyt nazw sedziow
if (file_exists("wyniki/final/sedziowie.txt")) {
  $sedziowie = file_get_contents("wyniki/final/sedziowie.txt");
}
else {
  $sedziowie ="";
}

$sedziowie = explode(PHP_EOL,$sedziowie); // utworzenie tablicy z nazwami sedziow

// $katalog= 'wyniki/final/';
// // czytanie danych dla wszytskich sedziow po kolei
// foreach ($sedziowie as $nazwaSedziego)
// {
//   print("***************$nazwaSedziego***<br>");
//   if ($nazwaSedziego == "")
// break;

// $szukanaFraza = "*$nazwaSedziego*";// szukamie pliku z nazwa sedziego
// print("nazwaSedziego= $nazwaSedziego<br>");
// print("szukanaFraza= $szukanaFraza<br>");

// $lista = glob($katalog.$szukanaFraza);//$lista - tablica ze siezkami do znalezionych plikow
// $znalezionyPlik = $lista[0]; // bedzie tylko jednen znaleziony plik
// echo "$znalezionyPlik<br>";


// $arr1 = file_get_contents("$znalezionyPlik"); // tworzenie tablicy dla kazdego z sedziow
// print_r("arr1= $arr1<br>");
//}

//dla sedziego 1
$szukanaFraza = "*$sedziowie[0]*";// szukamie pliku z nazwa pierwszego sedziego
$katalog= 'wyniki/final/';
$lista = glob($katalog.$szukanaFraza);//$lista - tablica ze siezka do znalezionego pliku
$znalezionyPlik = $lista[0]; // znaleziony plik ze sciezka dostepu
$arr_sedzia1 = file_get_contents("$znalezionyPlik");


//dla sedziego 2
$szukanaFraza = "*$sedziowie[1]*";// szukamie pliku z nazwa pierwszego sedziego
$katalog= 'wyniki/final/';
$lista = glob($katalog.$szukanaFraza);//$lista - tablica ze siezka do znalezionego pliku
$znalezionyPlik = $lista[0]; // znaleziony plik ze sciezka dostepu
$arr_sedzia2 = file_get_contents("$znalezionyPlik");


//dla sedziego 3
$szukanaFraza = "*$sedziowie[2]*";// szukamie pliku z nazwa pierwszego sedziego
$katalog= 'wyniki/final/';
$lista = glob($katalog.$szukanaFraza);//$lista - tablica ze siezka do znalezionego pliku
$znalezionyPlik = $lista[0]; // znaleziony plik ze sciezka dostepu
$arr_sedzia3 = file_get_contents("$znalezionyPlik");


$arr_all = array($arr_sedzia1,$arr_sedzia2,$arr_sedzia3);



  if (file_exists("images.json")) {
    $file = json_decode(file_get_contents("images.json"), true);
    $images = $file['images'];
  } else {
    $images = [];
  }
  
  echo json_encode([
    'array' => $arr_all,
    'images' => $images
  ]);
  
?>

CSS nie wrzucam :-)
( zbyt wiele prób, spróbuj za chwilę - nieco irytujące )

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0

@Waran3: no robisz const span = document.getElementById("value");, ale nie masz żadnego obiektu który ma id="value".

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Nie wiem ale sam to wstawiłeś ;-) i wszystko fajnie działało.
screenshot-20220608160424.png

Mózg mi się lasuje muszę przerwać na trochę to gapienie się w monitor :-)

Wstawiłem do index.html:

Kopiuj
<body>
    

    <span id="value"></span>


    

i poszło ;-) ale kurde, nie rozumiem dlaczego.

CH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 449
1

Musisz zorbic od poczatku linijka po linijce bo teraz jest bagno

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Wszystko śmiga ale lokalnie ( symulacja serwera XAMPP)
Jak wrzucę pliki na serwer i odpalę stronę to cześć rzeczy się nie odświeża.
Zauważyłem taką zależność, że jak dane mam na serwerze:

Kopiuj
{
    "images": ["breck_1.jpg", "breck_2.jpg"] ,
    "zawodnicy": ["GonzoBonzo", "SpeedyTweedy"] 
}

i jak je zmienię to na stronie pojawi się aktualizacja.

Tak przekazuję dane i wszytko co przechodzi tędy odświeża się

Kopiuj
 echo json_encode([
    'array' => $arr_all,
    'arraySedziowie'=> $sedziowie,
    'images' => $images,
    'zawodnicy' => $zawodnicy
  ]);
  

Natomiast wszytko co zrobię już po stronie strony www (java scrypt), nie chcę się odświeżyć.

To fragment funkcji która przetwarza wszystkie dane które mają się odświeżyć:

Kopiuj
fetchIteratively(data => {
  span.innerText = data.array;
  const images = data.images; // tutaj będzie to co jest w pliku JSON
  const zawodnicy = data.zawodnicy;
//  console.log(data);
//   image1.src = images[0];
//   image2.src = images[1];
  const arr = data.array;
  const arrSedziowie = data.arraySedziowie;
  sedzia1 = arrSedziowie[0]
  sedzia2 = arrSedziowie[1]
  sedzia3 = arrSedziowie[2]
  document.getElementById("sedzia1").innerHTML = sedzia1; // podstawianie nazwy sedziego1  
  document.getElementById("sedzia2").innerHTML = sedzia2; // podstawianie nazwy sedziego2  
  document.getElementById("sedzia3").innerHTML = sedzia3; // podstawianie nazwy sedziego3  
  
  
  zawodnik1 = zawodnicy[0];
  zawodnik2 = zawodnicy[1]; 
  //console.log(zawodnik1);
  //console.log(zawodnik2);

  document.getElementById("zawodnik1").innerHTML = zawodnik1 ;
  document.getElementById("zawodnik2").innerHTML = zawodnik2 ;
  

  s1Wynik = arr[0][0]; //tablica sedzia1 1/2  1-red , 2-blue
  s1Runda = arr[0][1];
  s1OnOff = arr[0][2]; //0-Off , 1-On

  s2Wynik = arr[1][0]; //tablica sedzia2
  s2Runda = arr[1][1];
  s2OnOff = arr[1][2]; //0-Off , 1-On
  
  s3Wynik = arr[2][0]; //tablica sedzia1
  s3Runda = arr[2][1];
  s3OnOff = arr[2][2]; //0-Off , 1-On 


   



if(s1OnOff == 0 && s2OnOff == 0 && s3OnOff == 0)
{
  document.getElementById("rozgrywka5").style.color = 'black';
  document.getElementById("rozgrywka4").style.color = 'black';
  document.getElementById("rozgrywka3").style.color = 'black';
  document.getElementById("rozgrywka2").style.color = 'black';
  document.getElementById("rozgrywka1").style.color = 'black';

  document.getElementById("kafelek_lewy_1").style.backgroundColor = 'black';
  document.getElementById("kafelek_lewy_2").style.backgroundColor = 'black';
  document.getElementById("kafelek_lewy_3").style.backgroundColor = 'black';
  document.getElementById("kafelek_lewy_4").style.backgroundColor = 'black';
  document.getElementById("kafelek_lewy_5").style.backgroundColor = 'black';
  
  document.getElementById("kafelek_srodkowy_1").style.backgroundColor = 'black';
  document.getElementById("kafelek_srodkowy_2").style.backgroundColor = 'black';
  document.getElementById("kafelek_srodkowy_3").style.backgroundColor = 'black';
  document.getElementById("kafelek_srodkowy_4").style.backgroundColor = 'black';
  document.getElementById("kafelek_srodkowy_5").style.backgroundColor = 'black';

  document.getElementById("kafelek_prawy_1").style.backgroundColor = 'black';
  document.getElementById("kafelek_prawy_2").style.backgroundColor = 'black';
  document.getElementById("kafelek_prawy_3").style.backgroundColor = 'black';
  document.getElementById("kafelek_prawy_4").style.backgroundColor = 'black';
  document.getElementById("kafelek_prawy_5").style.backgroundColor = 'black';

Zauważyłem że ma to jakiś związek z wersją PHP...
Przy zmianie na najnowszą wersję (8.1) wywala:
Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Podobnie przy wersji starszej (5.6). Przy 7 jest lepiej ale właśnie tak połowicznie.

Ustawiłem 8.1 bo XAMPP taką aktualnie wersję obsługuje więc chyba tak jest logicznie.
Tu link do strony
link

L7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 434
0

@Waran3: Nie chce mi się już pisać, że zacząłeś od d... strony tworzyć tą "wizualizację" ale pomogę Cię nakierować czemu masz błąd jeżeli korzystasz ze skryptu obrazki.js

screenshot-20220610201526.png
P.s. Korzystaj czasem z debugowania i dokumentacji. Komunikat błędu o tym JSON'ie mówi w tym przypadku, że nie otrzymujesz prawidłowego JSON'a.

Waran3
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Zielonka
  • Postów: 103
0

Dobra, zamieniłem

Kopiuj
//$sedziowie = explode(PHP_EOL,$sedziowie); // utworzenie tablicy z nazwami sedziow

na

Kopiuj
$sedziowie = preg_split('/\n|\r\n?/',$sedziowie);

i śmiga

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Moim zdaniem, jeśli ty chcesz podmieniać obrazki asynchronicznie, bo chyba tego potrzebujesz do wyświetlania wyników, to czemu nie użyjesz rozwiązań do tego przeznaczonych?
Jak ja bym chciał podmieniać rezultaty meczów, to pod spodem bym użył biblioteki GD i otworzył websocketa na backendzie albo użył w PHP rozwiązań do tego przeznaczonych:
https://github.com/tpunt/phactor
https://stackoverflow.com/questions/858883/run-php-task-asynchronously
https://dev.to/webong/using-asynchronous-processes-in-php-7io
https://amphp.org/
https://reactphp.org/
i setek innych
Nie będę ich opisywał tutaj - wystarczy w Google wpisać php async backend. Tak btw wielu programistów nie wie nawet, że takie cuda da się w php robić.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.