Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Załączanie prototype poprzez js
Forum PHP.pl > Forum > Przedszkole
Victor152
Witajcie!

Załączam bibliotekę prototype w javascripcie w ten sposób:
[JAVASCRIPT] pobierz, plaintext
  1. var underUrl = 'http://victor.org.pl/vibox/';
  2.  
  3. function LoadScript(file)
  4. {
  5. var script = document.createElement('script');
  6. script.src = file;
  7. script.type = 'text/javascript';
  8.  
  9. document.getElementsByTagName('head').item(0).appendChild(script);
  10. }
  11.  
  12. onload = function()
  13. {
  14. LoadScript(underUrl + "js/prototype.js");
  15. }
[JAVASCRIPT] pobierz, plaintext


Jak widać biblioteka niby się ładuje:
http://victor.org.pl/vibox/ (spójrzcie FireBugiem w <head>), lecz jednak konsola błędów wywala:
Cytat
Błąd: Insertion is not defined
Plik źródłowy: http://victor.org.pl/vibox/execute.js
Wiersz: 15


Gdy załącze w htmlu z ręki wszystko działa.
Macie jakiś pomysł? Może onload jest za wcześnie lub za późno do załadowania prototype?
zegarek84
jak mniemam Insertion jest obiektem prototype questionmark.gif - załączyłeś w DOM źródło a nie poczekałeś aż się załaduje - zrób tak:
script.onload = init_metody_prototype; // lub function(){...}
script.type = 'text/javascript';
script.src = file;

Cytat
/* w js niby mało piszę ale go w miarę rozumiem jednak z zapisem getElementsByTagName('head').item(0) to spotkałem się do tej pory w DOM php czyli getElementsByTagName('head')->item(0), w js zawsze wystarczyło getElementsByTagName('head')[0] - nie chce mi się sprawdzać ale też pytanie czy na pewno dobrze element wskazujesz?? */
Neutralnie językowym sposobem jest używanie metody item(), zdefiniowanej w interfejsie NodeList): anchorTags.item(1).href. Jednak większość implementacji JavaScriptu pozwala na używanie prostszej, tablicowej składni i takiej właśnie używa większość ludzi.

ok - nie było tego pytania ;p

a i daj może window.onload a nie samo onload...
Victor152
Mam tak:
[JAVASCRIPT] pobierz, plaintext
  1. var underUrl = 'http://victor.org.pl/vibox/';
  2.  
  3. function LoadScript(file, metoda)
  4. {
  5. var script = document.createElement('script');
  6. script.src = file;
  7. script.onload = metoda;
  8. script.type = 'text/javascript';
  9.  
  10. document.getElementsByTagName('head').item(0).appendChild(script);
  11. }
  12.  
  13. LoadScript(underUrl + "js/prototype.js");
  14.  
  15. window.onload = function() {
  16. LoadScript(underUrl + "js/prototype.js", 'start');
  17. }
  18.  
  19. function start()
  20. {
  21. new Insertion.After('viBox_js', new Element('div', {id: 'viBox'}));
  22. }
[JAVASCRIPT] pobierz, plaintext


A on tylko jedno - nie ma funkcji Insertion...
zegarek84
przede wszystkim pierwsze i najważniejsze zastrzeżenie to źle przekazujesz funkcję start jako parametr - a właściwie jej nie przekazujesz tylko przekazujesz tekst...

po drugie tego błędu nie powinno być z tego powodu o którym wspomniałem wcześniej a powinien być inny (sprawdzałem w konsoli w operze) - czyli suma sumarum celu i tak nie osiągnąłbyś ale przynajmniej szukałbyś poprawnych błędów - jednak wspomniane błędy dalej występują przedewszystkim przez Twoją niekonsekwencję...:
Cytat
LoadScript(underUrl + "js/prototype.js");

window.onload = function() {
LoadScript(underUrl + "js/prototype.js", 'start');
}

to w końcu chcesz wywołać tą funkcję po wczytaniu dokumentu czy wogóle wczas?? - to po co wtedy window.onload?questionmark.gif

