Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ajax i funkcja eval();
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
serek
Zrobiłem sobie wisielca, działa, super, ale postanowiłem go przerobić, by szło zmieniać hasła bez odświeżania strony. Użyłem Ajaxa, który jest wywoływany po naciśnięciu przycisku. Następnie jest wczytywany z oddzielnego pliku kod do nowego hasła. W tym pliku jest i php i js i html haha.gif Jedynie nie wczytywany jest "panel kontrolny", który jest od samego początku. Jak chcę z niego wywołać funkcje z wczytanego pliku, to pisze, że taka funkcja nie istnieje. Czytałem, że jakoś funkcja eval() i zamiana nazw funkcji z tamtego pliku z function xxx(){} na zmienną np. xxx = funtion(){} jakoś może pomóc. Tylko próbuję i nie wychodzi. I jeszcze sprawa obiektów z html'a w tym pliku. Jak się do nich odwołać w tych funkcjach, by to działało?

Kod rozpoczynający funkcję w panelu kontrolnym:
Kod
<input type="button" ... onchange="wisielec();">
kamil4u
Z eval nie powinno się korzystać: eval is evil

Podałeś za mało informacji, żeby odpowiedzieć Ci w precyzyjny sposób. Moim zdaniem masz źle zaprojektowaną aplikację i powinieneś przemyśleć jej całą strukturę.
Opisz dokładniej swój problem podając więcej kodu( tylko ten dotyczący problemu ).

Pozdrawiam
serek
Hmm... próbowałem inaczej, ale zawsze wyskakują jakieś błędy. Powyższy sposób jest chyba najlepszy.

Mógłbym zrobić też tak:
Funkcję js wyrzucam z pliku wczytywanego przez Ajax, wklejam go do kodu statycznego, tam gdzie jest "panel kontrolny". Ale racji tego, że w funkcji tej mam użyte zmienne z php, to kod ten wykona mi się nim wywołam tą funkcję buttonem, więc mi to nie pasuje. Więc zostać muszę przy wywoływaniu funkcji wraz z resztą przy użyciu Ajax'a.

Aplikacja działa (a raczej nie działa) mniej więcej tak:

