Nie można dodać elementu

Jakiś pomysł, dlaczego poniższy fragment kodu nie dodaje elementu skryptu do DOM?

var code = "<script></script>";
$("#someElement").append(code);
Author: mekwall, 2009-03-04

18 answers

Widziałem problemy, w których niektóre przeglądarki nie respektują pewnych zmian, gdy robisz je bezpośrednio (przez co mam na myśli tworzenie HTML z tekstu, jak próbujesz ze znacznikiem script), ale gdy robisz je z wbudowanymi poleceniami, rzeczy idą lepiej. Spróbuj tego:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );

From: JSON for jQuery

 260
Author: acrosman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 09:33:26

Dobra wiadomość jest taka:

w 100% działa.

Wystarczy dodać coś wewnątrz znacznika script np. alert('voila!');. Właściwe pytanie, które chciałbyś zadać może, "dlaczego nie widziałem tego w domu?".

Karl Swedberg przedstawił miłe Wyjaśnienie komentarza odwiedzającego w jQuery API site . I Nie chcesz powtórzyć wszystkie jego słowa, można przeczytać bezpośrednio tam tutaj (trudno mi było nawigować poprzez komentarze tam) .

wszystkie metody wstawiania jQuery wykorzystują funkcja domManip wewnętrznie do czyszczenie / przetwarzanie elementów przed i po ich włożeniu do DOM. Jedna z rzeczy domManip funkcja does is pull out any script elementy, które mają być wstawiane i uruchamiane ich poprzez " procedurę evalScript" zamiast wstrzyknąć im resztę fragment DOM. Wstawia Skrypty oddzielnie, ocenia je, a następnie usuwa z domu.

uważam, że jednym z powodów jQuery czy jest to unikanie " zgody Denied" błędy, które mogą wystąpić w Internet Explorer podczas wstawiania skrypty w pewnych okolicznościach. Unika również wielokrotnego wstawianie / ocenianie tego samego skryptu (co potencjalnie może spowodować problemy), jeśli znajduje się w obrębie element, który wstawiasz i następnie poruszając się po domu.

Następną rzeczą jest to, że podsumuj złą wiadomość, używając funkcji .append() do dodania skryptu.


A zła wiadomość jest taka..

nie możesz debugować kodu.