skoro już szukałem dokładnie błędów to już dam Ci gotowca gdyż pewnie i tak się nie dostosujesz do powyższych wskazówek (już ok jakby to nie działało i jakby chodziło o tekst a nie funkcję ale mogłeś resztę dokładniej zrobić jak wyżej pisałem w poprzednim poście)...
to działa jak zmieniłem źródła w operze...:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html lang="pl">
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4. <link href="style.css" rel="stylesheet" type="text/css" />
  5. <title>Tytuł strony</title>
  6. </head>
  7. <h1>Nagłówek pierwszego poziomu ZMODYFIKOWANE ŹRÓDŁO W OPERZE</h1>
  8. <p>
  9. Akapit (z ang. paragraph)<br />
  10. i jeszcze trochę tekstu w następnym wierszu<br />
  11. <a href="http://pl.wikipedia.org">
  12. a to link do Wikipedii</a>.
  13. </p>
  14. <h1>A tutaj będą boxy:</h1>
  15. <p>
  16. <script type="text/javascript">
  17. var viBox_client_id = 1;
  18. </script>
  19. <script id="viBox_js" type="text/javascript">
  20. var underUrl = 'http://victor.org.pl/vibox/';
  21.  
  22. function LoadScript(file, metoda)
  23. {
  24. var script = document.createElement('script');
  25. script.onload = metoda;
  26. script.type = 'text/javascript';
  27. script.src = file;
  28. document.getElementsByTagName('head').item(0).appendChild(script);
  29. }
  30.  
  31.  
  32. window.onload = function() {
  33. LoadScript(underUrl + "js/prototype.js", start);
  34. }
  35.  
  36. function start()
  37. {
  38. new Insertion.After('viBox_js', new Element('div', {id: 'viBox'}));
  39. $('viBox').update('<div id="title"></div><div id="advers"></div><div id="info"></div>');
  40.  
  41. new Ajax.Request("advers.php",
  42. {
  43. method: 'get',
  44. parameters: {'client_id' : viBox_client_id},
  45. requestHeaders: {Accept: 'application/x-json'},
  46. onSuccess: function(transport, json) {
  47. var data = transport.responseText.evalJSON();
  48.  
  49. $('title').update('Reklama na ' + data.client_nurl + ':');
  50. $('info').update('<a href="' + underUrl + 'buyadver.php?client_id=' + data.client_id + '">' + data.client_buyadver + '</a><span class="powered"><a href="http://vibox.victor.org.pl/">viBox powered!</a></span>');
  51.  
  52.  
  53. data.advers.each( function(adver) {
  54. new Insertion.Bottom('advers', new Element('div', {id: 'viAdver_' + adver.who}));
  55.  
  56. $('viAdver_' + adver.who).update('<a href="' + adver.url + '" class="adver"><img src="' + adver.image + '" alt="' + adver.title + '" /></a>');
  57. });
  58.  
  59.  
  60. }
  61. }
  62. );
  63. }
  64.  
  65.  
  66. </p>
  67. </body></html>
Victor152
Dziękuję bardzo za pomoc!

Tak w ogóle to po poprawkach nie wysłałem owego pliku js na serwerek, wiec moja glupota takze zmarnowała Twój czas. Dzięki jeszcze raz!

Pytanie z innej beczki (choć apropos).
Pokazuje Wam boxy na Ie 7+ ?
Czemu nie działa na Ie6 ?
http://victor.org.pl/vibox/

Na ie8 nie śmiga.
Nie sądze, by był to problem prototype:
http://browsershots.org/screenshots/d09979...e9608eff6f14e8/
thomson89
Tak. Mam IE8 i nie działa, a pod operą już tak.
zegarek84
Cytat(Victor152 @ 6.12.2009, 14:11:54 ) *
Pytanie z innej beczki (choć apropos).
...
Nie sądze, by był to problem prototype...

tak z innej beczki...
prototype jest ok - problem leży przy samym onload dla elementów script i css w ie - sorki ale nie zajmuję się programowaniem w strikte tego słowa znaczeniu ;p - bardziej hobbystycznie i bardziej php [php mi się przydaje do obróbki niektórych danych] (na razie przez pracę i studia nie mam czasu)...
zerknąłem do wujka google i przerobiłem jedną funkcję - zamień u siebie funkcję LoadScript na:
[JAVASCRIPT] pobierz, plaintext
  1. function LoadScript(file, metoda)
  2. { var done = false;
  3. var script = document.createElement('script');
  4. script.onload = script.onreadystatechange = function(){
  5. if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) {
  6. done = true; metoda();
  7. // Prevent IE memory leaking
  8. script.onload = script.onreadystatechange = null;
  9. }
  10. };
  11. script.type = 'text/javascript';
  12. script.src = file;
  13.  
  14. document.getElementsByTagName('head').item(0).appendChild(script);
  15. }
[JAVASCRIPT] pobierz, plaintext

akurat miałem pod ręką laptop dziewczyny to sprawdziłem ofline (no ofline ajax nie działa ale ramki się pokazały) - ie8...

ps. weź jeszcze pod uwagę jeszcze jeden fakt - z tego co wiem/pamiętam to czasem mogą być problemy jeśli w pierwszej kolejności definiuje się źródło a w drugiej zdarzenie onload - dlatego wpierw przypisz funkcję sprawdzającą a dopiero potem źródło (nie koniecznie tutaj ale raczej lepiej wyrabiać sobie dobry nawyk)

pozdro...
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.