Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Witajcie,

Mam sobie dva na stronie do ktorego mam wczytac kod pobrany ajaxem. I wszystko bangla pod warunkiem, ze w tym kodzie nie ma js... Bo js i owszem wyswietla mi sie w firebugu ale przegladarka go nie wykonuje. Oczywiscie brak jakichkolwiek bledow ze strony js.

I teraz pytanie, czy to tak ma byc? czy to ja cos obie zle? Bo nie ukrywam, ze chcialabym wczytac kod js i zeby przegladarka go wykonala...

konto usunięte

Temat: onload i js

A więcej konkretów ?
Próbowałaś użyć eval() ?
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: onload i js

Eval is evil - nie daj się skusić i nie używaj.

Pytanie jakiej biblioteki używasz do AJAX-a? jQuery? Ma parametr, który mówi, czy skrypty mają być wykonane. Inna? To może inne parametr. Choć jeśli skrypty są dołączone do dokumentu w DOM-ie, to według mojego stanu wiedzy musiały się wykonać, tak więc błąd możesz mieć gdzieś indziej.

Najważniejsze jest jednak to, że jeśli chcesz wykonać skrypty zwrócone przez AJAX, to masz po prostu złą architekturę. Takich rzeczy nie powinno się robić.

Co w zamian? Załaduj ten kod, który chcesz wykonać na samym początku, spakuj go do jakiejś funkcji (taki trochę kontroler, jeśli masz tego więcej) i odpal wtedy kiedy ten AJAX zostanie załadowany. Sposobów na coś takiego jest mnóstwo, więc w szczegóły zagłębiać się nie muszę.

konto usunięte

Temat: onload i js

Jesli uzywasz jquery - uzyj ajaxa i ustaw jako typ "script" i samo sie odpali, jak sie wgra.
Jesli nie, mozesz stworzyc po prostu nowy object script, ustaw mu src, type i dodaj do head. Zaladuje sie i odpali.

eval() jest bezpieczne, pod warunkiem ze dokladnie wiesz co robisz. Wiec faktycznie, lepiej moze nie uzywaj ;)
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Uzywam jquerowej metody getJSON, do urla dodaje parametr callback, bo zapytanie jest cross domain. Kod, ktory wczytuje, to w wiekszosci kilka linijek kodu (wywolanie funkcji zdefiniowanych w pliku js zalaczanym w head) opakowanych w tag script plus jakis html. Nic specjalnego.

Musze to robic onload, bo kod generujacy odpowiedz wykonuje sie czasami i kilka sekund i nas seowiec postawil stanowcze veto :) Wiem, ze architektura jest do bani, ale aplikacja istnieje od kilkunastu lat i jest rozbudowywana na zasadzie paczkowania, przez co wiele elementow troche gryzie sie ze soba.

Wiem, ze eval jest zle i w sumie nigdy jawnie go nie uzywalam (niejawnie uzywam za posrednictwem jquery). Kod ktory otrzymuje jako odpowiedz jest kawalkiem htmla zawierajacym rowniez wstawki scriptowe, np:
<script type="text/javascript">foo('aaa');</script>

i szczerze mowiac, nie wiem, jak tu eval uzyc :)

Kod laduje do kontenera o konkretnym id uzywajac javascriptowej funkcji innerHTML, bo jquery olewa tagi script. Zaladowany kod widze w firebugu, ale zaladowany js sie nie wykonuje. Nie mam zadnej mozliwosci, zeby zmienic to co zwraca mi request... musze jakos dogadac sie z przegladarka, zeby jednak wykonala zaladowany kod.

Bede wdzieczna za wszelkie podpowiedzi i sugestie.

konto usunięte

Temat: onload i js

Moglabys to wczytac jako plik html ajaxem i wINNERowac w diva i powinno sie odpalic, aczkolwiek to nie bedzie dzialac crossdomain ;) A callback to nie jest "uniwersalne obejscie problemu pomiedzy domenami" ;) Sama idea tego co probujesz zrobic jest po prostu zla.

Moja sugestia jest prosta. W ten sposob to co jest w tym pliku, zostanie wladowane w twoj container i przegladarka automatycznie to wykona

var jsFile=document.createElement('script');
jsFile.setAttribute("type","text/javascript");
jsFile.setAttribute("src", 'http://twoj.plik.pl/costam.js');
document.getElementById('twojDiv').appendChild(jsFile);


