Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] onload dla okna otwieranego
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
yoyo
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.
Cudi
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
Paul
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
yoyo
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
yoyo
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)
hawk
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>
yoyo
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)
hawk
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
yoyo
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?
yoyo
jakiś pomysł?
hawk
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.
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.