2010-03-21 23 views
17

Baş, html, gövde vb. Dahil olmak üzere tam bir html sayfası içeren bir var var. Bu dizeyi .html() işlevine aktardığımda, jQuery, body, html, head gibi tüm öğeleri çıkarır , istemediğim gibi.jQuery, .html()? Kullanırken bir dizeden bazı html öğeleri çıkarır mı?

My veri var içerir:

<html> 
<head> 
<title>Untitled Document</title> 
</head> 
<body> 
</body> 
</html> 

Sonra jQuery geçerli:

// data is a full html document string 
data = $('<div/>').html(data); 
// jQuery stips my document string! 
alert(data.find('head').html()); 

ben elemanın içinde ne geri dönebilmek için, tam bir html sayfası dize işlemek gerek duyuyorum. Ben jQuery ile bunu yapmak istiyorum, ancak tüm yöntemler, append(), prepend() ve html() tüm dize bir tam html sayfanın tüm diğer bölümlerini kaldırmak için dom öğeleri dönüştürmek için deneyin gibi görünüyor.

Bunu yapmanın başka bir yolu var mı? Başka bir yöntem kullanarak iyi olurdum. Son hedefim, dizimin içindeki belirli öğeleri bulmaktır, bu yüzden jQuery'nin en iyi olacağına karar verdim, çünkü çok alışkınım. Ama eğer dizimin parçalarını kesecek ve çıkaracaksak, başka bir yöntem aramak zorunda kalacağım.

Fikirler?

+1

Neden birisi bunu reddetti? –

+0

Şaka yapmıyorum, bence bu, birçok kullanıcının merak ettiği bir şey hakkında iyi bir tartışma. –

cevap

12

Birkaç hızlı sınamadan sonra, bu davranışın jQuery tarafından değil, bunun yerine tarayıcıdan kaynaklandığını görüyorum.başınıza kolayca (DEMO http://jsbin.com/ocupa3) doğrulamak üzere

var data = "<html><head><title>Untitled Document</title></head><body><p>test</p></body></html>"; 
data = $('<div/>').html(data); 
alert(data.html()); 

farklı tarayıcılarda

farklı sonuçlar verir

Opera 10,10

<HEAD><TITLE>Untitled Document</TITLE></HEAD><P>test</P> 

FF 3,6

<title>Untitled Document</title><p>test</p> 
Eğer bir div içinde tüm html dize eklediğinizdeIE6

<P>test</P> 

nedenle bu jQuery ile ilgisi yoktur, bazı etiketleri şerit tarayıcıları var. Ama emin olmak için html() için tüm jQuery kodunu adım atmanız gerekir. Ve jQuery'nin işi yapmaya çalıştığı birkaç farklı yol olduğundan, tüm tarayıcılarda bunu yapmanız gerekir. Ben iç çerçeve kullanarak araştırmak için tavsiye bir çözüm için


(muhtemelen gizli) ve sahip html-string o iframe içeriğini ayarlamak için. Ancak iframe'lerle uğraşmanın ve içeriklerini programlı olarak değiştirmenin de kolay bir iş olmadığını unutmayın. Ayrıca, tarayıcıyla ilgili farklı tuhaflıklar ve zamanlama sorunları da vardır.

+0

Bunu araştırdığın için teşekkür ederim, bu konuya dikkat ettin. Bunun benim çözümümün belirli bir öğe için dizgime bakabileceği bir regeeks olabileceğini düşünüyorum. –

+0

Bu sınırlamayı öğrenmek beni şaşırttı. İşte çalışan bir çözüm (baş gövde vb. Dahil olmak üzere tüm html kodunu başarıyla ekler): mydoc = document.getElementById ('iframe_id'). ContentWindow.document; mydoc.write (html_code); mydoc.close(); –

0

Konteyner bölmesine gerek yoktur. bu nasıl olacak, söz cevaplandırılması başka itibariyle

:

$('.someClass', foo); // foo is the document you created earlier 

Güncelleme:

bu

var foo = $(data); // data is your full html document string 

Sonra şöyle bunun içinde arama yapabilirsiniz ?: denediniz hareket tarayıcıya gelir.

Ben jQuery docs biraz bakıp bunu buldum:

o yukarıdaki örnekte olduğu gibi HTML, nitelikler olmadan tek etikete daha karmaşıktır, fiili oluşturma Öğeler, tarayıcısında innerHTML mekanizması tarafından işlenir. Özellikle, jQuery yeni <div> öğesi oluşturur ve geçirildi HTML Snippet'te elemanın innerHTML özelliğini ayarlar.

Yani öyle görünüyor ki bir dize olarak bir bütün html doc kullanırken createElement kullanarak div'un innerHTML özelliğini ayarlamadan farklı değil.

+0

'$ (''), en azından Chrome'da bir düzine JS hatası ortaya çıkarır. –

+0

Bu işe yaramaz gibi görünüyor. $ ('Head', data) .html() 'yi uyarmayı denedim, ancak bu sadece null değerini döndürüyor. –

+0

@Max benim için herhangi bir hata vermiyor, sadece boş bir nesneyi geri aldım (Chrome'da). Bu garip, ben çok iyi çalışıyor '$ ('')' test etmişti. –

2

Hayır, jQuery html işlevi, dizeyi yalnızca öğenin HTML öğelerini DOM öğelerine ayırıp sayfaya eklemesini söyleyen tarayıcının işlevi olan innerHTML özelliğine gönderir.

Tarayıcınız bir sayfa HTML verileriyle çalışmıyor, DOM olarak çalışıyor ve HTML içe/dışa aktarılıyor.

JavaScript çok iyi Regular Expression support var. Görevinizin karmaşıklığına bağlı olarak, verilerinizi işlemenin en iyi yolu budur.

3

Burada, gövde, baş ve diğer özellikleri içeren bir çözüm var: mydoc = document.getElementById ('NAME_OF_PREVIEW_FRAME'). ContentWindow.document; mydoc.write (HTML_CODE); mydoc.close();

+0

kurtarıcı, teşekkürler. – TheNastyOne