Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: AJAX, php i DOM
Forum PHP.pl > Forum > XML, AJAX
Alkagar
Witam,
od razu mowie, że jestem zielony z AJAXA :-) wiec pytanie może wydać się troche głupie ale...

Problem wygląda następująco:
Mam stronke html na ktorej jest przycisk, po kliknięciu go uruchamia się AJAX i wykonuje skrypt z pliku file.php. czy jest możliwość zeby w tym pliku zdefiniować zmiane jakiegoś elementu na stronie głównej t.j. tym pliku html. Chodzi mi tutaj o zmiane typu:
  1. document.getElementById('id').innerHTML = "costam";

ale żeby to zapisane w tym pliku php a nie w onSuccess w funkcji AJAX-owej.

Mam nadzieję że da sie zrozumieć choć troche to co napisałem : - )

Pozdrawiam,
Alk


P.S.
Dopisze tutaj bo nie chce zakładać nowego tematu.
Czy jest możliwość edycji plików *.xml przy uzyciu JS? Chodzi mi tutaj o dopisywanie danych lub zmiane juz istniejących wpisów.
anopak
tak da się coś takiego zrobić. Trzeba wykonać eval na zwracanym tekscie. Oczywiście jeżeli chcesz dodać coś do stronki i zrobić eval to dochodzi Ci do tego jeszcze wyodrębnienie kodu JS od HTML. Bardzo dobrze jest to rozwiązane we frameworku prototype, którego jak widze to na tym forum mało ludzi używa, bo woli polskiego advAJAX. W każdym bądź razie, na forum już był ten temat poruszany, wystarczy poszukać winksmiley.jpg

dla leniwych:
http://forum.php.pl/index.php?s=&showtopic...ndpost&p=257813

jest to kawałek z prototype odpowiedzialny za evaluowanie skryptów zwróconych przez request AJAX'a
Alkagar
Sam eval działa ale ten prototype nie bardzo. gdzie mam dać ten tekst z obj.responseText?

P.S. mówiłem ze zielony jestem : - P

======
hmmmmm juz wiem czemu mi to nie działało, probowałem uruchamiac w operze tongue.gif. Jest możliwość zrobienia tego tak żeby w operze też działało bo poki co tylko IE?


Jeszcze jedno pytanie mam,
czy jest możliwość tworzenia plików xml tylko przy uzyciu JS-a? i potem poźniejsza ich edycja?
Chodzi mi o to by to rozwiazanie było możliwe do wykonania bez serwera (czyli php etc. odpada )
anopak
cała bibloteka prototype działa poprawnie róznież pod operą...

Cytat(Alkagar)
Sam eval działa ale ten prototype nie bardzo. gdzie mam dać ten tekst z obj.responseText?


Kod
(...)
onSuccess:function(obj){
var data=obj.responseText;

var ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
var match    = new RegExp(ScriptFragment, 'img');
var response = data.replace(match, ''); //w response masz calosc bez skryptów JS
var scripts  = data.match(match); //w scripts masz same skrypty JS

match = new RegExp(ScriptFragment, 'im');
for (var i = 0; i < scripts.length; i++)
         eval(scripts[i].match(match)[1]);
}
(...)




Cytat(Alkagar)
Jeszcze jedno pytanie mam,
czy jest możliwość tworzenia plików xml tylko przy uzyciu JS-a? i potem poźniejsza ich edycja?
Chodzi mi o to by to rozwiazanie było możliwe do wykonania bez serwera (czyli php etc. odpada )


Nie ma szans, przecież JS działa po stronie klienta, a pliki masz po stronie serwera, a dzięki AJAX'owi masz komunikację między jednym a drugim...
bigZbig
@Alkagar - i co bys z tymi plikami xml chcial robic, gdzie chcialbys je zapisywac - na komputerze uzytkownika? XMLa stworzysz przy pomocy js, ale nie nie masz mozliwosci jego zapisania.
Alkagar
Przedstawie wam idee tego co chciałem zrobic : - ) może łatwiej zrozumieć będzie.

Miała to być lista filmów z tytułami, o czym film, etc. i to wszystko chciałem zrobić tak żeby działało po stronie clienta a nie servera gdyż chciałem to uruchamiać nawet na komputerze nie połączonym z internetem, bez zainstalowanego serwera. Więc, wchodziło by tutaj w gre otwieranie xml-a, odczytywanie zapisanych informacji (to wiem ze sie da) a ponadto także dopisywanie nowych danych pobranych z formularza (i tu jest problem bo nie wiem czy jest taka możliwość, plik znajdowałby się w katalogu wraz ze stroną z kodem). Prosta sprawa przy użyciu php tylko że wtedy potrzbny byłby serwer czego chciałbym uniknąć.

Czy jest szansa na zrobienie czegoś takiego? Czy JS pozwala nam na edycje plików znajdujących się wraz z nim w katalogu? Czy może jakis inny język (nie server-side) nadający się do tego?

Pozdrawiam,
Alk

P.S.
Co do opery to wykonywanie skryptu dochodzi pętli i tam sie zatrzymuje. Nie wykonuje żadnego przebiegu. W IE wszystko działa. Czym to może być spowodowane?
anopak
Cytat(Alkagar)
Przedstawie wam idee tego co chciałem zrobic : - ) może łatwiej zrozumieć będzie.

Miała to być lista filmów z tytułami, o czym film, etc. i to wszystko chciałem zrobić tak żeby działało po stronie clienta a nie servera gdyż chciałem to uruchamiać nawet na komputerze nie połączonym z internetem, bez zainstalowanego serwera. Więc, wchodziło by tutaj w gre otwieranie xml-a, odczytywanie zapisanych informacji (to wiem ze sie da) a ponadto także dopisywanie nowych danych pobranych z formularza (i tu jest problem bo nie wiem czy jest taka możliwość, plik znajdowałby się w katalogu wraz ze stroną z kodem). Prosta sprawa przy użyciu php tylko że wtedy potrzbny byłby serwer czego chciałbym uniknąć.

Czy jest szansa na zrobienie czegoś takiego? Czy JS pozwala nam na edycje plików znajdujących się wraz z nim w katalogu? Czy może jakis inny język (nie server-side) nadający się do tego?


no w takim wypadku to się da. Nie jestem pewien czy na każdej przeglądarce będize działać, ale napewno na FF działa. Korzystałem kiedyś z zapisywania plików poprzez JS przy tworzeniu XUL, więc możesz poszukać pod hasłem "XUL zapis plików" w googlu...

Cytat(Alkagar)
P.S.
Co do opery to wykonywanie skryptu dochodzi pętli i tam sie zatrzymuje. Nie wykonuje żadnego przebiegu. W IE wszystko działa. Czym to może być spowodowane?


co do opery, to sprawdze i dam Ci znać...


---------------
ok, w operze też działa...
mam tak:

test.html
  1. <div id="test"></div>
  2. (...)
  3. onSuccess:function(obj){
  4. var data=obj.responseText;
  5.  
  6. var ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
  7. var match = new RegExp(ScriptFragment, 'img');
  8. var response = data.replace(match, ''); //w response masz calosc bez skryptów JS
  9. var scripts = data.match(match); //w scripts masz same skrypty JS
  10.  
  11. match = new RegExp(ScriptFragment, 'im');
  12. for (var i = 0; i < scripts.length; i++)
  13. eval(scripts[i].match(match)[1]);
  14.  
  15. $('test').innerHTML=data;
  16. }
  17. (...)


test.php - do niego sie odwoluje z AJAX'a
  1. <?php
  2. echo 'test jakis tam...
  3. <script>
  4. alert(1);
  5. </script>';
  6. ?>


i działa bez problemowo...
Alkagar
Hmmm...
Wklejam ten twój kod i dalej nie działa. Jaką masz wersje opery? ja uruchamiam na 8.5.
anopak
8.5.4...

wklej tu na forum caly kod, ktory wywoluje AJAX'a oraz odpowiedz z serwera.... trudno tak na sucho mówić co możesz mieć nie tak....
Alkagar
Funkcja onclick na grafice wywołuje ajaxa:
  1. <img src='grafika/login.gif' onClick = "mySubmit(); " width='90' onMouseOver='document.body.style.cursor="hand"' onMouseOut='document.body.style.cursor="default"'>



