Bagaimana cara memasukkan tag <script> secara dinamis melalui jQuery setelah pemuatan halaman?

101

Saya mengalami masalah saat membuat ini berfungsi. Saya pertama kali mencoba mengatur tag skrip saya sebagai string dan kemudian menggunakan jquery replaceWith () untuk menambahkannya ke dokumen setelah pemuatan halaman:

var a = '<script type="text/javascript">some script here</script>';
$('#someelement').replaceWith(a);

Tapi saya mendapat kesalahan literal string pada var itu. Saya kemudian mencoba menyandikan string seperti:

var a = '&left;script type="text/javascript"&gt;some script here&lt;\/script&gt;';

tetapi mengirimkannya ke replaceWith()output hanya string itu ke browser.

Bisakah seseorang memberi tahu saya bagaimana Anda akan menambahkan <script>tag secara dinamis ke browser setelah pemuatan halaman, idealnya melalui jQuery?

Doug
sumber
Bisakah Anda menjelaskan apa yang ingin Anda capai dengan menambahkan <script>tag ke dokumen?
Pointy
Jawaban @ Rocket adalah yang terbaik, tetapi jika Anda pasti ingin menambahkan skrip inline dari sebuah string, maka Anda hanya akan meneruskannya ke eval()fungsi. Tetapi penggunaan dari eval()hampir selalu menunjukkan bahwa ada cara yang lebih baik untuk melakukan apa yang Anda coba lakukan.
Nick
kami mencoba untuk menunda pemuatan iklan pihak ketiga sampai akhir halaman. iklan tersebut dipanggil melalui 2 tag skrip, jadi saya ingin menjalankan fungsi setelah pemuatan halaman yang melemparkannya secara dinamis.
Doug
2
Tidak semua skrip pihak ketiga dirancang untuk dapat ditangguhkan. Jika skrip menggunakan document.writedan Anda menyebutnya setelah pemuatan halaman, itu akan merusak halaman.
bobince
1
Mengapa tidak mengimpor tag tersebut ke dalam <iframe>elemen? Anda dapat menunda pengaturan <iframe>URL sampai Anda siap.
Pointy

Jawaban:

103

Anda dapat meletakkan skrip ke dalam file terpisah, lalu gunakan $.getScriptuntuk memuat dan menjalankannya.

Contoh:

$.getScript("test.js", function(){
    alert("Running test.js");
});
Roket Hazmat
sumber
2
terima kasih, tapi apakah itu akan menempel di DOM? Saya menyadari saya meninggalkan info penting itu, bahwa saya memerlukan tag skrip untuk dimasukkan ke DOM, dievaluasi, di mana ia mengembalikan kode iklan pihak ketiga untuk ditampilkan di situs kami dalam <div> tertentu.
Doug
1
$.getScripthanya akan memuat file .js melalui AJAX dan menjalankannya. Skrip tidak perlu berada di DOM untuk dapat mengakses div di halaman Anda.
Rocket Hazmat
6
Tetapi dengan $.getScript()skrip harus berada di domain yang sama atau domain jarak jauh dan browser perlu mendukung CORS.
hippietrail
14
@hippietrail Itu sebenarnya tidak benar. Ini hanya menyisipkan tag skrip biasa, yang tidak memerlukan CORS atau domain yang sama. Saya menggunakan ini untuk mempersingkat kode untuk memuat Google Analytics misalnya, dan memuat dengan baik. Di balik layar kode jquery sebenarnya yang berjalan sangat mirip dengan potongan GA, sebenarnya.
Chris Moschini
39
Karena jawaban dari @hippietrail akan menarik paling banyak perhatian dengan 4 suara positifnya, harus dijelaskan dengan tegas bahwa dia salah. Seperti yang disorot oleh dokumen jQuery dalam $.ajaxcatatannya: "Permintaan skrip dan JSONP tidak tunduk pada batasan kebijakan asal yang sama." sumber . Dengan kata lain, $.getScriptdapat menarik file .js dari domain lain, bukan hanya milik Anda .
EleventyOne
64

Coba yang berikut ini:

<script type="text/javascript">
// Use any event to append the code
$(document).ready(function() 
{
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = "http://scriptlocation/das.js";
    // Use any selector
    $("head").append(s);
});

http://api.jquery.com/append

Bassem
sumber
4
1 untuk digunakan appenduntuk menambahkan skrip. Tambahkan menyebabkan bahkan skrip sebaris untuk segera dievaluasi (hanya yang saya butuhkan). Terima kasih
Gone Coding
1
Saya akhirnya mengalami banyak masalah di IE8 / 9 dengan pendekatan ini. Yaitu kesalahan Stack Overflow. Saya menggunakan metode $ .getScript () di bawah ini untuk memiliki pekerjaan ini di seluruh papan.
zmonteca
1
Ya @jcoffland ini ditulis pada Oktober 2010 :)
Bassem
Jika halaman yang berisi kode ini dimuat menggunakan AJAX, browser akan menampilkan peringatan "Synchronous XMLHttpRequest pada utas utama tidak digunakan lagi karena efeknya yang merugikan pada pengalaman pengguna akhir".
Rajshekar Reddy
@Reddy Komentar yang bagus. Ini telah diposting pada Oktober 2010, saya yakin sekarang metode ini tidak lagi merupakan pendekatan yang valid / direkomendasikan, pengguna harus melanjutkan kebijaksanaan mereka sendiri.
Bassem
34

Berikut cara yang benar untuk melakukannya dengan JQuery modern (2014):

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .appendTo('head');
})

