Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [js] onload dla okna otwieranego
yoyo
post 10.01.2004, 23:31:29
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


jak nadać zdarzenie onload dla otwieranego okna z poziomu dokumentu otwierającego?

[xml:1:cda700e341]
<script type="text/javascript">
var win = window.open('dokument.html');
win.window.onload = funkcja;
</script>
[/xml:1:cda700e341]

Powyższe nie działa

PS: zaznaczam, że zależy mi na wykonaniu tego z poziomu dokumentu tworzącego okno a nie z poziomu okna.


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
Cudi
post 10.01.2004, 23:56:38
Post #2


Administrator planeta/IRC


Grupa: Przyjaciele php.pl
Postów: 385
Pomógł: 0
Dołączył: 19.04.2003
Skąd: Zabrze

Ostrzeżenie: (0%)
-----


Wydaje mi sie ze window.open zwraca instancje do obiektu nowego okna, a więc w zmiennej var jest obiekt typu window, w związku z tym powinieneś jego własciwość zmieniać w ten sposób:
[xml:1:9af2f8c87f]<script type="text/javascript">
var win = window.open('dokument.html');
win.onload = funkcja;
</script>[/xml:1:9af2f8c87f]
Mam nadzieje że moje rozumowanie jest dobre winksmiley.jpg


--------------------
"Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog
Go to the top of the page
+Quote Post
Paul
post 11.01.2004, 00:01:43
Post #3





Grupa: Zarejestrowani
Postów: 636
Pomógł: 0
Dołączył: 22.10.2003
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Najlatwiej bedzie zrobic tak, ze zrobisz to bez pliku dokument.html - tzn.
Kod
function nowe_okno(onload){

okno = window.open();

html = '....<body onload="'+onload+'">....';

okno.document.write(html);

okno.document.close();

}

mozna kombinowac jeszcze jesli chce sie dynamicznie zmieniac wartosc.... - tzn. trzymac zawartosc tego okna w polu hidden i potem traktowac funkcja eval
Go to the top of the page
+Quote Post
yoyo
post 11.01.2004, 00:22:12
Post #4





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Cytat
Wydaje mi sie ze window.open zwraca instancje do obiektu nowego okna, a więc w zmiennej var jest obiekt typu window, w związku z tym powinieneś jego własciwość zmieniać w ten sposób:
[xml:1:6b2ef16a47]<script type="text/javascript">
   var win = window.open('dokument.html');
   win.onload = funkcja;
</script>[/xml:1:6b2ef16a47]
Mam nadzieje że moje rozumowanie jest dobre winksmiley.jpg

to też próbowałem... bezskutecznie


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
yoyo
post 11.01.2004, 00:23:36
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Cytat
Najlatwiej bedzie zrobic tak, ze zrobisz to bez pliku dokument.html - tzn.
Kod
function nowe_okno(onload){

okno = window.open();

html = '....<body onload="'+onload+'">....';

okno.document.write(html);

okno.document.close();

}

mozna kombinowac jeszcze jesli chce sie dynamicznie zmieniac wartosc....  - tzn. trzymac zawartosc tego okna w polu hidden i potem traktowac funkcja eval

problem w tym, że dokument docelowy już istnieje i nie mogę go modyfikować (również dynamicznie)


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
hawk
post 11.01.2004, 12:58:58
Post #6





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Podejście pierwsze:
Cytat
Wydaje mi sie ze window.open zwraca instancje do obiektu nowego okna, a więc w zmiennej var jest obiekt typu window, w związku z tym powinieneś jego własciwość zmieniać w ten sposób:
...

Nie.
Atrybut window klasy Window wskazuje na siebie. A zatem
Kod
win.onload == win.window.onload == win.window.window.onload

Podejście drugie:
Cytat
Najlatwiej bedzie zrobic tak, ze zrobisz to bez pliku dokument.html - tzn.
...

Nie.
Po pierwsze, onload jest funkcją, a nie stringiem. Po drugie, nie wystarczy przypisać funkcję do body.onload, trzeba jeszcze dostarczyć definicję funkcji. A tej nowe okno nie ma, bo funkcja jest zdefiniowana w oknie głównym.

Teraz, wracając do tematu...
Cytat
jak nadać zdarzenie onload dla otwieranego okna z poziomu dokumentu otwierającego?