Funkcja mySubmit(); :
  1. function mySubmit()
  2. {
  3. var name = document.getElementById('name').value;
  4. var pass = document.getElementById('pass').value;
  5. new advAJAX.post({
  6. url : "teksty/login.php?name=" + name + "&pass=" + pass,
  7. onInitialization : function()
  8. {
  9. document.getElementById('text').innerHTML = "";
  10. line1 = document.createElement('img');
  11. line1.src = 'grafika/loader.gif';
  12. line1.width = 200;
  13. line1.height = 100;
  14. document.getElementById('text').appendChild(line1);
  15. },
  16. onSuccess : function(obj)
  17. {
  18.  
  19. var data=obj.responseText;
  20. var ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
  21. var match = new RegExp(ScriptFragment, 'img');
  22. var response = data.replace(match, ''); //w response masz calosc bez skryptów JS
  23. var scripts = data.match(match); //w scripts masz same skrypty JS
  24. match = new RegExp(ScriptFragment, 'im');
  25. for (var i = 0; i < scripts.length; i++)
  26. eval(scripts[i].match(match)[1]);
  27.  
  28. document.getElementById('name').value = "";
  29. document.getElementById('pass').value = "";
  30. document.getElementById('text').innerHTML = obj.responseText;
  31. }
  32. });
  33. }


No i kod pliku .php:
  1. session_start();
  2. header('Content-type: text/html; charset=iso-8859-2');
  3. include '../func.php';
  4. $user = new users();
  5. unset($check);
  6. $check = $user->login($name, $pass);
  7. if ($check == FALSE){
  8. session_unset();
  9. unset($name);
  10. $name = 'anonyomus';
  11. ?>
  12. <h2>Wystąpił błąd podczas logowania</h2>
  13. <p>Podałeś błędne hasło lub złą nazwę użytkownika. Spróbuj zalogować się jeszcze
     raz bądź załóż konto jeżeli go jeszcze nie masz.</p>
  14.  
  15. <script lanugage='JavaScript'>
  16. document.getElementById('usr').innerHTML = '<? echo($name);?>';
  17. document.getElementById('close_one1').style.display = 'none';
  18. </script>
  19. <?
  20. }else
  21. {
  22. $_SESSION['name'] = $name;
  23. ?>
  24. <h2>Logowanie przebiegło pomyślnie : - )</h2>
  25. <p>Od tej pory możesz się cieszyć cześcią serwisu dostępną tylko dla nielicznych.</p>
  26. <script lanugage='JavaScript'>
  27. document.getElementById('usr').innerHTML = '<? echo($name);?>';
  28. document.getElementById('close_one1').style.display = 'inline';
  29. </script>
  30. <?
  31. }
  32. ?>
anopak
może coś takiego...

Kod
advAJAX.post({
   ...,
   mimeType: 'text/plain'
};



a co masz wogule w obj.responseText? czyli np alert(obj.reponseText);

napewno zwraca Ci poprawną wartość?
Alkagar
  1. <h2>Logowanie przebiegło pomyślnie : - )</h2>
  2. <p>Od tej pory możesz się cieszyć cześcią serwisu dostępną tylko dla nielicznych.</p>
  3.  
  4.  
  5. <script lanugage='JavaScript'>
  6. document.getElementById('usr').innerHTML = 'kuba';
  7. document.getElementById('close_one1').style.display = 'inline';
  8. </script>
  9.  
  10. <script lanugage='JavaScript'>
  11. document.getElementById('usr').innerHTML = 'kuba';


To jest dokłądna wartość obj.responseText.
z tego co patrzylem to on ma problem z scripts.lengthbo jak to zamienie na przykłąd na 5 to wykonuje mi a przynajmniej zaczyna wykonywac pętle ale potem znowu nie przechodzi przez eval i na tym sie konczy wykonywanie scryptu.

Tylko to działa w IE wieć raczej błędu w zwracanej wartości być nie powinno : - (.

To: mimeType tez dałem i dalej tak samo jest.

Pozdrawiam,
Alk

Czyli nikt nie ma pomysłu dlaczego to nie działa na operze?

Właściwie to juz napisalem inna funkcje do evaluowania (?) kodu. Jakby ktoś chciał działającą pod operą to :

  1. <?php
  2. data = obj.responseText.split('n');
  3. arraylen = data.length;
  4. var i = 0;
  5. while(< arraylen)
  6. {
  7. if( data[i].indexOf("script") > -1)
  8. {
  9. i++;
  10. while(data[i].indexOf("/script") < 0)
  11. {
  12.  
  13. eval(data[i]);
  14. i++;
  15. }
  16. }
  17. i++;
  18. }
  19. ?>
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.