ps. wszystko robisz JSem, wiec nie wiem co tu ma SEOwiec to powiedzenia.
I tak ma to zerowa wartosc dla googla ;)
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Seowiec narzeka na czas ladowania strony, stad pomysl (jego, nie moj), zeny zamiast to ladowac includem z poziomu php podczas ladowania strony uzyc js i zdarzenia onload.

Twoje rozwiazane na pewno jest bardzo dobre ale nie pasuje do sytuacji. Ja otrzymuje w pseudo jsonie (pseudo bo to obiekt z jadna wlasciwoscia do ktorej przypisany jest caly html) juz gotowe tagi html wraz ze scriptami. Wiec tworzenie ich od 0 nie ma sensu.

konto usunięte

Temat: onload i js

Jezeli glownym powodem dla ktorego probujesz to zrobic jest opinia SEOwca, ktory nie ma zielonego pojecia o stronach, a jego wiedza opiera sie na wpisie z bloga gdzie przeczytal ze czas ladowania sie liczy, to sugeruje walnac go mlotkiem, duzym.

Przepiszcie skrypt tak, by byl sens go ladowac dynamicznie i odpalac bez problemow, bo proba hackowania wlasnego kodu jest delikatnie mowiac - bezsensowna ;)
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Andrzej, tak jak napisalam, nie mam wplywu na to co dostaje. Gdybym miala, nie byloby tego watku :) Podejscie seowca wydaje mi sie zgodne z tym co dzialo sie w innych firmach, w ktorych pracowalam. Obnizenie czasu ladowania strony jest jednym z glownych punktow programu. Wszystko co nie musi byc indexowane przez googla i widziane od razu przez usera moze byc zaladowane pozniej.

Ale ja nie o tym. Dostaje to co dostaje i musze tego uzyc. Pytanie, czy jest jakakolwiek opcja zeby to zrobic bez rozszywania kodu, ktory dostaje?

konto usunięte

Temat: onload i js

Jeśli strona się wolno ładuje, to zazwyczaj JavaScript nie jest głównym winowajcą - no chyba, że masz go na prawdę dużo. Jeśli już MUSISZ umieścić inlinowo (lepiej na końcu, przed zamknięciem body) skrypt w kodzie (bardziej plik JavaScript) to skorzystaj z dynamicznego ładowania skryptów i wówczas wczytywanie JavaScript'u nie będzie blokowało przeglądarki. Tak zaleca Google w przypadu Analytics'a (coś podobnego do przykładu, który podał Andrzej ):
(function() {
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'twoj_skrypt.js';
var el = document.getElementById('twoj_id');
el.appendChild(s);
})();

Oczywiście pamiętaj o umieszczeniu tego w samowywołującej funkcji anonimowej, żeby ograniczyć scope.Mateusz G. edytował(a) ten post dnia 21.06.12 o godzinie 14:32
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Tylko co ja mam wedlug Ciebie zaladowac do do tego skryptu? jak pisalam, jako odpowiedz z serwera dostaje kod HTML wraz z sekcjami script, a nie goly JS (gdyby to byl goly JS tego watku by nie bylo).

I uzywam eventu onload zeby to zaladowac, wiec strona jest juz zaladowana, gdy skrypt zaczyna sie wykonywac. Oczywiscie moj kod tez jest w funkcji anonimowej.

Poki co doszukalam sie skryptu, ktory wciaga moja odpowiedz z serwera, wyszukuje tagow script i pusza przez eval ich zawartosc. Nie mam wielkich nadziei, ale zobaczymy moze zabangla.
Maja Miarecki

Maja Miarecki Senior Frontend
Developer

Temat: onload i js

Mateusz G.:
Jeśli strona się wolno ładuje, to zazwyczaj JavaScript nie jest głównym winowajcą - no chyba, że masz go na prawdę dużo.

Nie, nie JS, ale JS wola jakis url i zanim dostanie odpowiedz chwile to trwa (np 3 sekundy u niektorych naszych partnerow), stad zalecenie naszego seowca, zeby takich "hamulcowych" wywalic do onload.

konto usunięte

Temat: onload i js

Maja Miarecka:
Tylko co ja mam wedlug Ciebie zaladowac do do tego skryptu? jak pisalam, jako odpowiedz z serwera dostaje kod HTML wraz z sekcjami script, a nie goly JS (gdyby to byl goly JS tego watku by nie bylo).

Nie doczytałem dokładnie, przepraszam. Ogólnie (jak już pisali koledzy) eval to słabe rozwiązanie i jeśli faktycznie nie masz innej możliwości, to chyba najlepszym (zdecydowanie lepszym niż eval) rozwiązaniem będzie to co już również się pojawiło - użycie jQuery.



Wyślij zaproszenie do