Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Manipulacja zawartością tagu Head
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
starach
Witam,

[JAVASCRIPT] pobierz, plaintext
  1. function Autoload() {}
  2. Autoload.aFiles = new Array('options', 'background')
  3. Autoload.init = function()
  4. {
  5. $Head = document.getElementsByTagName("head");
  6. for($index in Autoload.files)
  7. {
  8. $sScript = '<script type="text/javascript" src="/script/'+Autoload.aFiles[$index]+'.js"></script>';
  9. $Head[0].innerHTML = $Head[0].innerHTML + $sScript;
  10. }
  11. alert($Head[0].innerHTML)
  12. }
  13. window.onload = Autoload.init();
[JAVASCRIPT] pobierz, plaintext
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <script type="text/javascript" src="/script/autoload/background.js"></script>
  5. </head>
  6. <body>
  7. </body>
  8. </html>
Powyższy skrypt ma na celu ładowanie bibliotek JavaScript. Niestety nie robi tego. Skrypt działa jeśli użyję jQuery. Jednym w tym projekcie nie chcę używać jQuery.
darko
To chyba sam zapomniałeś, że nie używasz jQuery, zmienne w javascript definiuje się używając słowa kluczowego var , a nie symbolu $. Poza tym jeśli nie działa, to jaki jest komunikat błędu questionmark.gif
starach
Można używać dolarka. Korzystam z niego bo po prostu łatwiej jest odróżnić zmienne wewnątrz metod od innych części skryptu. W tym samym celu stosuję notację węgierską.
[JAVASCRIPT] pobierz, plaintext
  1. function Autoload() {}
  2. Autoload.aFiles = new Array('options', 'background')
  3. Autoload.init = function()
  4. {
  5. $Head = document.getElementsByTagName("head")[0];
  6. for($index in Autoload.files)
  7. {
  8. $sScript = '<script type="text/javascript" src="/script/'+Autoload.aFiles[$index]+'.js"></script>';
  9. $Head.appendChild($sScript);
  10. }
  11. alert($Head.innerHTML)
  12. Background.init();
  13. }
  14. window.onload = Autoload.init();
[JAVASCRIPT] pobierz, plaintext


Błąd: Uncaught ReferenceError: Background is not defined.

vokiel
A czy przypadkiem w linii 6 nie powinno być Autoload.aFiles
darko
No ok, tylko, że wywołujesz Background.init();, a gdzie masz zdefiniowane Background questionmark.gif
starach
O kurcze faktycznie.

Tym razem dostaję inny błąd - Uncaught Error: NOT_FOUND_ERR: DOM Exception 8

