Masz pojęcie, dlaczego poniższy fragment kodu nie dodaje elementu skryptu do DOM?
var code = "<script></script>";
$("#someElement").append(code);
javascript
jquery
Dan Burzo
źródło
źródło
Odpowiedzi:
Widziałem problemy, w których niektóre przeglądarki nie szanują niektórych zmian, gdy robisz je bezpośrednio (przez co mam na myśli tworzenie kodu HTML z tekstu, tak jak próbujesz ze znacznikiem script), ale kiedy robisz to za pomocą wbudowanych poleceń wszystko idzie lepiej. Spróbuj tego:
Od: JSON dla jQuery
źródło
script.type
jest niepotrzebne.$("#someElement")[0].appendChild( script );
Dobrą wiadomością jest:
To działa w 100%.
Po prostu dodaj coś do znacznika skryptu, np
alert('voila!');
. Właściwe pytanie, które możesz zadać, być może: „Dlaczego nie widziałem go w DOM?” .Karl Swedberg wyjaśnił komentarz gościa na stronie API jQuery . I
niechcą powtórzyć wszystkie jego słowa można odczytać bezpośredniotamtutaj (I trudno było poruszać się po komentarzach tam) .Następną rzeczą jest, podsumuję złe wieści, używając
.append()
funkcji do dodania skryptu.A złą wiadomością jest ...
Nie możesz debugować swojego kodu.
Nie żartuję, nawet jeśli dodasz
debugger;
słowo kluczowe między wierszem, który chcesz ustawić jako punkt przerwania, skończysz na otrzymywaniu tylko stosu wywołań obiektu, nie widząc punktu przerwania w kodzie źródłowym (nie wspominając o tym słowo kluczowe działa tylko w przeglądarce webkit, wszystkie inne główne przeglądarki wydają się pomijać to słowo kluczowe) .Jeśli w pełni rozumiesz, co robi Twój kod, będzie to niewielka wada. Ale jeśli tego nie zrobisz, w końcu dodasz
debugger;
słowo kluczowe, aby dowiedzieć się, co jest nie tak z twoim (lub moim) kodem. W każdym razie istnieje alternatywa, nie zapominaj, że javascript może natywnie manipulować HTML DOM.Obejście
Użyj javascript (nie jQuery) do manipulowania HTML DOM
Jeśli nie chcesz utracić możliwości debugowania, możesz użyć natywnej manipulacji DOM HTML w javascript. Rozważ ten przykład:
Oto jest, tak jak za dawnych czasów, prawda? I nie zapomnij wyczyścić rzeczy w DOM lub w pamięci dla wszystkich obiektów, do których istnieje odwołanie i które nie są już potrzebne, aby zapobiec wyciekom pamięci. Możesz wziąć pod uwagę ten kod, aby wyczyścić rzeczy:
Wadą tego obejścia jest to, że możesz przypadkowo dodać duplikat skryptu i to źle. Stąd możesz nieco naśladować
.append()
funkcję, dodając weryfikację obiektu przed dodaniem i usuwając skrypt z DOM zaraz po jego dodaniu. Rozważ ten przykład:W ten sposób możesz dodać skrypt z funkcją debugowania, jednocześnie bezpieczny przed duplikatem skryptu. To tylko prototyp, który możesz rozbudować o to, co chcesz. Korzystam z tego podejścia i jestem z tego całkiem zadowolony. Na pewno nigdy nie użyję jQuery,
.append()
aby dodać skrypt.źródło
$.getScript
jest wbudowany w jQuery.Możliwe jest dynamiczne ładowanie pliku JavaScript za pomocą funkcji jQuery
getScript
Teraz zewnętrzny skrypt zostanie wywołany, a jeśli nie będzie można go załadować, z wdziękiem się pogorszy.
źródło
eval()
.Co masz na myśli mówiąc „nie działa”?
jQuery wykrywa, że próbujesz utworzyć element SCRIPT i automatycznie uruchomi zawartość tego elementu w kontekście globalnym. Mówisz mi, że to nie działa dla ciebie? -
Edycja: Jeśli nie widzisz elementu SCRIPT w DOM (na przykład w Firebug) po uruchomieniu polecenia, ponieważ jQuery, jak powiedziałem, uruchomi kod, a następnie usunie element SCRIPT - Wierzę, że elementy SCRIPT są zawsze dołączane do treści ... ale w każdym razie - umieszczenie nie ma absolutnie żadnego wpływu na wykonanie kodu w tej sytuacji.
źródło
To działa:
Wygląda na to, że jQuery robi coś sprytnego ze skryptami, więc musisz dodać element HTML zamiast obiektu jQuery.
źródło
Spróbuj to może być pomocne:
źródło
Chcę zrobić to samo, ale dołączyć znacznik skryptu w innej ramce!
źródło
</script>
Ciągu Ciąg dosłownych kończy cały scenariusz, aby uniknąć sytuacji,"</scr" + "ipt>"
może być stosowany zamiast.źródło
"\x3cscript\x3e\x3c/script\x3e"
. W XHTML wystarczy wstawić skomentowany blok CDATA.</
nie jest to dozwolone. Zobacz stackoverflow.com/questions/236073/…Dodanie sourceURL w pliku skryptu pomogło, jak wspomniano na tej stronie: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-w--sourceurl/
źródło
Twój skrypt jest wykonywany, po prostu nie możesz
document.write
z niego korzystać. Użyj alertu, aby go przetestować i unikaj używaniadocument.write
. Instrukcje pliku js zdocument.write
nie zostaną wykonane, a reszta funkcji zostanie wykonana.źródło
To jest, moim zdaniem, najlepsze rozwiązanie. Google Analytics jest wstrzykiwany w ten sposób.
źródło
Nie potrzebujesz jQuery, aby utworzyć element DOM skryptu . Można to zrobić za pomocą wanilii ES6 tak:
Nie musi być zawinięty w
Promise
, ale pozwala to spełnić obietnicę, gdy skrypt zostanie załadowany, co pomoże zapobiec warunkom wyścigowym dla długo działających skryptów.źródło
Dołącz skrypt do treści:
źródło
Innym sposobem na zrobienie tego, jeśli chcesz dołączyć kod, jest użycie
document.createElement
metody, a następnie użycie.innerHTML
zamiast.src
.źródło
Próbowałem to jeden i działa dobrze. Po prostu zamień na to
<
symbol\x3C
.lub
Możesz przetestować kod tutaj .
źródło
Możesz spróbować w ten sposób
Jedynym powodem, dla którego nie możesz tego zrobić,
"<script></script>"
jest to, że ciąg znaków nie jest dozwolony w javascript, ponieważ warstwa DOM nie może przeanalizować, co to jest js, a co HTML.źródło
Napisałem
npm
pakiet, który pozwala pobrać ciąg HTML, w tym znaczniki skryptu i dołączyć go do kontenera podczas wykonywania skryptówPrzykład:
Znajdź tutaj: https://www.npmjs.com/package/appendhtml
źródło
Wystarczy utworzyć element, analizując go za pomocą jQuery.
Przykład roboczy: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz
źródło