Sayfa yüklendikten sonra jQuery aracılığıyla dinamik olarak bir <script> etiketi nasıl eklenir?


102

Bunu çalıştırmakta sorun yaşıyorum. Önce komut dosyası etiketlerimi dizeler olarak ayarlamayı ve ardından sayfa yüklendikten sonra bunları belgeye eklemek için jquery replaceWith () kullanmayı denedim:

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

Ama bu değişkende dize değişmez hataları aldım. Daha sonra dizeyi şu şekilde kodlamayı denedim:

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

ancak bunu replaceWith()tarayıcıya yalnızca bu dizeyi çıktı olarak göndermek .

Birisi <script>, ideal olarak jQuery aracılığıyla, sayfa yüklendikten sonra tarayıcıya dinamik olarak nasıl etiket ekleyeceğinizi bana bildirebilir mi?


<script>Belgeye bir etiket ekleyerek neyi başarmaya çalıştığınızı açıklayabilir misiniz ?
Pointy

@ Rocket'ın cevabı en iyisidir, ancak bir dizeden kesinlikle satır içi komut dosyası eklemek istiyorsanız, o zaman bunu sadece eval()işleve aktarırsınız. Ancak kullanımı eval()neredeyse her zaman yapmaya çalıştığınız şeyi yapmanın daha iyi bir yolu olduğunu gösterir.
Nick

3. taraf reklamlarının yüklenmesini sayfanın sonuna kadar ertelemeye çalışıyoruz. bu reklamlar 2 komut dosyası etiketi aracılığıyla çağrıldığından, sayfa yüklendikten sonra onları dinamik olarak içeri atan bir işlev çalıştırmak istedim.
Doug

2
Tüm üçüncü taraf komut dosyaları ertelenebilir şekilde tasarlanmamıştır. Komut dosyası kullanıyorsa document.writeve sayfa yüklendikten sonra çağırırsanız, sayfayı yok eder.
bobince

1
Neden bu etiketleri <iframe>öğelere aktarmıyorsunuz? <iframe>Hazır olana kadar URL'yi ayarlamayı erteleyebilirsiniz .
Pointy

Yanıtlar:


103

Komut dosyasını ayrı bir dosyaya koyabilir, ardından $.getScriptonu yüklemek ve çalıştırmak için kullanabilirsiniz.

Misal:

$.getScript("test.js", function(){
    alert("Running test.js");
});

2
teşekkürler, ama bu onu DOM'a yapıştıracak mı? DOM'a eklenecek komut dosyası etiketinin değerlendirilmesine ihtiyaç duyduğum ve bu noktada sitemizde belirli bir <div> içinde görüntülemek için 3. taraf reklam kodunu döndürdüğüne dair önemli bilgileri dışarıda bıraktığımı fark ettim.
Doug

1
$.getScriptAJAX aracılığıyla bir .js dosyası yükleyecek ve çalıştıracaktır. Sayfanızdaki bir div'e erişebilmek için komut dosyasının DOM'da olması gerekmez.
Rocket Hazmat

6
Ancak $.getScript()komut dosyasının aynı etki alanında olması gerekir veya hem uzak etki alanı hem de tarayıcının desteklemesi gerekir CORS.
hippietrail

14
@hippietrail Bu aslında doğru değil. Yalnızca CORS veya aynı alan adını gerektirmeyen düz bir komut dosyası etiketi ekler. Örneğin Google Analytics'i yükleme kodunu kısaltmak için bunu kullanıyorum ve gayet iyi yükleniyor. Aslında perde arkasında çalışan gerçek jquery kodu, GA pasajına oldukça benzer.
Chris Moschini

39
@Hippietrail'den gelen cevap, 4 olumlu oyu ile en çok dikkat çekeceği için, yanlış olduğu vurgulanmalıdır. JQuery belgelerinin $.ajaxnotlarında vurguladığı gibi : "Komut dosyası ve JSONP istekleri aynı menşe politikası kısıtlamalarına tabi değildir." kaynak . Diğer bir deyişle, $.getScript.js dosyalarını yalnızca kendi etki alanlarınızdan değil, başka alanlardan da çekebilirsiniz .
EleventyOne

64

Takip etmeyi dene:

<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


4
appendKomut dosyası eklemek için kullanım için +1 . Hemen değerlendirmek için satır içi komut dosyası bile nedenler ekleyin (tam olarak ihtiyacım olanı). Teşekkürler
Kodlama Gitti

1
Bu yaklaşımla IE8 / 9'da birçok sorun yaşıyorum. Yani Stack Overflow hataları. Bu işi tüm tahtada yapmak için aşağıdaki $ .getScript () yöntemine başvurdum.
zmonteca

1
Evet @jcoffland bu Ekim 2010'da yazılmıştır :)
Bassem

Bu kodu içeren sayfa AJAX kullanılarak yüklenirse, tarayıcı "Ana iş parçacığı üzerinde Eşzamanlı XMLHttpRequest, son kullanıcının deneyimine zararlı etkileri nedeniyle kullanımdan kaldırıldı" uyarısı atar.
Rajshekar Reddy