atau jika Anda benar-benar ingin mengganti div, Anda dapat melakukan:

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .replaceAll('#someelement');
});
jcoffland.dll
sumber
3
Atau sebagai gantinya .text ('beberapa skrip di sini') Anda dapat menulis .attr ('src', 'path_to_your_js_file')
Serhii Maksymchuk
12

Cara yang lebih sederhana adalah:

$('head').append('<script type="text/javascript" src="your.js"></script>');

Anda juga dapat menggunakan formulir ini untuk memuat css.

Iman
sumber
6
Anda mungkin ingin menghindari meletakkan string </script>di sumber Anda karena dapat menyebabkan masalah penguraian: stackoverflow.com/questions/236073/…
iX3
2
melarikan diri dari yang terakhir /melakukan trik untuk saya:$('head').append('<script src="your.js"><\/script>');
jerik
5

Jawaban ini secara teknis serupa atau sama dengan apa yang dijawab oleh jcoffland. Saya baru saja menambahkan kueri untuk mendeteksi apakah skrip sudah ada atau tidak. Saya memerlukan ini karena saya bekerja di situs web intranet dengan beberapa modul, di mana beberapa di antaranya berbagi skrip atau membawa sendiri, tetapi skrip ini tidak perlu dimuat lagi. Saya menggunakan potongan ini sejak lebih dari satu tahun di lingkungan produksi, itu berfungsi seperti pesona. Mengomentari diri sendiri: Ya saya tahu, akan lebih tepat untuk menanyakan apakah ada fungsi ... :-)

if (!$('head > script[src="js/jquery.searchable.min.js"]').length) {
    $('head').append($('<script />').attr('src','js/jquery.searchable.min.js'));
}
ddlab.dll
sumber
btw. Saya melakukan hal yang sama dengan stylesheet: if (! $ ('Head> link [href = "widgets / css / widgets.css"]'). Length) {$ ('head'). Append ($ ('<link / > '). attr (' rel ',' stylesheet '). attr (' href ',' widgets / css / widgets.css '));}
ddlab
2

Ada satu solusi yang terdengar lebih seperti peretasan dan saya setuju ini bukan cara paling elegan untuk melakukannya, tetapi berhasil 100%:

Katakanlah tanggapan AJAX Anda seperti ini

<b>some html</b>
<script>alert("and some javscript")

Perhatikan bahwa saya sengaja melewatkan tag penutup. Kemudian pada skrip yang memuat di atas, lakukan hal berikut:

$.ajax({
    url: "path/to/return/the-above-js+html.php",
    success: function(newhtml){
        newhtml += "<";
        newhtml += "/script>";
        $("head").append(newhtml);
    }
});

Jangan tanya saya mengapa :-) Ini adalah salah satu hal yang saya alami sebagai hasil dari percobaan yang hampir acak dan gagal.

Saya tidak memiliki saran lengkap tentang cara kerjanya, tetapi yang cukup menarik, ini TIDAK akan berfungsi jika Anda menambahkan tag penutup dalam satu baris.

Di saat-saat seperti ini, saya merasa telah berhasil membagi dengan nol.

Abu
sumber
3
Ini tidak akan berfungsi jika tag skrip penutup masih utuh karena browser melihatnya sebagai tag penutup untuk skrip Anda, bukan string literal.
Pergi Coding
1
<\/script>akan berlaku meskipun
SP
Saya pikir poin @ TrueBlueAussie adalah menanggapi komentar Anda "Jangan tanya saya mengapa ... tapi cukup menarik, ini TIDAK akan berhasil jika Anda menambahkan tag penutup dalam satu baris." Dia menjelaskan alasannya sehingga pembaca yang menginginkan jawaban yang lebih baik daripada "Saya tidak tahu" bisa lebih mudah menemukannya. Lihat juga: javascript.crockford.com/script.html
iX3
1
@Sathvik benar, menurut tautan itu. Komentar Ash sepertinya merupakan balasan untuk komentar yang dihapus.
Arlen Beiler
2

Contoh:

var a = '<script type="text/javascript">some script here</script>';
$('#someelement').replaceWith(a);

Ini harus berhasil. Saya mencobanya; hasil yang sama. Tetapi ketika saya menggunakan ini:

var length = 1;
var html = "";
for (var i = 0; i < length; i++) {
    html += '<div id="codeSnippet"></div>';
    html += '<script type="text/javascript">';
    html += 'your script here';
    html += '</script>';
}
$('#someElement').replaceWith(a);

Ini berhasil untuk saya.

Edit: Saya lupa file #someelement (btw saya mungkin ingin menggunakan#someElement karena konvensi)

Yang terpenting disini adalah + = agar html ditambahkan dan tidak diganti.

Tinggalkan komentar jika tidak berhasil. Saya ingin membantu Anda!

santinobonora
sumber
2

Berikut ini cara yang lebih jelas - tidak perlu jQuery - yang menambahkan skrip sebagai anak terakhir dari <body>:

document.body.innerHTML +='<script src="mycdn.js"><\/script>'

Tetapi jika Anda ingin menambahkan dan memuat skrip, gunakan metode Rocket Hazmat .

Gagik Sargsyan
sumber
-4

Jika Anda mencoba menjalankan beberapa JavaScript yang dibuat secara dinamis, akan lebih baik jika Anda menggunakan eval. Namun, JavaScript adalah bahasa yang dinamis sehingga Anda seharusnya tidak membutuhkannya.

Jika skripnya statis, maka saran Rocket getScriptadalah cara yang tepat.

Magnar
sumber