Kod
//część statyczna:
[
  //Panel kontrolny z buttonami]
  - wywołanie funkcji wisielec(): <input type="button" ... onkeypress="setTimeout('wisielec()')">
  - wywołanie wczytania pliku przez Ajax

//część wczytywana przez Ajax po naciśnięciu buttonu
[
  //php
  - wylosowanie z bazy MySQL hasła
  - podzielenie hasła na części

  //php+html
  - wygenerowanie <input>, po jednym na każdą literę hasła

  //html
  - obrazek wisielca

  //js+php
  - występują zarówno zmienne js jak i zmienne php
  - podstawienie liter z podzielonego hasła pod zmienne js
  - podstawianie znaków typu ' oraz - do okienek z hasłem
  - funkcja główna wisielec() - odwoływanie się w funkcji do elementów html w pliku wczytywanym przez ajax

]

//część statyczna:
[funkcja wywołująca wczytanie pliku przez Ajax]



Zawsze mogę zrezygnować z Ajax'u u ładować nowe hasło przez odświeżenie całej strony, ale to ostateczność.
kamil4u
Szczerze średnio rozumiem po co Ci eval, ale napiszę jak ja to wiedzę...
1. AJAX + PHP:
- wywołanie funkcji losującej hasło
- zapisanie tego do sesji
- Stworzenie przycisków od A-Z i wpisanie na ekran odpowiednią ilość "czegoś", zamiast liter - np. znaku "_"

2. Obrazki powinny być zapisane gdzieś na serwerze i zapisane za pomocą new Image w cache za pomocą JS. A następnie za pomocą konstrukcji
Kod
img.src = image1.img;
zmienione w przypadku błędnej odpowiedzi

3. W chwili kliknięcia na któryś z przycisków A-Z, wywołane jest żądanie do PHP z parametrem = danej literce. Serwer ma zwrócić pozycje na których znajduje się dana literka lub np. 0 w przypadku gdy literka nie występuje. Za pomocą JS wpisujesz na daną pozycję daną literkę lub zmieniasz obrazek wisielca w przypadku wystąpienia 0.

Dzięki takiej konstrukcji zwracasz tylko liczby! Nie będziesz miał zwracanych żadnych funkcji i nie będziesz musiał korzystać z eval czy czegokolwiek innego. Wszelkie operacje "zmian" wykonasz w JS. Natomiast W PHP będziesz tylko sprawdzał, które literki są na danej pozycji.

Powodzenia
serek
Ta, ale sesja może wygasnąć po jakimś czasie, akurat jak gość bawi się w wisielca, więc wolałbym zostawić jednak to jako zmienną haha.gif A Twój pomysł wymaga ode mnie praktycznie większości kodu do przerobienia... I nie używam literek, do wybrania któreś, tylko okienka, gdzie podaję je. Wygodniejsze to jest. No nic, coś pokombinuję.

Chyba, że przerobię wszystkie zmienne na js. W pliku wczytywanym przez Ajax zostawię tylko funkcję losującą hasło. Ajax będzie to wczytywał do niewidocznego div'a. I funkcje będą korzystać z hasła w tym divie. Wiem, że wtedy hasło byłoby łatwe do odczytania , ale szkodliwość niska, a niezbyt trudne do zrobienia chyba.
Rid
Niewidocznego div'a jak i wszelkie obiekty niewidoczne można podejrzeć np.w firebugu, nawet mało tego nie wiem czy można czasami ,także manipulować takimi obiektami.
serek
Cytat(Rid @ 13.06.2011, 17:26:15 ) *
Niewidocznego div'a jak i wszelkie obiekty niewidoczne można podejrzeć np.w firebugu, nawet mało tego nie wiem czy można czasami ,także manipulować takimi obiektami.

Nom, wiem. Mogę jeszcze podstawić to pod sesję, ale ona zawsze po jakimś czasie wygaśnie.
Rid
Mogę jeszcze podstawić to pod sesję, ale ona zawsze po jakimś czasie wygaśnie-nom zawsze ale dopiero po zamknięciu przeglądarki,chyba że się samemu ustawi czas wygaśnięcia sesji.
serek
Nom dobra, ale z sesją i tak mam problem.
Kodem:
Kod
var req = mint.Request();
req.Send('abcde');

losuję hasło i podstawiam je pod sesję.
Tylko jak po każdej zmianie odczytać tą sesję, skoro php będzie pamiętał początkowe hasło z sesji, bo się już ten php wykonał...
kamil4u
Nie rozumiem pytania, a Ty chyba nie rozumiesz działania sesji i sposób jej obsługi.

Opisz dokładniej problem smile.gif
serek
Sorry, ale jakoś nie potrafię pomyśleć haha.gif Korzystam ciągle z sesji, ale nie wiem czemu tu nie wiem co zrobić. A jadę na 2 fronty - z jednej strony wisielec, z drugiej uczę się szablonu na jutrzejszy egzamin zawodowy z infy haha.gif

No więc tak odwołuję się Ajax'em do pliku, w którym losuję hasło i podstawiam je pod sesję. Jak tą sesję mam odczytać bez przeładowania strony, skoro php się wykonuje zaraz po przeładowaniu? Nie wiem jak to inaczej opisać. Coś w stylu: wysyłam Ajax'em żądanie do pliku, że ma wylosować hasło i podstawić do sesji i automatycznie pobieram wartość tej sesji i podstawiam pod zmienną js.
kamil4u
W takim razie nie rozumiesz działania AJAX-u smile.gif

Dzięki funkcjonalności AJAX-u możesz uruchamiać skrypty PHP w tle - bez przeładowywania strony.
Cytat
pobieram wartość tej sesji i podstawiam pod zmienną js.

W takim razie jaki ma sens mieszanie do tego PHP? Chyba warto, aby użytkownik nie podglądał hasła. Zrób tak jak Ci pisałem. Po wysłaniu do PHP danej literki PHP zwraca tylko numery, na których stoi dana literka kub 0 w przypadku, gdy takowego nie ma.

Poczytaj o AJAX-ie i sesjach!
Jeśli pomimo prób nic Ci nie wyjdzie może napiszę coś na kształt gotowca, ale tylko wtedy gdy przedstawisz nam swoje próby.

Powodzenia
serek
Dobra, coś wymyśliłem, ale to nie to co byś chciał.

Najpierw kodem wysyłam żądanie do pliku by wylosował hasło, a potem podstawiam do sesji:
Kod
var req = mint.Request();
req.Send('modules/hangman_haslo.php');

Potem kodem:

Kod
jQuery.getScript('modules/hangman_haslo_sesja.php');

pobieram zmienne z tego pliku:

Kod
<?php
session_start();
echo'
var ses="'.$_SESSION['hangman_word'].'";';
?>

var haslo=ses;


To trochę chwile potrwa, więc kodem:

Kod
setTimeout('sesja()',1000);

wywołuję funkcję, w której już odczytuję zmienną z sesją.

Wiem, że pobierany wynik można łatwo odczytać np. Firebug'iem, ale nie wpadłem na nic lepszego.

Jeszcze coś. Wiem, że powyższy sposób pewnie jest do d*** haha.gif Jeśli macie jakieś propozycje to chętnie zobaczę haha.gif
Zdarza się przy tym moim sposobie, że przy jednokrotnym naciśnięciu przycisku to samo nowe hasło jest 2 razy generowane zamiast raz, co skutkuje nałożeniem się jednego na drugie...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.