ďťż
Podstrony
|
telcocafefunction 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ż. |
|||
Sitedesign by AltusUmbrae. |