uncaught exception: [Exception... "Could not convert JavaScript argument arg 0" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: file:///D:/Projekty/Firefox%20RSS%20Bookmarks/1.0/script/autoload/background.js :: anonymous :: line 9" data: no]

Linia 9 czyli $Head.appendChild()

edit>
Darko zlituj się. Przecież właśnie ten skrypt ma za zadanie ładować plik z tą klasą...

edit>>
Zmieniłem z powrotem appendChild na innerHTML i tym razem...

Uncaught Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7

Czyli co? Nie można tego zmodyfikować?
vokiel
Pokaże Ci moją funkcję do dołączania plików js:
[JAVASCRIPT] pobierz, plaintext
  1. function include(file) {
  2. if (document.createElement && document.getElementsByTagName) {
  3. var head = document.getElementsByTagName('head')[0];
  4. var script = document.createElement('script');
  5. script.setAttribute('type', 'text/javascript');
  6. script.setAttribute('src', file);
  7. head.appendChild(script);
  8. } else {
  9. alert('Twoja przeglądarka to stara dupa nie potrafi obsługiwać DOM. Zmień ją!');
  10. }
  11. }
[JAVASCRIPT] pobierz, plaintext


Pamiętam, że miałem problem z insertHTML w sekcji head. appendChild powinien chyba przekazywać element dokumentu, a nie string'a.
starach
Właśnie napisałem coś podobnego.

[JAVASCRIPT] pobierz, plaintext
  1. function Autoload() {}
  2. Autoload.aFiles = new Array('options', 'background')
  3. Autoload.init = function()
  4. {
  5. $Head = document.getElementsByTagName("head")[0];
  6. for($index in Autoload.aFiles)
  7. {
  8. $Src = document.createAttribute("src");
  9. $Src.nodeValue = "text/javascript"
  10. $Type = document.createAttribute("type");
  11. $Type.nodeValue = "/script/"+Autoload.aFiles[$index]+".js"
  12. $Script = document.createElement('script');
  13. $Script.setAttributeNode($Src);
  14. $Script.setAttributeNode($Type);
  15. $Head.appendChild($Script);
  16. }
  17. alert($Head.innerHTML)
  18. Background.init();
  19. }
  20. window.onload = Autoload.init();
[JAVASCRIPT] pobierz, plaintext


I teraz innerHTML jest poprawny, ale! Niestety dalej wyświetla komunikat: Uncaught ReferenceError: Background is not defined

edit>
OMG ! Chyba sobie kawki zaparzę bo takie debilne błędy popełniam że aż mnie to smuci...

edit>>
[JAVASCRIPT] pobierz, plaintext
  1. function Autoload() {}
  2. Autoload.aFiles = new Array('options', 'background')
  3. Autoload.init = function()
  4. {
  5. $Head = document.getElementsByTagName("head")[0];
  6. for($index in Autoload.aFiles)
  7. {
  8. $Src = document.createAttribute("src");
  9. $Src.nodeValue = "script/"+Autoload.aFiles[$index]+".js";
  10. $Type = document.createAttribute("type");
  11. $Type.nodeValue = "text/javascript";
  12.  
  13. $Script = document.createElement('script');
  14. $Script.setAttributeNode($Src);
  15. $Script.setAttributeNode($Type);
  16.  
  17. $Head.appendChild($Script);
  18. }
  19. Background.init();
  20. }
  21. window.onload = Autoload.init();
[JAVASCRIPT] pobierz, plaintext
Poprawiłem. Wszystko jest tam gdzie trzeba. A on dalej nie mi wrzeszczy że nie ma klasy.
[JAVASCRIPT] pobierz, plaintext
  1. function Autoload() {}
  2. Autoload.aFiles = new Array('options', 'background')
  3. Autoload.include = function($sFile)
  4. {
  5. if (document.createElement && document.getElementsByTagName)
  6. {
  7. var head = document.getElementsByTagName('head')[0];
  8. var script = document.createElement('script');
  9. script.setAttribute('type', 'text/javascript');
  10. script.setAttribute('src', $sFile);
  11. head.appendChild(script);
  12. } else {
  13. alert('Twoja przeglądarka to stara dupa nie potrafi obsługiwać DOM. Zmień ją!');
  14. }
  15. }
  16. Autoload.init = function()
  17. {
  18. for($index in Autoload.aFiles)
  19. {
  20. Autoload.include("script/"+Autoload.aFiles[$index]+".js");
  21. }
  22. Background.init();
  23. }
[JAVASCRIPT] pobierz, plaintext
Tak też nie działa. Mimo że w inspektorze kodu widzę że dodał obie linijki.
vokiel
Czyli dołączył źródła? Pliki są wczytywane?
Może problem jest z samym background.init() ?
Może zmień nazwę z background na jakąś, która na pewno nie jest częścią języka.
starach
Goście z listy dyskusyjnej powiedzieli mi że problem leży - w moim rozumowaniu - ;p
Otóż dodając tagi script JavaScriptu nie ładuje się od razu a potem przechodzi do następnej iteracji ładuje się znowu i natrafia na Background.ini(). Skrypt się wykonuje dalej mimo że tak na prawdę to autoload jeszcze nie został zakończony, natrafia na owy wpis i dostaje bzika.

Cytat
your code doesn't work because the script hasn't loaded
yet. When you inject a script tag into the DOM, it's loaded asynchronously
by design(...)
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.