To co podałeś nie działa nie dlatego, że kod jest niepoprawny, tylko dlatego, że najpierw tworzysz okno, a potem przypisujesz funkcję do onload. Funkcja się nie uruchomi, bo okno już jest utworzone i załadowane, zdarzenie load wykonało się linijkę wcześniej. I tego nie przeskoczysz.
Proponuję
Kod
<script type="text/javascript">

    var win = window.open('dokument.html');

    win.onload = funkcja;

    win.onload();

</script>
Go to the top of the page
+Quote Post
yoyo
post 11.01.2004, 16:59:29
Post #7





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Cytat
Proponuję
Kod
<script type="text/javascript">

    var win = window.open('dokument.html');

    win.onload = funkcja;

    win.onload();

</script>


Niestety to wykonuje się zaraz po otworzeniu okna a nie po załadowaniu zawartości zawartej w nim. Z tego co wiem zdarzenie onload powinno się wykonać po załadowaniu całego ciała dokumentu oraz wszystkich tablic obrazków. Skrypt jest mi potrzebny aby pobierać rozmiar elementu BODY po całkowitym załadowaniu. Niestety teraz wykonuje się jeszcze przed załadowaniem się BODY i albo wywala mi błąd, że win.document.body nie istnieje, albo jeśli już zaczął wczytywać, to dosatję rozmiar 0x0, co oznacza, że nie wczytał jeszcze całej jego zawartości (w moim przypadku paru obrazków)


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
hawk
post 11.01.2004, 19:00:12
Post #8





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Aaaaa, i tu jest pies pogrzebany!
Uhm, nie skojarzyłem różnicy między załadować i otworzyć :oops: .

Dobra, w takim razie podejście już chyba w sumie czwarte. Tym razem trochę bardziej skomplikowane.

1) Zmieniasz definicję funkcja():
Kod
<script type="text/javascript">

function funkcja(wnd) {

//zrób cokolwiek, ale zamiast this.cośtam używaj wnd.cośtam

}

</script>

Czyli funkcja() ma działać nie na "swoim" oknie, ale na podanym.

2) Wstawiasz do dokument.html:
Kod
<script type="text/javascript">

function foo() {

window.bar(window);

}

</script>


3) Zmieniasz <body> w dokument.html na <body onload="foo()">

4) Zmieniasz swój javascript na:
Kod
<script type="text/javascript">

    var win = window.open('dokument.html');

    win.bar = funkcja;

</script>


Czyli funkcja zostaje w głównym dokumencie, a nowy dokument dostaje jedynie referencję do funkcji, którą sam sobie musi uruchomić. A funkcja musi wiedzieć na którym oknie operuje.

Teraz to już powinno działać bo nawet sprawdziłem laugh.gif
Go to the top of the page
+Quote Post
yoyo
post 11.01.2004, 19:59:43
Post #9





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


dzięki, pomysłowe... jednak
Cytat
Wstawiasz do dokument.html:

nie jest możliwe, pomimo, że "dokument.html" znajduje się w tym katalogu jest to dokument którego nie mogę zmieniać (pisałem też powyżej o tym)... po prostu chcę wywołać pewną funkcję po załadowaniu w popupie danego dokumentu, bez zmiany jego treści... czy jest to wogóle możliwe? i czemu zdarzenie "obceokno.onload = procedura" nie działa?


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
yoyo
post 13.01.2004, 13:07:42
Post #10





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


jakiś pomysł?


--------------------
cieżko jest żyć lekko
Go to the top of the page
+Quote Post
hawk
post 20.01.2004, 11:19:12
Post #11





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Brak kolejnych postów dowodzi, że chyba nic lepszego nie da się wymyśleć.

Co do pytania: czemu to nie działa tak jak chcesz, ja odpowiem tak: zastosowanie jest nieco zakręcone i specyfikacja języka nie mówi jak dokładnie powinno to być obsłużone, więc niczego nie można wymagać :wink: .

Nie działa pewnie dlatego, że albo zdążył już sobie wczytać i olewa, albo nie zdążył, i przy wczytywaniu nadpisuje i olewa. Albo w ogóle olewa z zasady laugh.gif .

Więc co jeszcze możesz zrobić:

Możesz zastanowić się jakich elementów dokumentu potrzebujesz w tym onload, i poczekać aż one się załadują. Ustawić na timeoucie jakąś funkcję która będzie sprawdzała czy odpowiednie elementy już są, albo czy obrazki się załadowały (obrazki mają do tego jakiś atrybut). To już zależy co w tym dokumencie jest i czy tak się da.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.07.2025 - 20:24