@Reddy Harika yorum. Bu, Ekim 2010'da yayınlandı, şimdiye kadar bu yöntemin artık geçerli / önerilen bir yaklaşım olmadığından eminim, kullanıcıların kendi takdirlerine göre ilerlemesi gerekir.
Bassem

34

Modern (2014) JQuery ile bunu yapmanın doğru yolu:

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

veya gerçekten bir div'i değiştirmek istiyorsanız şunları yapabilirsiniz:

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

3
Veya bunun yerine .text ('burada bir komut dosyası') yazabilirsiniz .attr ('src', 'path_to_your_js_file')
Serhii Maksymchuk

12

Daha basit bir yol:

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

Bu formu css yüklemek için de kullanabilirsiniz.


6
</script>Ayrıştırma sorunlarına neden olabileceği için dizeyi kaynağınıza koymaktan kaçınmak isteyebilirsiniz : stackoverflow.com/questions/236073/…
jacobq

2
sondan kaçmak /benim için hile yaptı:$('head').append('<script src="your.js"><\/script>');
jerik

5

Bu cevap teknik olarak jcoffland'ın yanıtladığı şeye benzer veya ona eşittir. Bir komut dosyasının zaten mevcut olup olmadığını tespit etmek için bir sorgu ekledim. Buna ihtiyacım var çünkü bir intranet web sitesinde birkaç modülle çalışıyorum, bunlardan bazıları komut dosyalarını paylaşıyor veya kendilerininkini getiriyor, ancak bu komut dosyalarının her seferinde yeniden yüklenmesi gerekmiyor. Bu pasajı üretim ortamında bir yıldan fazla bir süredir kullanıyorum, bir charme gibi çalışıyor. Kendi kendime yorum yapıyorum: Evet biliyorum, bir fonksiyon olup olmadığını sormak daha doğru olur ... :-)

if (!$('head > script[src="js/jquery.searchable.min.js"]').length) {
    $('head').append($('<script />').attr('src','js/jquery.searchable.min.js'));
}

btw. Aynı şeyi stil sayfalarında da yapıyorum: if (! $ ('Head> link [href = "widgets / css / widgets.css"]'). Length) {$ ['head']. Append ($ ('<link / > '). attr (' rel ',' stylesheet '). attr (' href ',' widgets / css / widgets.css '));}
ddlab

2

Daha çok bir hack'e benzeyen bir geçici çözüm var ve bunu yapmanın en zarif yolu olmadığına, ancak% 100 işe yaradığına katılıyorum:

AJAX yanıtınızın şunun gibi olduğunu söyleyin:

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

Kapanış etiketini bilerek atladığımı unutmayın. Ardından yukarıdakileri yükleyen komut dosyasında aşağıdakileri yapın:

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

Sadece bana nedenini sorma :-) Bu, neredeyse rastgele denemeler ve başarısızlıkların umutsuzluğunun bir sonucu olarak geldiğim şeylerden biri.

Nasıl çalıştığına dair tam bir önerim yok, ancak ilginçtir ki, kapanış etiketini bir satıra eklerseniz işe yaramayacak.

Böyle zamanlarda, başarılı bir şekilde sıfıra bölündüğümü hissediyorum.


3
Kapanış betik etiketi tek parça halinde ise, tarayıcı bunu bir dize değişmezi yerine betiğiniz için kapanış etiketi olarak gördüğü için çalışmayacaktır.
Kodlama Gone

1
<\/script>yine de geçerli olacaktır
SP

Sanırım @ TrueBlueAussie, "Bana nedenini sorma ... ama ilginçtir ki, kapanış etiketini bir satıra eklerseniz işe yaramayacak." "Bilmiyorum" dan daha iyi bir cevap isteyen okuyucuların daha kolay bulabilmesi için nedenini açıkladı. Ayrıca bkz .: javascript.crockford.com/script.html
jacobq

1
@Sathvik bu bağlantıya göre doğru. Ash'in yorumu, kaldırılan bir kişiye yanıt gibi görünüyor.
Arlen Beiler

2

Misal:

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

İşe yaramalı. Denedim; aynı sonuç. Ama bunu kullandığımda:

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);

Bu benim için çalıştı.

Düzenleme: unuttum #someelement( #someElementsözleşmeler nedeniyle kullanmak isteyebilirim )

Buradaki en önemli şey + = yani html eklenir ve değiştirilmez.

İşe yaramadıysa bir yorum bırakın. Sana yardım etmek isterim!


2

İşte çok daha net bir yol - jQuery'ye gerek yok - bu, bir komut dosyasını aşağıdakilerin son çocuğu olarak ekliyor <body>:

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

Ancak komut dosyaları eklemek ve yüklemek istiyorsanız Rocket Hazmat'ın yöntemini kullanın .


-4

Dinamik olarak oluşturulmuş bir JavaScript çalıştırmaya çalışıyorsanız, kullanmanız biraz daha iyi olacaktır eval. Ancak JavaScript o kadar dinamik bir dil ki buna gerçekten ihtiyacınız olmamalı.

Komut dosyası getScriptstatikse, Rocket'ın önerisi doğru yoldur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.