Php + javascript - problem z wykonywaniem funcji onload ze zmienną php


(czeper) #1

Cześć,

struktura mojego kody wygląda mniej więcej następująco:

<script>
funckcja(zmienna){jakis kod};
setTimeout(funkcja(), 1000);
</script>

<?php
//jakis kod php
$zmienna;
echo '<script>window.onload=funkcja('.$zmienna.');</script>'

?>

(Fizyda) #2

Spróbuj tak, ale zrobiłem to trochę na palę, gdyby nie działało napisz przyłożę się do tego.

<script>
    funckcja(zmienna){jakis kod};
    setTimeout(funkcja(<?php echo $zmienna; ?>), 1000);
</script>

 


(czeper) #3

Dzięki za szybką odpowiedź.

Skrypt nie działa. Może dlatego, że js po prostu nie widzi tej zmiennej (kod php jest poniżej kodu js). Gdyby wyglądało to tak:

deklaracja funkcji js,

kod php, tworzenie zmiennej php (np zmienna),

wywołanie funkcji js ze zmienną php,

to by to zadziałało, tak było w przypadku mojego kodu. Problem w tym że kod php wykonywany jest raz przez serwer, a funkcja js w nim zawarta też raz się wykona. Natomiast kod js nie wykona się z parametrem, który pojawi się dopiero po wykonaniu kodu js. Pomyślałem, że może po prostu wyświetlić zawartość zmiennej poprzez funkcję echo, pobrać w kodzie poprzez 

var zmienna = document.getElementByID("id").innerHTML;

a potem tą samą funkcją zmieniać zawartość diva. Jednak to też mi nie działa. Kolejność  kodów ta sama. W konsoli błędów pojawia się informacja o wartości NULL.


(Drobok) #4

settimeout wykonuje funkcje 1raz, powinieneś użyć setInterval.

function nazwa(jakas_zmienna){
  //tutaj_uzywasz_zmiennej
  alert(jakas_zmienna);
}
window.onload = function(){
   setInterval(nazwa(?php echo $zmienna; ?), 1000);
};

