2010-05-20 21 views
5

Ben jQuery.clone kullandığı bazı(), bir sayfanın html almak ve daha sonra bir ön etiketi eklemek gerekir. Bu Firefox ve Chrome düzgün çalışır, ama hiçbir şey IE olur: jQuery.clone() IE sorun

<!DOCTYPE html> 
<html> 
<head> 
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<meta charset=utf-8 /> 
<title>JS Bin</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
<script> 
$(function(){ 

    $('button').click(function(){ 
    var $clone = $('html').clone(); 
    $('#output').text($clone.html()); 
    }); 

}); 
</script> 
<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
</style> 
</head> 
<body> 
    <button>run test</button> 
    <pre id="output"></pre> 
</body> 
</html> 

var mı herhangi bunu engeller IE ile hata biliyorum veya yanlış bir şey yapıyorum?

sadece sayfa sayfa metni göstermek isterseniz

+2

Tüm belgenin eşdeğerini ("", "" dahil) * geçerli belgeye geri ekleyerek neden işe yaramadığını merak ediyor musunuz? Ben herhangi bir tarayıcıda, hiç işe yaramaz şaşırıyorum. –

+0

Sadece içerikleri() kullanmayı denediniz mi? http://api.jquery.com/contents/ – vsync

+0

@Roatin Marth - O '.text()' kullanılarak ve bir 'pre' kap içine yerleştirerek var. Açıkçası, sayfanın işaretlemesini # çıktıda göstermeyi amaçlıyor. – user113716

cevap

2

(ben bunu çıktısını almadan bunda bazı değişiklikler yapıyorum çünkü klonlamak gerekir), şunu deneyin:

$('button').click(function(){ 
    $('#output').empty().html(('<html>\n ' + $('html').html() + '\n</html>') 
    .replace(/&/gm, '&amp;') 
    .replace(/</gm, '&lt;') 
    .replace(/>/gm, '&gt;') 
    .replace(/\r/gm, '') 
    .replace(/\n/gm, '<br>') 
    ); 
}); 

Bu benim için Chrome, Firefox ve IE8'de çalışıyor.

+0

teşekkürler :) ama ayrıca orijinal html'den bazı öğeleri de kaldırmam gerekiyor, bunu sizin yönteminizle nasıl yapabilirim? –

+0

Eh, istediğiniz gibi onunla 'klon()' operasyonu, karışıklık yapmak ve sonra '.html() sonucunun' değeri ile işe yarayabilir. – Pointy

7

Bu IE, Firefox & Safari çalışmak gibi görünüyor. JQuery'nin clone() yerine javascript DOM API cloneNode() yöntemini arıyorum. Neden işe yaramadığını bilmiyorum. Muhtemelen daha fazla tarayıcı testi yapmalısınız.

var $scripts = $('script');   // Cache all scripts in the document 

var html = $('html').get(0).cloneNode(true); // Clone HTML using DOM API 

var $html = $(html);      // Make jQuery object from cloned HTML 

$('script', $html).each(function(i) {  // Loop through scripts in $html 
    this.text = $scripts.get(i).innerHTML; // replacing content with that 
});           // from the cached $scripts 

$('#output').empty().text($html.html()); // Append to #output 
+0

neredeyse, ancak gömülü komut dosyalarını kaldırır. . Sadece etiketleri kaldı. herhangi bir fikir? –

+0

Tamam, sanırım anladım. IE bize boş 'betik' etiketlerini bıraktığından, tek yapmamız gereken ilk olanı, "html" yi klonlamak, daha sonra boş "script" etiketlerini önbelleğe alınmış olanların içeriği ile güncellemek. İşe benziyor. Cevabımı güncelledim. Bilmeme izin ver. – user113716

1

IE ve diğerlerinde klonun ne olduğu konusunda büyük bir fark olduğunu farkettim. IE'de, komut dosyası etiketleri de dahil olmak üzere her şeyi klonlamış görünüyor. Bu nedenle, kod örneği oluşturan kod etiketinin içinde kodunuz varsa, yeniden başlatılır. Bu soru söz konusu olduğunda, muhtemelen sürekli bir döngü ile karşılaşır, çünkü sürekli olarak kendisini kodlamak için kodu çağırır.