2012-01-12 17 views
8

Sayfanın başı veya gövdesi için <style> veya <link> etiketlerini ekleyerek dinamik komut dosyası/css yüklemesinin farkındayım, ancak indirildikten sonra tarayıcı tarafından yürütülür. İndirmenin başka yollarını düşünüyordum ama javascript/css kodunu çalıştırmıyordum. İlk ne fikrimi gelen XMLHttpRequest oldu: JavaScript veya CSS'yi çalıştırmadan yükleme yöntemleri nelerdir?

//simple execution received script 
var executeScript = function(code){ 
    eval(code); 
}; 
//create XMLHttpRequest in cross-browser manner 
var xhr = createXMLHTTPObject(); 
//check whether file is loaded 
var checkStatus = function(){ 
    if(xhr.readyState == 4){ 
     if(xhr.status >= 200 && xhr.status < 300 || xhr == 304){ 
      executeScript(xhr.responseText); 
     } 
     else {//error 
     } 
    } 
}; 
//do request 
xhr.open('get','http://podlipensky.com/examples/dynamicscript/hey.js', true); 
xhr.onreadystatechange = checkStatus; 
xhr.send(null); 

Ancak bu durumda biz çünkü aynı Kökeni Politikası aynı etki (biz CORS ile buna bir çözüm bulmak deneyebilirsiniz rağmen)

gelen komut ile sınırlısınız

Başka bir yaklaşım, sayfa için dinamik olarak iframe eklemek ve iframe için script etiketi eklemek, bu yüzden, komut dosyası indirildikten sonra yürütülecek, ancak başka bir sayfa bağlamında olur - iframe.

Komut dosyasını indirmenin ve yürütmenin başka yolları var mı?

GÜNCELLEME: indirmek için yararlı olacağını nedenlerinden

Bir, ancak javascript yürütmüyor/css önceden yük üçüncü parti kütüphaneleri, fakat sadece talep üzerine bunları kullanmaktır.

+3

Sadece css/javascript indirildiği için hemen yürütüldüğü anlamına gelmez. Hangi yöntemler/sınıflar içindir. Ayrıca, eğer ajax'ı kullanacaksanız, 'jQuery' kullanın – Darcy

+8

Gerçekten sorduğun 83 sorudan sadece% 23'ü kabul edilebilir cevaplar aldı mı? –

+1

İşte benzersiz bir yol, ama normal kullanım için kesinlikle pratik değil http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html – qw3n

cevap

1

Ayrıca, bir iframe ve çerçevenin src komut dosyası/css URL'sini de kullanabilirsiniz (bu yüzden değerlendirilmez/hiç uygulanmaz), ancak JavaScript'in bu durumda olduğundan emin olmak istersiniz./CSS, < karakterleri ve benzerleri ile ilgili talihsiz şeylerden kaçınmak için Content-Type text/plain ile teslim edildi. Her ne kadar bu yaklaşımla SOP konularına girmeniz gerekiyorsa da, iyi bir tarayıcıda, iframesrc farklı bir kaynaktan geliyorsa. Bunun dışında, büyük ölçüde listelediğiniz seçeneklerle kapsanmış olduğunu düşünüyorum.

+0

Eh, zaten sayesinde iframe içine komut dosyaları yüklemeye, ama tam olarak nasıl bir önemi yok ... –

+0

@PaulPodlipensky: seni takip değil. Senaryonun yükün hemen ardından idam edilmesini istemiyorsan, bu senin için önemli bir konu. Bir ** lot ** bir betik (iframe) içinden çalıştırırsanız (tarayıcıyı başka bir yere götürmek gibi) bir betik olabilir. Çalıştırmaksızın * yüklemek * istiyorsanız, bunu nasıl yaptığınız önemlidir. :-) –

+0

Eğer betik iframe'e yüklendiyse, eğer yürütürse ya da yürütmezse gerçekten önemli değildir - çünkü iframe içinde çok fazla şey yapamaz ve bağlam iframe, benim sayfam değil. Yani hem benim hem sizin yaklaşımlarınız uygulanabilir. Sadece bu alanda bulabileceğimiz başka bir şey olup olmadığını merak ediyorum ... –

0

Komut dosyanız basit bir işlevi tanımlarsa, aslında hiçbir şey yapmadan çalıştırılabilir. Tabii ki bu ala JSONP

//jsonp 
var result = {/*...*/}; 

//missingnonp 
var f = function(){ /**/ }; 
+0

durum böyle değil –

0

Eğer söz konusu JS yüklemek istediğiniz içine sayfayı teslim sunucuyu kontrol varsayarsak her iki taraftan işbirliğini gerektirir, kolay yolu URL göndermek için AJAX üzerinden sunucunuza, oradan yükleyin (örneğin, PHP file_get_contents ($ url);) ve AJAX çağrısının sonucu olarak geri alın. Bu yaklaşımı here Bulunan

<object data="http://podlipensky.com/examples/dynamicscript/hey.js" /> 

: - Sadece (SOP'a çakışan olmadan) uyumsuz komut/css yüklemek için bir daha seçenek öğrendim

+0

OP bu soruya cevap verdi. Soru şu: * "Senaryoyu indirip çalıştırmamak için başka ** yöntem var mı?" * (Vurgu). –

+0

@ T.J.Crowder SERVER tarafındaki bir işlem için OQ'nun herhangi bir bölümünü göremiyorum ... biraz daha spesifik olabilir misiniz? –

+0

OP, içeriği almak için Ajax'ı kullanma hakkında konuşur ve bu konudaki konular hakkında konuşur (SOP, CORS, vb.). Kendi sunucusunu vekil olarak kullanmak demek iseniz, bunun cevabı açık değildir. –

4

<object> etiketi kullanmaktır. Bu yüzden sizinle sadece bulgularımı paylaşıyorum, umarım faydalı olacaktır.

+0

Bu, iframe komut dosyasını çalıştıran @TJCrowder tarafından verilen sorunlardan dolayı iframe'den daha güvenilirdir. IE <= 8 ile uyumlu değil, ancak bağlantılı gönderi IE için farklı bir yaklaşımı açıklıyor. –

İlgili konular