ew zrób tak (po co tworzyć funkcję obok skoro i tak używasz jej raz:

window.onload = function(){
   setInterval(function(){
      var z = ?php echo $zmienna; ?;
   }, 1000);
};

 


(Fizyda) #5

Jeśli się nie da tego zrobić z powodu który napisałeś, to masz źle napisany kod. Poczytaj o MVC w tedy będzie się dało.


(Drobok) #6

 Co wykonuje js ? Tworzysz jakiś konstruktor ? Możemy sobie tylko gdybać, podaj jakiś konkretny przykład.


(czeper) #7

Sprawdzałem wcześniej osobno kod js z settimeout i też działa, więc jeśli o sam kod js to nie ma problemu. Problemem jest jedynie przekazanie wartości. Po próbach uznałem że lepiej zrobić jak radzi drobok, z tym że moje wątpliwości budzi linia 

var z = <?php echo $zmienna; ?>;

Na samym początku pliku mam kod js, potem funkcje php, następnie wywołanie tych funkcji w kodzie html. Nazwa $zmienna odnosi się do zmiennej zawartej w definicji funkcji, a tworzona jest podczas jej wywołania. Czy to napewno będzie działać? Sprawdzałem i nie działa. Druga sprawa: nie wiem co miałby tutaj wnieść wzorzec mvc. Wydaje mi się że najprostszym rozwiązaniem byłoby wczytanie zawartości diva, wykonanie operacji i zwrócenie do spowrotem. Problem w tym że gdy wykonuję 

document.getElementByID("id").innerHTML

zawartość nie zostaje wczytana do zmiennej (zamiast zawartości jest NULL).

 


(Drobok) #8

Daj cały kod, albo zwyczajnie przeczytaj jakiś kurs php, oraz kurs js. Szczególnie wstęp dot. opisu po której stronie działa dany język programowania. Jak łączyć php i html/js, co to jest funkcja, co to argument funkcji (zarówno w js, jak i w php).

PS. innerHTML służy do czego innego, możesz załadować treść z id=“id”, ale to błędne rozwiązanie (na około)


(czeper) #9

Wiem że ekspertem od języków webowych nie jestem, ale podstawy mam już za sobą. Ale do rzeczy: nie będę umieszczać całego kodu, bo jest zbyt obszerny. Podam szkielet kodu, który w pełni oddaje to, z czym mam problem:

 

<script>
var czas=document.getElementById("czas").innerHTML;
//zamiana zmiennej czas na składowe h, m, s
function funckcja()
{
//obliczanie wartości hh, mm, ss
document.getElementById("czas").innerHTML=hh+':'+mm+':'+ss;
setTimeOut("funkcja()", 1000)
};

windows.onload=funkcja;
</script>

<?php
function pokaz($zm)
{
$zmienna=$zm*3600;
echo 'Czas: <div id="czas">'.$zmienna.'</div>';
}

echo '<ul>';
echo '<li>'; pokaz(1); echo '</li>';
echo '<li>; pokaz(2); echo '</li>;
echo '</ul>;

?>

Co się tyczy innerHTML: na stronie http://www.w3schools.com/ jest pokazane zastosowanie tej funkcji w odniesieniu do przedstawionego przeze mnie problemu, więce wydaje mi się że jest poprawne. A poza tym wydaje mi się że jest to również najprostsze rozwiązanie.


(Drobok) #10

Zacznij od tego że masz źle wstawione apostrofy w kodzie. Jak nie podajesz informacji to nie dziw się że gadamy o czymś innym niż ty. Chcesz wyświetlić czas od lub do czegoś i go inkrementować / dekrementować. Podejście właściwe, ale:


(Fizyda) #11

Moim zdaniem to podstawy to Ty masz dopiero przed sobą, cały kod jest napisany tragicznie nie dziwie się że Ci cały czas coś nie działa. Szczerze mówiąc to patrząc na sam kod nie mam pojęcia co ty chcesz zrobić, a tym bardziej jak.


(czeper) #12

Jak już napisałem, zaprezentowany kod jest jedynie szkieletem, i to napisanym na szybko, więc nie bawiłem się w szczegóły apostrofy, etc. Chciałem przedstawić problem a nie konkretny kod.

Może uprośmy sprawę, nie wnikając w ten kod, który napisałem: pewna funkcja php generuje w divie liczbę sekund, np 3600. Za pomocą funkcji js chcę pobraż tę wartość i zamienić na 01:00:00, po czym czas ma się zmniejszczać co sekundę aż osiągnie 00:00:00. Mój problem to pobranie wartości 3600 w kodzie js. Samodzielny kod js testowałem i działa. Zastanawiałem się też nad pobraniem czasu w kodzie js ze zmiennej php, ale wydaje mi się że pobranie z kodu html jest łatwiejsze.


(Fizyda) #13

Dobra to też się nie będę bawił w szczegóły. Rozwiązaniem twojego problemu jest

  1. Zastosowanie wzorca MVC

  2. Przekazanie wartości do skryptu JS przez wygenerowanie JavaScripts Object z wartościami i dołączenie go do strony

  3. Przerobienie skryptu JS tak by używał wygenerowanego obiektu.


(czeper) #14

Może się nie znam, może nie znam podstaw, zdaję sobie sprawę że jesteście bardziej doświadczeni w programowaniu,  ale chyba sami przyznacie że zastosowanie wzorca MVC dla kilku linijek kodu jest bez sensu. Na proste problemy są proste rozwiązania. To tak jakby stosować wielkie działa na plastikowe żołnierzyki. MVC stosuje się w dużych projektach, i wtedy stosuję np. symfony, a nie wymyślam wszystko od nowa. Nie chcę się powtarzać, ostatecznie problem opisałem w ostatnim moim poście. Początkowo zastanawiałem się nad wstawieniem kodu php w kod js (tak jak w pierwszym poście), potem przyszło mi do głowy użycie innerHTML i z tym będę próbował. Tak czy inaczej dzięki za odpowiedzi i poświęcony czas.


(Drobok) #15

Pierwszy i ostatni raz:


(Fizyda) #16

Nie musisz implementować MVC w czystej jego postaci, wystarczy że ułożysz z głową kod oraz stowarzysz prosty system szablonów bazujący tylko i wyłącznie na require_once(). I nie mów że to bez sensu bo na uczelnie sam robiłem tak banalne stronki tylko po to by mieć porządek w kodzie i lepiej mi się ją robiło. Zrobienie takiej prostej strony z ułożeniem kodu ala MVC i pseudo systemem szablonów to może 30 minut roboty.


(czeper) #17

Macie rację, ale pisałem o problemie przesyłania zmiennej pomiędzy kodami. Nie poruszałem tutaj kwestii czasu, równie dobrze mogłem użyć innego przykładu, ale dzięki za wskazówki dot. czasu. Nie znam wszystkiego jeśli chodzi o js, dlatego użyłem najprostszego sposobu odmierzania czasu.


(kostek135) #18

Wkleiłem twój kod z poprawionymi apostrofami na PHP-Fiddle (http://phpfiddle.org/) - link bo nie wiem jak zlinkować bezpośrednio do kodu na tej stronie) i działa:


(czeper) #19

Witam ponownie,

opisywane problemy rozwiązałem (może powinienem o tym wspomnieć i w ten sposób zakończyć temat). Faktycznie funkcja getElementbyid nie mogła pobrać elementu, dlatego cały kod js wstawiłem przed znacznikiem </body>. Potem kombinowałem i zrobiłem to samo z wykorzystaniem składni czas=<?php echo $czas; ?>, co wydaje się lepsze. Natomiast w moim kodzie funkcja pokaz() wywoływana jest najwyżej raz, tutaj wstawiłem bardzo uproszczony (oraz mocno krytykowany przez was) kod. Za wszelkie sygestie dziękuję i to tyle w temacie.