🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.javascript
10 messages
10 total messages Started by Technolog Tue, 01 Mar 2011 11:53
Problem z funkcją otwierającą plik
#50599
Author: Technolog
Date: Tue, 01 Mar 2011 11:53
38 lines
2092 bytes
Witam, mam funkcję, która otwiera mi plik PHP - jak do tej pory działa,
plik jest wykonywany. Tylko nie potrafię zmusić tej funkcjo do tego, aby
zwróciła wynik otwarcia pliku.

Gdy w linijce z //!!!! zamienię p=... na alert(... wtedy wynik się pojawia.
Jednak p chyba nie jest globalne, mimo deklaracji na początku skryptu.

Co poszło źle? Przyznaję, że nie poruszam się swobodnie w programowaniu
obiektowym ani w AJAX, a funkcję fileOpen gdzieś podpatrzyłem i do pewnego
momentu mi ona działa, ale nie zwraca wyniku.

Będę wdzięczny za pomoc. 

var p='';
function fileOpen (addr) {
	var XMLHttpRequestObject = false;
	if (window.XMLHttpRequest){
	  XMLHttpRequestObject = new XMLHttpRequest();
	}
	else if (window.ActiveXObject){
	  XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
  if(XMLHttpRequestObject){
	XMLHttpRequestObject.open("GET", addr);
	XMLHttpRequestObject.onreadystatechange = function()	{
	  if (XMLHttpRequestObject.readyState == 4 && 
		  XMLHttpRequestObject.status == 200) {
		  p= XMLHttpRequestObject.responseText; //!!!!!!!!!!!!!
	  }
	}
	XMLHttpRequestObject.send(null);
	return p;
  }
}
function test () {
	alert(fileOpen("plik.php"));	
}
test();
Re: Problem z funkcją otwierającą plik
#50600
Author: Szyk
Date: Tue, 01 Mar 2011 13:48
79 lines
3894 bytes
W dniu 2011-03-01 12:53, Technolog pisze:
> Witam, mam funkcję, która otwiera mi plik PHP - jak do tej pory działa,
> plik jest wykonywany.

> Tylko nie potrafię zmusić tej funkcjo do tego, aby
> zwróciła wynik otwarcia pliku.

Bo to nie jest "wynik otwarcia pliku" tylko "wynik pobrania pliku".

> Gdy w linijce z //!!!! zamienię p=... na alert(... wtedy wynik się pojawia.

Bo to logiczne. Plik pobierany jest asynchronicznie. Mówiąc po ludzku: 
jedna funkcja wysyła żądanie pobrania pliku, a druga funkcja go odbiera. 
Robi się tak by interfejs użytkownika działał mimo pobierania pliku 
(inaczej była by zwiecha na sekundę lub kilka sek.). W twoim wypadku 
wysyłasz żądanie pobrania pliku funkcją:
 > function fileOpen (addr) {

a odbiera funkcja:

 > 	XMLHttpRequestObject.onreadystatechange = function()	{

Tu ta funkcja podawana jest jako parametr wywołania. Jest to tzw. 
"funkcja callback". Bardzo często się stosuje takie rozwiązanie. Po 
drugie jest to funkcja nie nazwana czyli tzw. "funkcja Lambda" (nie 
wszystkie języki to mają).

> Jednak p chyba nie jest globalne, mimo deklaracji na początku skryptu.

Odczytujesz p gdy plik jeszcze nie został ściągnięty.

>
> Co poszło źle?

Tam gdzie masz //!!!!!!!!!!!!! trzeba umieścić to co ma się dziać po 
pobraniu pliku. W twoim przypadku zapewne najlepiej było by gdyby do 
funkcji fileOpen dodać parametr będący funkcją jaka ma być wywołana po 
pobraniu pliku z parametrem zawartości pobranego pliku. Wtedy miałbyś 
uniwersalny sposób pobierania dowolnego pliku.

Jeszcze raz jakbyś miał wątpliwości: trzeba dodać do fileOpen drugi 
parametr będący nazwą funkcji jaka ma być wywołana po pobraniu pliku i 
wywołać ją tam gdzie są //!!!!!!!!!!!!! z parametrem p. Wtedy zawartość 
pliku wyląduje tam gdzie chcesz ją umieścić. Mógłbym to napisać, ale nie 
mam za bardzo czasu.



> Przyznaję, że nie poruszam się swobodnie w programowaniu
> obiektowym ani w AJAX, a funkcję fileOpen gdzieś podpatrzyłem i do pewnego
> momentu mi ona działa, ale nie zwraca wyniku.
>
> Będę wdzięczny za pomoc.
>
> var p='';
> function fileOpen (addr) {
> 	var XMLHttpRequestObject = false;
> 	if (window.XMLHttpRequest){
> 	  XMLHttpRequestObject = new XMLHttpRequest();
> 	}
> 	else if (window.ActiveXObject){
> 	  XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
> 	}
>    if(XMLHttpRequestObject){
> 	XMLHttpRequestObject.open("GET", addr);
> 	XMLHttpRequestObject.onreadystatechange = function()	{
> 	  if (XMLHttpRequestObject.readyState == 4&&
> 		XMLHttpRequestObject.status == 200) {
> 		  p= XMLHttpRequestObject.responseText; //!!!!!!!!!!!!!
> 	  }
> 	}
> 	XMLHttpRequestObject.send(null);
> 	return p;
>    }
> }
> function test () {
> 	alert(fileOpen("plik.php"));	
> }
> test();
Re: Problem z funkcją otwierającą plik
#50601
Author: Jacek Czerwinski
Date: Wed, 02 Mar 2011 05:59
13 lines
1453 bytes
W dniu 2011-03-01 14:48, Szyk pisze:
> W dniu 2011-03-01 12:53, Technolog pisze:
>> Witam, mam funkcję, która otwiera mi plik PHP - jak do tej pory działa,
>> plik jest wykonywany.
>
>> Tylko nie potrafię zmusić tej funkcjo do tego, aby
>> zwróciła wynik otwarcia pliku.
>
> Bo to nie jest "wynik otwarcia pliku" tylko "wynik pobrania pliku".
Albo wynik "wykonania programu z pliku na serwerze", nie sadzisz?
Z prawdziwym plikiem tu nie ma ZADNEGO kontaktu.

Bosch, "praktycy"  ...
Re: Problem z funkcją otwierającą plik
#50602
Author: Szyk
Date: Wed, 02 Mar 2011 12:45
16 lines
1940 bytes
W dniu 2011-03-02 06:59, Jacek Czerwinski pisze:
> W dniu 2011-03-01 14:48, Szyk pisze:
>> W dniu 2011-03-01 12:53, Technolog pisze:
>>> Witam, mam funkcję, która otwiera mi plik PHP - jak do tej pory działa,
>>> plik jest wykonywany.
>>
>>> Tylko nie potrafię zmusić tej funkcjo do tego, aby
>>> zwróciła wynik otwarcia pliku.
>>
>> Bo to nie jest "wynik otwarcia pliku" tylko "wynik pobrania pliku".
> Albo wynik "wykonania programu z pliku na serwerze", nie sadzisz?
> Z prawdziwym plikiem tu nie ma ZADNEGO kontaktu.

Użyłem skrótu myślowego, bo z technicznego punktu widzenia nie ma żadnej 
różnicy czy się pobiera plik statyczny czy wynik działającego programu 
czyli plik generowany dynamicznie. Więc po co zaciemniać?
Re: Problem z funkcją otwierającą plik
#50603
Author: Jacek Czerwinski
Date: Wed, 02 Mar 2011 18:54
43 lines
3024 bytes
W dniu 2011-03-02 13:45, Szyk pisze:
> W dniu 2011-03-02 06:59, Jacek Czerwinski pisze:
>> W dniu 2011-03-01 14:48, Szyk pisze:
>>> W dniu 2011-03-01 12:53, Technolog pisze:
>>>> Witam, mam funkcję, która otwiera mi plik PHP - jak do tej pory działa,
>>>> plik jest wykonywany.
>>>
>>>> Tylko nie potrafię zmusić tej funkcjo do tego, aby
>>>> zwróciła wynik otwarcia pliku.
>>>
>>> Bo to nie jest "wynik otwarcia pliku" tylko "wynik pobrania pliku".
>> Albo wynik "wykonania programu z pliku na serwerze", nie sadzisz?
>> Z prawdziwym plikiem tu nie ma ZADNEGO kontaktu.
>
> Użyłem skrótu myślowego, bo z technicznego punktu widzenia nie ma żadnej
> różnicy czy się pobiera plik statyczny czy wynik działającego programu
> czyli plik generowany dynamicznie. Więc po co zaciemniać?
>
Dla mnie zaciemnianiem jest nazywanie tego plikiem. Nie zmienia mojego 
myslenia, że dziesiatki ludzi uzywaja belkotkliwego jezyka.

Plik mozna pobrac z serwera plikow (Win,Novell,NFS,Samba itd) choc i tu 
teoretycy by dyskutowali. Otwierasz go w/g 'handle' itd.
Paradoksalnie, FTP wbrew nazwie, tez by mozna dyskutowac.

Plik generowany dynamicznie (?) cokolwiek by to dla Ciebie znaczylo, to 
jakies Unixowe rurki, pipe itd, ale to sa bardzo wyraziste w informatyce 
rzeczy od 30 lat. Ale nawet pipe, choc ma zmienna zawartosc, ale 
konkretna tozsamosc.

To co jest w request http, nie musi odpowiadac zadnemu plikowi, 
obsluzone przez handlery serwera. Wiec jaki plik wtedy pobierasz?
htpp://xxxx/status -> jaki to plik ?

A jak serwer www oddaje wyniki kwerend SQL - jaki to plik?

Nie mam gotowego slowa, jak by nazwac taki abstrakcyjny byt, uogólnienie 
statycznego czy dynamicznego wyniku skryptu, moze 'strumien', ale bez 
przekonania. Ale zdecydowanie slowa z http.

Nawet pehapowcowi da sie to wytlumaczyc: pobranie PLIKU to juz blizsze 
by bylo ujawnienie jego postaci zrodlowej skryptu zamiast wyniku, np. 
jak sie spieprzy konfiguracja apacha.
Re: Problem z funkcją otwierającą plik
#50604
Author: Szyk
Date: Wed, 02 Mar 2011 19:57
32 lines
2754 bytes
> To co jest w request http, nie musi odpowiadac zadnemu plikowi,
> obsluzone przez handlery serwera. Wiec jaki plik wtedy pobierasz?
> htpp://xxxx/status -> jaki to plik ?

Ja nie jestem żadnym wielkim "ŁU ŁU Teoretykiem" ale chyba cały trik 
polega na tym, że podaje się URL w przeglądarce i przeglądarka odbiera 
to jako plik. A w tym konkretnym przypadku to status może być 
jakimkolwiek plikiem html czy txt czy jeszcze czymś innym.

> A jak serwer www oddaje wyniki kwerend SQL - jaki to plik?

Wyniki kwerend SQL nie mają nic do rzeczy - to wewnętrzne sprawy 
serwera. Interfejs www musi definiować odrębny format jaki udostępnia 
np. xml, czy cvs.

> Nawet pehapowcowi da sie to wytlumaczyc: pobranie PLIKU to juz blizsze
> by bylo ujawnienie jego postaci zrodlowej skryptu zamiast wyniku, np.
> jak sie spieprzy konfiguracja apacha.

To że plik udostępniany w locie generuje wynikową zawartość to sprawa 
jedynie serwera www i jego możliwości w tym zakresie. Użytkownika to nie 
obchodzi, czy plik jest statyczny czy generowany w locie (dynamicznie). 
Użytkownik przeglądarką pobiera pliki. Serwer taki jak Apache pierwotnie 
serwował tylko statyczne pliki, a skrypty zostały do niego dodane 
później. Tym nie mniej przeglądarki dalej odbierają pliki.


Taka uwaga na koniec: radzę myśleć prostymi pojęciami tam gdzie sprawy 
są proste, bo to dobrze robi na bańkę. Błądzenie w nie forułowalnych czy 
nie wysławialnych abstrakcjach radzę zostawić humanistom (czyli tym co 
nie potrafią nic zrobić ale się uważają za ekspertów od spraw wyższych).
Re: Problem z funkcją otwierającą plik
#50605
Author: Jacek Czerwinski
Date: Wed, 02 Mar 2011 20:18
4 lines
1195 bytes
W dniu 2011-03-02 20:57, Szyk pisze:
>  Tym nie mniej przeglądarki dalej odbierają pliki.
>
NIE
Re: Problem z funkcją otwierającą plik
#50606
Author: Jacek Czerwinski
Date: Wed, 02 Mar 2011 20:20
6 lines
1321 bytes
W dniu 2011-03-02 21:18, Jacek Czerwinski pisze:
> W dniu 2011-03-02 20:57, Szyk pisze:
>> Tym nie mniej przeglądarki dalej odbierają pliki.
>>
> NIE
Polecam lekturze cztery literki, dwukropek i dwa ukosniki.
Re: Problem z funkcją otwierającą plik
#50607
Author: William Bonawentura
Date: Thu, 03 Mar 2011 06:44
12 lines
1629 bytes
?
Użytkownik "Jacek Czerwinski" <x@y.z.pl> napisał w wiadomości 
news:ikm3pa$2jl$1@news.onet.pl...
>
> Nie mam gotowego slowa, jak by nazwac taki abstrakcyjny byt, uogólnienie 
> statycznego czy dynamicznego wyniku skryptu, moze 'strumien', ale bez 
> przekonania. Ale zdecydowanie slowa z http.
>

To co wysyłamy i czytamy z protokołu http to zdecydowanie strumień (stream). 
To, co otrzymujemy tym strumieniem to treść (content). W szczególnym 
przypadku może być to zawartość jakiegoś pliku (file).
Re: Problem z funkcją otwierającą plik
#50608
Author: Technolog
Date: Thu, 03 Mar 2011 19:07
23 lines
1989 bytes
Dnia Tue, 01 Mar 2011 14:48:01 +0100, Szyk napisał(a):

>> Gdy w linijce z //!!!! zamienię p=... na alert(... wtedy wynik się pojawia.
> 
> Bo to logiczne. Plik pobierany jest asynchronicznie. Mówiąc po ludzku: 
> jedna funkcja wysyła żądanie pobrania pliku, a druga funkcja go odbiera. 
> Robi się tak by interfejs użytkownika działał mimo pobierania pliku 
> (inaczej była by zwiecha na sekundę lub kilka sek.).

No jasne, w tym momencie zrozumiałem. 

> Tam gdzie masz //!!!!!!!!!!!!! trzeba umieścić to co ma się dziać po 
> pobraniu pliku. W twoim przypadku zapewne najlepiej było by gdyby do 
> funkcji fileOpen dodać parametr będący funkcją jaka ma być wywołana po 
> pobraniu pliku z parametrem zawartości pobranego pliku. Wtedy miałbyś 
> uniwersalny sposób pobierania dowolnego pliku.

Chyba sobie już poradzę, przynajmniej zrozumiałem problem. Ewentualnie może
prościej mi będzie sprawdzać zawartość tej zmiennej przez setInterval.

Wielkie dzięki za pomoc!

Pozdrawiam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads