Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Jak wstawić skrypt JS?

7 views
Skip to first unread message

Marek

unread,
May 7, 2013, 5:24:07 PM5/7/13
to
Wstawiam na stronę WWW widget pogodowy:

<div class="box">
<script type="text/javascript"
src="http://www.pogodynka.pl/widget/get/gdansk_gdansk/?a1=FFFFFF&a2=0088FF"></script>
</div>

Pięknie się wyświetla ale ma jeden feler: serwer jest bardzo wolny i
blokuje ładowanie się strony (wykonywanie innych skryptów) czasem o
kilkadziesiąt sekund. Czy da się bez angażowania programowania po
stronie serwera załadować i wykonać ten skrypt asynchronicznie? Dodanie
async=true nie zadziała gdyż skrypt zwraca document.write(...) więc musi
się wykonać dokładnie w tym miejscu gdzie ma się pogoda wyświetlić.

Ajax też nie zadziała bo wywołanie jest między domenowe.

Czy jest jeszcze jakiś sposób?

--
Pozdrawiam
Marek

Cezary Tomczyk

unread,
May 8, 2013, 3:23:14 AM5/8/13
to
Ja bym zrobił tak:

<div class="box">
<script>
var s = document.createElement('script'),
head = document.head || document.getElementsByTagName('head')[0];
s.async = 'async';
s.src = 'http://www.pogodynka.pl/widget/get/gdansk_gdansk/?a1=FFFFFF&a2=0088FF';
head.insertBefore(s, head.firstChild);
</script>
</div>

"Ale"... to wcale nie musi być rozwiązanie problemu. "Pogodynka" po załadownaniu script-u może uruchamiać taką ilość requestów, że "zapycha" się maksymalna ilość requestów, jakie może wykonać przeglądarka dla jednej lokalizacji w tym samym czasie.

Spróbuj jeszcze uruchomić powyższe po załadowaniu zawartości strony:

<div class="box">
<script>
window.onload = function () {
var s = document.createElement('script'),
head = document.head || document.getElementsByTagName('head')[0];
s.async = 'async';
s.src = 'http://www.pogodynka.pl/widget/get/gdansk_gdansk/?a1=FFFFFF&a2=0088FF';
head.insertBefore(s, head.firstChild);
};
</script>
</div>

+ uwagi:
https://developer.mozilla.org/pl/docs/DOM/window.onload#Uwagi

--
Cezary Tomczyk
http://www.ctomczyk.pl/

Marek

unread,
May 8, 2013, 1:52:33 PM5/8/13
to
A jak to w zasadzie ma dzia�a�? Z tego co widz�, to z pogodynki zostanie
odczytany JS, kt�ry wygl�da tak:

document.write("...");

No i ta tre�� zostanie wstawiona do head'a asynchronicznie (czyli de
facto po za�adowaniu si� kodu strony). Czyli powstanie taki kod strony:

<head>
<script>
document.write("...tu HTML");
</script>

<title>...</title>
....
</head>

W ten spos�b:

1. Nie zostanie wykonany kod JS lecz tylko wstawiony. Czy tak? Parser
kodu JS browsera dawno przeszed� ten fragment wi�c wstawienie w to
miejsce czegokolwiek nie spowoduje wykonania tego kodu. Trzeba by
wywo�a� eval() tego co przyjdzie.

2. Nawet je�li ten kod uda�oby si� wykona� to efekt jego pracy powstanie
w sekcji <head>, co b�dzie nieprawid�ow� lokalizacj� dynamicznie
wygenerowanego kodu. W ko�cu chcemy aby prognoza pogody wy�wietli�a si�
gdzie� w tre�ci strony WWW a nie w nag��wku.


--
Pozdrawiam
Marek

ABC

unread,
May 8, 2013, 3:11:58 PM5/8/13
to
W dniu 07.05.2013 23:24, Marek pisze:
> Czy jest jeszcze jakiś sposób?

Może napisać kawałek kodu w PHP:
* pobrać URL
* wywalić document.write('...') i zostanie sam HTML
* wstawić w kod strony

Można tez dorobić cache, aby nie pobierać prognozy przy każdej odsłonie
strony.

Marek

unread,
May 9, 2013, 2:23:48 AM5/9/13
to
W dniu 2013-05-08 21:11, ABC pisze:
> W dniu 07.05.2013 23:24, Marek pisze:
>> Czy jest jeszcze jakiś sposób?
>
> Może napisać kawałek kodu w PHP:
> * pobrać URL
> * wywalić document.write('...') i zostanie sam HTML
> * wstawić w kod strony

Zacytuję swoje słowa z wątku otwierającego:

"Czy da się bez angażowania programowania po stronie serwera załadować i
wykonać ten skrypt asynchronicznie?" :-D

> Można tez dorobić cache, aby nie pobierać prognozy przy każdej odsłonie
> strony.

Cache w JS? W jaki sposób? Cookies do tego celu się nie nadają gdyż są
zbyt krótkie.

--
Pozdrawiam
Marek

Paweł Piskorz

unread,
May 9, 2013, 10:40:49 AM5/9/13
to
W dniu 2013-05-07 23:24, Marek pisze:
> Wstawiam na stronę WWW widget pogodowy:
>
> <div class="box">
> <script type="text/javascript"
> src="http://www.pogodynka.pl/widget/get/gdansk_gdansk/?a1=FFFFFF&a2=0088FF"></script>
>
> </div>
>
> Pięknie się wyświetla ale ma jeden feler: serwer jest bardzo wolny i
> blokuje ładowanie się strony (wykonywanie innych skryptów) czasem o
> kilkadziesiąt sekund. Czy da się bez angażowania programowania po
> stronie serwera załadować i wykonać ten skrypt asynchronicznie?

Wrzuć go do iframe.


--
message[autor="PablO"]::after {
content:"Pozdrawiam";
}

Marek

unread,
May 9, 2013, 12:02:43 PM5/9/13
to
W dniu 2013-05-09 16:40, Paweł Piskorz pisze:
>
> Wrzuć go do iframe.

No tak, najprostsze rozwiązania najtrudniej dostrzec. :-D
Dzięki :-)


--
Pozdrawiam
Marek

Marek

unread,
May 9, 2013, 3:47:47 PM5/9/13
to
W dniu 2013-05-09 18:02, Marek pisze:
>> Wrzuć go do iframe.
>
> No tak, najprostsze rozwiązania najtrudniej dostrzec. :-D
> Dzięki :-)

Może wyjaśnienie dla pokoleń.
Nie należy wrzucać <iframe src="weather.html"> gdyż nic się nie zmieni.
Strona nadal będzie czekała na uruchomienie się skryptów w kodzie
weather.html. Należy w JS dynamicznie ustawić src jako ostatnią
instrukcję w kodzie inicjującym.


--
Pozdrawiam
Marek
0 new messages