Nie żartuję, nawet jeśli dodasz słowo kluczowe debugger; między wierszem, który chcesz ustawić jako punkt przerwania, otrzymasz tylko stos wywołań obiektu bez zobaczenia punktu przerwania w kodzie źródłowym, (nie wspominając o tym, że to 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, to będzie to drobna wada. Ale jeśli tego nie zrobisz, w końcu dodasz debugger; słowo kluczowe wszędzie, 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

If you don ' t want to lose możliwość debugowania, niż można użyć javascript native HTML DOM manipulacji. Rozważ ten przykład:

var script   = document.createElement("script");
script.type  = "text/javascript";
script.src   = "path/to/your/javascript.js";    // use this for linked script
script.text  = "alert('voila!');"               // use this for inline script
document.body.appendChild(script);
Jest, jak za dawnych czasów. I nie zapomnij wyczyścić rzeczy w DOM lub w pamięci dla wszystkich obiektów, do których się odwołuje i które nie są już potrzebne, aby zapobiec wyciekom pamięci. Możesz rozważyć ten kod, aby wyczyścić rzeczy:
document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.

Wadą tego obejścia jest to, że możesz przypadkowo dodać duplikat skryptu, a to jest złe. Od tutaj możesz nieco naśladować funkcję .append(), dodając weryfikację obiektu przed dodaniem i usuwając skrypt z DOM zaraz po dodaniu. Rozważ ten przykład:

function AddScript(url, object){
    if (object != null){
        // add script
        var script   = document.createElement("script");
        script.type  = "text/javascript";
        script.src   = "path/to/your/javascript.js";
        document.body.appendChild(script);

        // remove from the dom
        document.body.removeChild(document.body.lastChild);
        return true;
    } else {
        return false;
    };
};

function DeleteObject(UnusedReferencedObjects) {
    delete UnusedReferencedObjects;
}

W ten sposób możesz dodać skrypt z możliwością debugowania, chroniąc przed dwulicowością skryptu. To tylko prototyp, możesz go rozbudować o cokolwiek chcesz. Korzystam z tego podejścia i jestem z tego całkiem zadowolony. Na pewno nigdy nie użyję jQuery .append() do dodania skryptu.

 356
Author: Hendra Uzia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 18:15:52

Możliwe jest dynamiczne ładowanie pliku JavaScript za pomocą funkcji jQuerygetScript

$.getScript('http://www.whatever.com/shareprice/shareprice.js', function() {
  Display.sharePrice();
});

Teraz zostanie wywołany zewnętrzny skrypt, a jeśli nie będzie można go załadować, to z wdziękiem ulegnie degradacji.

 23
Author: Cueball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 17:58:43

Jak to "nie działa"?

JQuery wykryje, że próbujesz utworzyć element skryptu i automatycznie uruchomi zawartość elementu w kontekście globalnym. Chcesz mi powiedzieć, że to nie działa na Ciebie? -

$('#someElement').append('<script>alert("WORKING");</script>');

Edit: jeśli nie widzisz elementu SCRIPT w DOM (na przykład w Firebug) po uruchomieniu polecenia, to dlatego, że jQuery, jak powiedziałem, uruchomi kod, a następnie usunie element SCRIPT-wierzę, że skrypt elementy są zawsze dołączane do ciała... ale w każdym razie - umieszczenie nie ma absolutnie żadnego wpływu na wykonanie kodu w tej sytuacji.

 20
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 15:22:10

To działa:

$('body').append($("<script>alert('Hi!');<\/script>")[0]);

Wygląda na to, że jQuery robi coś sprytnego ze skryptami, więc musisz dołączyć element html, a nie obiekt jQuery.

 17
Author: Darwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 14:26:39

Spróbuj to może być pomocne:

var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src","scriptAnalytics.js");
document.getElementsByTagName("head")[0].appendChild(fileref);
 14
Author: Jainul Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 10:40:57

Chcę zrobić to samo, ale dodać znacznik skryptu w innej ramce!

var url = 'library.js'; 
var script = window.parent.frames[1].document.createElement('script' ); 
script.type = 'text/javascript'; 
script.src = url;
$('head',window.parent.frames[1].document).append(script);
 3
Author: Julio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 21:11:03
<script>
    ...
    ...jQuery("<script></script>")...
    ...
</script>

</script> wewnątrz ciągu literal kończy cały skrypt, aby uniknąć tego, że "</scr" + "ipt>" może być używany zamiast.

 3
Author: Roman Odaisky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-26 14:29:54

Dodanie źródła w pliku skryptu pomogło jak wspomniano na tej stronie: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

  1. w pliku skryptu dodaj polecenie sourceURL w stylu " / / @ sourceURL=foo.js "
  2. załaduj skrypt używając jQuery $.getScript () i skrypt będą dostępne w zakładce "źródła" w Chrome Dev tools
 2
Author: Naga Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 09:24:59

Twój skrypt jest wykonywany, po prostu nie możesz użyć document.write z niego. Użyj alertu, aby go przetestować i unikaj używania document.write. Polecenia Twojego pliku js z document.write nie zostaną wykonane, a reszta funkcji zostanie wykonana.

 1
Author: Kunal Kinalekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-21 16:03:37

To jest to, co uważam za najlepsze rozwiązanie. Google Analytics jest wstrzykiwany w ten sposób.

var (function(){
    var p="https:" == document.location.protocol ? "https://" : "http://";
        d=document,
        g=d.createElement('script'),
        s=d.getElementsByTagName('script')[0];
        g.type='text/javascript';
        g.src=p+'url-to-your-script.js';
        s.parentNode.insertBefore(g,s); })();
 1
Author: dzona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 21:47:16

Nie potrzebujesz jQuery, aby utworzyć Element Script DOM . Można to zrobić z vanilla ES6 Tak:

const script = "console.log('Did it work?')"
new Promise((resolve, reject) => {
  (function(i,s,o,g,r,a,m){
      a=s.createElement(o),m=s.getElementsByTagName(o)[0];
      a.innerText=g;
      a.onload=r;m.parentNode.insertBefore(a,m)}
  )(window,document,'script',script, resolve())
}).then(() => console.log('Sure did!'))

Nie musi być zawinięty w Promise, ale dzięki temu można rozwiązać obietnicę, gdy skrypt się ładuje, pomagając zapobiegać Warunkom wyścigu dla skryptów długo działających.

 1
Author: Josh Habdas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-03 22:25:39

Dołączenie skryptu do body:

$(document).ready(function() {
    $("<script>", {  src : "bootstrap.min.js",  type : "text/javascript" }).appendTo("body");
});
 0
Author: Cristian Olaru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 11:05:52

Innym sposobem na dodanie kodu jest użycie metody document.createElement, a następnie użycie .innerHTML zamiast .src.

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.innerHTML = 'alert("Hey there... you just appended this script to the body");';
$("body").append( script );
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-25 09:11:52

Próbowałem tego [5]} i działa dobrze. Wystarczy zastąpić < symbolem \x3C.

// With Variable
var code = "\x3Cscript>SomeCode\x3C/script>";
$("#someElement").append(code);

Lub

//Without Variable
$("#someElement").append("\x3Cscript>SomeCode\x3C/script>");

Możesz przetestować kod tutaj .

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 23:42:53

Można spróbować w ten sposób

var code = "<script></" + "script>";
$("#someElement").append(code);

Jedynym powodem, dla którego nie możesz zrobić "<script></script>" jest to, że łańcuch znaków nie jest dozwolony w javascript, ponieważ warstwa DOM nie może analizować co to jest js, a co HTML.

 0
Author: VipinKundal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-30 01:20:14

Napisałem npm pakiet, który pozwala na pobranie ciągu HTML, wraz ze znacznikami skryptu i dołączenie go do kontenera podczas wykonywania skryptów

Przykład:

import appendHtml from 'appendhtml';

const html = '<p>Hello</p><script src="some_js_file.js"></script>'; 
const container = document.getElementById('some-div');

await appendHtml(html, container);

// appendHtml returns a Promise, some_js_file.js is now loaded and executed (note the await)

Znajdziesz go tutaj: https://www.npmjs.com/package/appendhtml

 0
Author: Lukas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-06 20:17:24

Po prostu utwórz element, analizując go za pomocą jQuery.

<div id="someElement"></div>
<script>
    var code = "<script>alert(123);<\/script>";
    $("#someElement").append($(code));
</script>

Przykład roboczy: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz

 -1
Author: sanbor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 15:15:32