Saya punya skrip yang memasukkan beberapa konten ke dalam elemen menggunakan innerHTML
.
Konten tersebut misalnya bisa berupa:
<script type="text/javascript">alert('test');</script>
<strong>test</strong>
Masalahnya adalah kode di dalam <script>
tag tidak dieksekusi. Saya googling sedikit tetapi tidak ada solusi yang jelas. Jika saya memasukkan konten menggunakan jQuery $(element).append(content);
, bagian skrip sudah didapat eval
sebelum dimasukkan ke DOM.
Adakah yang punya potongan kode yang mengeksekusi semua <script>
elemen? Kode jQuery agak rumit jadi saya tidak bisa benar-benar mengetahui bagaimana hal itu dilakukan.
Edit :
Dengan mengintip kode jQuery, saya telah berhasil mengetahui bagaimana jQuery melakukannya, yang menghasilkan kode berikut:
Demo:
<div id="element"></div>
<script type="text/javascript">
function insertAndExecute(id, text)
{
domelement = document.getElementById(id);
domelement.innerHTML = text;
var scripts = [];
ret = domelement.childNodes;
for ( var i = 0; ret[i]; i++ ) {
if ( scripts && nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
}
}
for(script in scripts)
{
evalScript(scripts[script]);
}
}
function nodeName( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
}
function evalScript( elem ) {
data = ( elem.text || elem.textContent || elem.innerHTML || "" );
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
script.appendChild( document.createTextNode( data ) );
head.insertBefore( script, head.firstChild );
head.removeChild( script );
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
insertAndExecute("element", "<scri"+"pt type='text/javascript'>document.write('This text should appear as well.')</scr"+"ipt><strong>this text should also be inserted.</strong>");
</script>
javascript
dom
eval
innerhtml
phidah
sumber
sumber
function testFunction(){ alert('test'); }
ke kode yang dimasukkan ke innerHTML, lalu mencoba memanggilnya, dikatakan bahwa fungsi tersebut tidak ditentukan.Jawaban:
Skrip OP tidak berfungsi di IE 7. Dengan bantuan dari SO, inilah skrip yang berfungsi:
sumber
$(parent).html(code)
- lihat jawaban saya di bawah.if (nodeName(child, "script" ) && (!child.type || child.type.toLowerCase() === "text/javascript")) { scripts.push(child); } else { exec_body_scripts(child); }
elem.src
dan secara bersyarat mengatursrc
properti dari elemen skrip yang dibuat alih-alih mengatur konten teksnya.eval
daripada membuat<script>
elemen dan memasukkannya ke<head>
? Keduanya mengeksekusi kode JS tanpa mengekspos penutupan saat ini.@phidah ... Berikut adalah solusi yang sangat menarik untuk masalah Anda: http://24ways.org/2005/have-your-dom-and-script-it-too
Jadi akan terlihat seperti ini:
<img src="empty.gif" onload="alert('test');this.parentNode.removeChild(this);" />
sumber
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
jika Anda ingin mencegah permintaan http tidak berguna.style="display:none;
) untuk menyembunyikan ikon gambar rusak<style>
lebih baik daripada<img>
, karena tidak membuat permintaan jaringanBerikut ini skrip yang lebih pendek dan lebih efisien yang juga berfungsi untuk skrip dengan
src
properti:Catatan: meskipun
eval
dapat menyebabkan kerentanan keamanan jika tidak digunakan dengan benar, ini jauh lebih cepat daripada membuat tag skrip dengan cepat.sumber
eval
dirancang untuk melukai pengguna. Eksekusi skrip dinamis apa pun adalah risiko dan inilah mengapa CSP memanggilnya'unsafe-eval'
karena memang demikian. Anda juga merusak keamanan situs Anda jika Anda menggunakannya di perpustakaan karena mereka tidak dapat mematikannya.src
properti akan diunduh secara asinkron dan dijalankan saat tiba. Pemesanan tidak dipertahankan. Skrip sebaris juga akan dieksekusi rusak, serentak sebelum asinkron.Anda tidak boleh menggunakan properti innerHTML melainkan metode appendChild dari Node: sebuah simpul di pohon dokumen [HTML DOM]. Dengan cara ini Anda nantinya dapat memanggil kode yang Anda masukkan.
Pastikan Anda memahami bahwa
node.innerHTML
itu tidak sama dengannode.appendChild
. Anda mungkin ingin meluangkan waktu pada Referensi Klien Javascript untuk detail lebih lanjut dan DOM. Semoga berikut membantu ...Pekerjaan injeksi sampel:
salam,
sumber
try this, look how clever I am
jawaban lainnya . Layak mendapatkan UV, itu milikku.var _in = document.getElementById(inject);
, Kupikir.Versi ES6 yang disederhanakan dari jawaban @ joshcomley dengan sebuah contoh.
Tanpa JQuery, Tanpa library, Tanpa eval, Tanpa perubahan DOM, Hanya Javascript murni.
http://plnkr.co/edit/MMegiu?p=preview
Pemakaian
sumber
setInnerHtml
bukansetInnerHTML
setInnerHTML
tetapi dipanggilsetInnerHtml
dari dalamrunB
fungsi. Oleh karena itu contoh tidak berhasilCoba cuplikan ini:
sumber
Ini berfungsi di Chrome dalam proyek saya
sumber
Solusi tanpa menggunakan "eval":
Ini pada dasarnya menggandakan tag skrip dan kemudian mengganti tag skrip yang diblokir dengan yang baru dibuat, sehingga memungkinkan eksekusi.
sumber
scriptNode.innerHTML = code
tidak bekerja untuk IE. Satu-satunya hal yang harus dilakukan adalah mengganti denganscriptNode.text = code
dan itu berfungsi dengan baiksumber
Lebih mudah menggunakan jquery
$(parent).html(code)
daripadaparent.innerHTML = code
:Ini juga berfungsi dengan skrip yang menggunakan
document.write
dan skrip dimuat melaluisrc
atribut. Sayangnya bahkan ini tidak berfungsi dengan skrip Google AdSense.sumber
Kerjakan saja:
sumber
Anda dapat melihat posting ini . Kode tersebut mungkin terlihat seperti ini:
sumber
Berkat skrip Larry, yang bekerja dengan baik di IE10, inilah yang saya gunakan:
sumber
Memperluas dari Larry's. Saya membuatnya secara rekursif mencari seluruh blok dan node anak.
Skrip sekarang juga akan memanggil skrip eksternal yang ditentukan dengan parameter src. Skrip ditambahkan ke head, bukan disisipkan dan ditempatkan sesuai urutan ditemukannya. Jadi skrip pesanan secara khusus dipertahankan. Dan setiap skrip dijalankan secara sinkron mirip dengan cara browser menangani pemuatan DOM awal. Jadi jika Anda memiliki blok skrip yang memanggil jQuery dari CDN dan kemudian simpul skrip berikutnya menggunakan jQuery ... Tidak masalah! Oh dan saya menandai skrip yang ditambahkan dengan id serial berdasarkan apa yang Anda tetapkan di parameter tag sehingga Anda dapat menemukan apa yang ditambahkan oleh skrip ini.
sumber
Coba ini, ini berfungsi untuk saya di Chrome, Safari & Firefox:
Satu hal yang perlu diperhatikan, adalah bahwa skrip bertingkat div berikut TIDAK akan berjalan:
Untuk menjalankan skrip itu harus dibuat sebagai node kemudian ditambahkan sebagai anak. Anda bahkan dapat menambahkan skrip di dalam div yang dimasukkan sebelumnya & itu akan berjalan (Saya pernah mengalami ini sebelumnya ketika mencoba untuk membuat kode server iklan berfungsi):
sumber
Menghabiskan jawaban Lambder
Anda dapat menggunakan gambar base64 untuk membuat dan memuat skrip Anda
Atau jika Anda memiliki,
Iframe
Anda dapat menggunakannya sebagai gantinyasumber
Saya membutuhkan sesuatu yang serupa, tetapi membutuhkan skrip untuk tetap atau dibuat ulang di tempat yang sama dengan skrip asli, karena skrip saya menargetkan lokasi tag skrip di DOM untuk membuat / menargetkan elemen. Saya juga membuat skrip rekursif untuk memastikannya juga berfungsi jika lebih dari satu level ke bawah.
CATATAN: Saya gunakan di
const
sini, jika Anda memiliki browser yang lebih lama, gunakan sajavar
.sumber
Membuat fungsi pembantu baru ini di TypeScript, mungkin seseorang akan menghargainya. Jika Anda menghapus deklarasi tipe dari parameter skrip, itu hanya akan menjadi JS biasa.
sumber
Coba fungsi eval ().
Ini adalah contoh nyata dari proyek yang saya kembangkan. Terima kasih untuk posting ini
sumber
Inilah solusi saya dalam proyek terbaru.
sumber