Jak mogę odwołać się do elementu skryptu, który załadował aktualnie uruchomiony skrypt javascript?
Oto sytuacja. Skrypt „master” jest ładowany wysoko na stronie, najpierw pod znacznikiem HEAD.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>
W „scripts.js” znajduje się skrypt, który musi umożliwiać ładowanie innych skryptów na żądanie. Normalna metoda nie do końca działa, ponieważ muszę dodać nowe skrypty bez odwoływania się do znacznika HEAD, ponieważ element HEAD nie zakończył renderowania:
document.getElementsByTagName('head')[0].appendChild(v);
Chcę odwołać się do elementu skryptu, który załadował bieżący skrypt, aby móc następnie dołączyć nowe dynamicznie ładowane tagi skryptu do DOM po nim.
<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>
javascript
element
parent
Shog9
źródło
źródło
Odpowiedzi:
Jak uzyskać bieżący element skryptu:
1. Użyj
document.currentScript
document.currentScript
zwróci<script>
element, którego skrypt jest aktualnie przetwarzany.Korzyści
defer
iasync
)Problemy
<script type="module">
2. Wybierz skrypt według identyfikatora
Nadanie skryptowi atrybutu id pozwoli ci łatwo wybrać go według identyfikatora z poziomu jego użycia
document.getElementById()
.Korzyści
defer
iasync
)Problemy
id
atrybut może powodować dziwne zachowanie skryptów w niektórych przeglądarkach w niektórych przypadkach krawędzi3. Wybierz skrypt za pomocą
data-*
atrybutuNadanie skryptu
data-*
atrybutu pozwoli Ci łatwo wybrać go od wewnątrz.Ma to kilka zalet w porównaniu z poprzednią opcją.
Korzyści
defer
iasync
)Problemy
querySelector()
niezgodny we wszystkich przeglądarkachid
atrybutu<script>
zid
przypadkowymi skrzyniami.4. Wybierz skrypt według src
Zamiast używać atrybutów danych, możesz użyć selektora, aby wybrać skrypt według źródła:
W embed.js:
Korzyści
defer
iasync
)Problemy
id
atrybutu5. Pętlę nad wszystkimi skryptami, aby znaleźć ten, który chcesz
Możemy również zapętlić każdy element skryptu i sprawdzić każdy z osobna, aby wybrać ten, który chcemy:
To pozwala nam używać obu poprzednich technik w starszych przeglądarkach, które nie obsługują
querySelector()
dobrze atrybutów. Na przykład:Dziedziczy to korzyści i problemy wynikające z zastosowanego podejścia, ale nie zależy od tego,
querySelector()
więc będzie działać w starszych przeglądarkach.6. Pobierz ostatni wykonany skrypt
Ponieważ skrypty są wykonywane sekwencyjnie, ostatnim elementem skryptu bardzo często będzie aktualnie uruchomiony skrypt:
Korzyści
Problemy
defer
&async
)źródło
script
jesttemplate
wstawiony do DOMPonieważ skrypty są wykonywane sekwencyjnie, aktualnie wykonywany tag skryptu jest zawsze ostatnim tagiem skryptu na stronie do tego czasu. Aby uzyskać tag skryptu, możesz:
źródło
Prawdopodobnie najłatwiej byłoby nadać
id
atrybutowi scrip tag .źródło
Skrypty są wykonywane sekwencyjnie tylko wtedy, gdy nie mają atrybutu „odroczenia” ani „asynchronizacji”. Znajomość jednego z możliwych atrybutów ID / SRC / TITLE znacznika skryptu może również działać w takich przypadkach. Tak więc sugestie Grega i Justina są poprawne.
Jest już propozycja
document.currentScript
na liście WHATWG.EDYCJA : Firefox> 4 już zaimplementował tę bardzo przydatną właściwość, ale nie jest ona dostępna w IE11 ostatnio sprawdziłem i dostępna tylko w Chrome 29 i Safari 8.
EDYCJA : Nikt nie wspomniał o kolekcji „document.scripts”, ale uważam, że poniższe mogą być dobrą alternatywą dla różnych przeglądarek, aby uzyskać aktualnie uruchomiony skrypt:
źródło
Oto odrobina wypełnienia, które wykorzystuje,
document.CurrentScript
jeśli istnieje i powraca do znalezienia skryptu według identyfikatora.Jeśli umieścisz to u góry każdego tagu skryptu, uważam, że będziesz w stanie konsekwentnie wiedzieć, który tag skryptu jest uruchamiany, a także będziesz mógł odwoływać się do tagu skryptu w kontekście asynchronicznego wywołania zwrotnego.
Nie przetestowano, więc jeśli spróbujesz, zostaw opinię innym.
źródło
id
Atrybutem jest nieważny wscript
elemencie chociaż. Jakie problemy może powodować to podejście?id
atrybut.id
,class
islot
są zdefiniowane na poziomie DOM, a nie na poziomie HTML. Jeśli przejdziesz do globalnych atrybutów w HTML i przewiniesz listę, zobaczysz, że „DOM DOM określa wymagania agenta użytkownika dla atrybutów klasy, identyfikatora i boksu dla dowolnego elementu w dowolnej przestrzeni nazw”. po którym następuje „Atrybuty klasy, identyfikatora i boksu mogą być określone we wszystkich elementach HTML”. Specyfikacja DOM obejmuje to tutaj .Musi działać przy ładowaniu strony i po dodaniu znacznika skryptu z javascript (np. Z ajax)
źródło
Wykonaj te proste kroki, aby uzyskać odniesienie do bieżącego bloku skryptu wykonującego:
Przykład (ABCDE345678 jest unikalnym identyfikatorem) :
btw, w twoim przypadku, możesz po prostu użyć starej metody document.write (), aby dołączyć inny skrypt. Jak wspomniałeś, że DOM nie jest jeszcze renderowany, możesz skorzystać z faktu, że przeglądarka zawsze wykonuje skrypt w kolejności liniowej (z wyjątkiem odroczonego, który zostanie wyrenderowany później), więc reszta twojego dokumentu nadal „nie istnieje”. Wszystko, co napiszesz za pomocą document.write (), zostanie umieszczone zaraz po skrypcie wywołującym.
Przykład oryginalnej strony HTML :
Treść script.js :
Po wyrenderowaniu struktura DOM stanie się:
źródło
Podejście do radzenia sobie ze skryptami asynchronicznymi i odroczonymi polega na wykorzystaniu modułu obsługi obciążenia - ustaw moduł obsługi obciążenia dla wszystkich znaczników skryptu, a pierwszy, który wykonuje, powinien być twój.
źródło
Aby uzyskać skrypt, który aktualnie załadował skrypt, możesz użyć
Musisz zachować odniesienie na początku skryptu, aby móc później zadzwonić
źródło
Rozważ ten algorytm. Gdy skrypt zostanie załadowany (jeśli istnieje wiele identycznych skryptów), przejrzyj document.scripts, znajdź pierwszy skrypt z poprawnym atrybutem „src”, a następnie zapisz go i oznacz jako „odwiedzony” atrybutem danych lub unikalną nazwą klasy.
Po załadowaniu następnego skryptu ponownie przejrzyj skrypty document.scripts, pomijając każdy skrypt już oznaczony jako odwiedzony. Weź pierwszą niezapowiedzianą instancję tego skryptu.
Zakłada się, że identyczne skrypty prawdopodobnie będą wykonywane w kolejności, w jakiej są ładowane, od głowy do ciała, od góry do dołu, od synchronicznego do asynchronicznego.
Spowoduje to skanowanie całego skryptu w poszukiwaniu pierwszego pasującego skryptu, który nie jest oznaczony specjalnym atrybutem.
Następnie zaznacz ten węzeł, jeśli został znaleziony, atrybutem danych, aby kolejne skany go nie wybrały. Jest to podobne do algorytmów przechodzenia przez graf BFS i DFS, w których węzły można oznaczyć jako „odwiedzone”, aby zapobiec ponownej wizycie.
źródło
Mam to, które działa w FF3, IE6 i 7. Metody w skryptach ładowanych na żądanie nie są dostępne, dopóki ładowanie strony nie zostanie zakończone, ale nadal jest to bardzo przydatne.
źródło
Jeśli możesz założyć nazwę pliku skryptu, możesz go znaleźć. Do tej pory testowałem tylko następującą funkcję w przeglądarce Firefox.
źródło
Uważam, że poniższy kod jest najbardziej spójny, wydajny i najprostszy.
źródło