X
ďťż

[JS] Dynamiczne wczytywanie skryptów widzi-misie przeglądarek

       

Podstrony


telcocafe

function include(file, loaded) { var js = document.createElement('script'); js.type = 'text/javascript'; js.src = file; //Wywołaj funkcję, gdy plik zostanie załadowany if(loaded) { js.onreadystatechange = function() { if(js.readyState == 'complete') loaded() }; js.onload = loaded; } document.getElementsByTagName('head')[0].appendChild(js); }
Funkcja dołącza dynamicznie skrypt Javascript i opcjonalnie wywołuje po załadowaniu funkcję przekazaną do loaded.

Jak przeglądarki radzą sobie z tym? Testowałem w: IE 8, Chrome 2.0.172.33, Opera 9.61, FX 3.5, Safari 4.30.19.1

onload: Opera 9, Chrome 2, FX 3.5, Safari 4.30
onreadystatechange: IE 8, Opera 9.6

Internet Explorer
Studium przypadku - zazwyczaj wartość readyState kończy się na 'loaded'. Czasami 'complete'.

Opera
Własność readyState przyjmuje wartości 'interactive' i 'loaded'. Potem przenosi się do onload. Gdy dopuszczę wartość 'loaded' dla readyState, Opera wywoła funkcję przekazaną jako parametr kilka razy.

Chrome 2, Firefox 3.5, Safari 4.30
Obsługują tylko własność onload, więc nie ma problemu z wywołaniem funkcji w odpowiednim momencie. Na blogach można przeczytać, że w Safari kod w ogóle nie działa. Musieli to poprawić.

Używam tej funkcji m.in. do wczytywania formularza do komentowania. Przed wywołaniem żądania AJAX trzeba jeszcze załadować kilka plików .js właśnie za pomocą include() - w kolejności: edytor i listę emotikon. Wartość 'loaded' dla readyState jeszcze nie świadczy o tym, że skrypt jest załadowany całkowicie. Jak zmodyfikować funkcję include(), aby działała na każdej przeglądarce - przynajmniej IE 6, Firefox 2, Opera 9.0, Chrome 2, Safari 4? Właściwie jest problem tylko z IE wraz z najnowszą wersją 8 - niezawodną, szybką (nawigujcie w niej Last.FM), zgodną ze standardami. :busted_blue:
Użytkownik Ferrari edytował ten post 16 lipiec 2009, 18:26


osobiście zwykle poprostu instrukcje pobrania następnego dołaczałem na końcu poprzedniego i problem stanu odpadał. Teraz zwykle używam jQuery.
$.ajax({url: 'dada.js',succes: function(s){eval(s); pobierzNastepny();}}) i już.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.

    Drogi uzytkowniku!

    W trosce o komfort korzystania z naszego serwisu chcemy dostarczac Ci coraz lepsze uslugi. By moc to robic prosimy, abys wyrazil zgode na dopasowanie tresci marketingowych do Twoich zachowan w serwisie. Zgoda ta pozwoli nam czesciowo finansowac rozwoj swiadczonych uslug.

    Pamietaj, ze dbamy o Twoja prywatnosc. Nie zwiekszamy zakresu naszych uprawnien bez Twojej zgody. Zadbamy rowniez o bezpieczenstwo Twoich danych. Wyrazona zgode mozesz cofnac w kazdej chwili.

     Tak, zgadzam sie na nadanie mi "cookie" i korzystanie z danych przez Administratora Serwisu i jego partnerow w celu dopasowania tresci do moich potrzeb. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

     Tak, zgadzam sie na przetwarzanie moich danych osobowych przez Administratora Serwisu i jego partnerow w celu personalizowania wyswietlanych mi reklam i dostosowania do mnie prezentowanych tresci marketingowych. Przeczytalem(am) Polityke prywatnosci. Rozumiem ja i akceptuje.

    Wyrazenie powyzszych zgod jest dobrowolne i mozesz je w dowolnym momencie wycofac poprzez opcje: "Twoje zgody", dostepnej w prawym, dolnym rogu strony lub poprzez usuniecie "cookies" w swojej przegladarce dla powyzej strony, z tym, ze wycofanie zgody nie bedzie mialo wplywu na zgodnosc z prawem przetwarzania na podstawie zgody, przed jej wycofaniem.