2011-02-04 20 views
12

W3C uyumlu tarayıcılarda JavaScript Range Object'in html dizesini almanın bir yolu var mı?Aralığı veya DocumentFragmenti dizeye dönüştürme

Örneğin, bize Aşağıdaki kullanıcı seçer diyelim: Hello <b>World</b>
O Range.toString() yöntemi kullanarak bir dize olarak "Hello World" almak mümkündür.

(Firefox'ta, o. belgesini 'ın getSelection yöntemini kullanarak da mümkündür) Ama iç HTML almak için bir yol bulmak gibi olamaz.

Bazı aramalardan sonra, aralığın DocumentFragment Nesnesine dönüştürülebildiğini buldum.

Ancak DocumentFragments hiçbir innerHTML özelliğine sahip değildir (en azından Firefox; Webkit veya Opera'yı denemediniz).
Bu benim için garip görünüyor: Seçilen öğelere erişmenin bir yolu olması gerektiği aşikar gibi görünüyor.

Bir documentFragment oluşturabildiğimi, belge parçasını başka bir öğeye ekleyebileceğimizi ve bu öğenin innerHTML numarasını aldığımı anlıyorum.
Ancak bu yöntem, seçtiğiniz alan içindeki açık etiketleri otomatik olarak kapatacaktır. Bunun yanında, bir dize olarak elde etmek için dom'a takmaktan daha bariz bir “daha ​​iyi yol” var elbette.

Peki, bir Range veya DocFrag html dizesinin nasıl elde edilir?

cevap

3

Hayır, bunu yapmanın tek yolu budur. Yaklaşık 10 yıl öncesine ait DOM Seviye 2'nin özellikleri, düğümleri HTML metnine serileştirme ve serileştirme açısından neredeyse hiçbir şey içermediğinden, innerHTML gibi uzantılara güvenmek zorunda kaldınız.

Yorumunuzu İlişkin o

Ama bu yöntem oto Seçtiğim alanı içinde herhangi açık etiketleri kapanacak.

... başka nasıl çalışır? DOM bir ağaçta düzenlenmiş düğümlerden oluşur. DOM'dan içerik kopyalamak yalnızca başka bir düğüm ağacı oluşturabilir. Öğe düğümleri, bir başlangıç ​​ve bazen bir bitiş etiketi ile HTML'de sınırlandırılır. Bir bitiş etiketi gerektiren bir öğenin HTML temsili bir uç etiketine sahip olmalıdır, aksi halde geçerli bir HTML değildir.

+0

aralığı belge fragmanı (ISN' dönüştürüldüğünde uç etiketler oluşturulur t bu doğru mu?). Bununla birlikte, ** geçersiz aralık işaretlemesi içeriyor olsa bile, nodların düğümlere dönüştürülmeden önce hangi aralıkta yer aldığını bulmak mümkün olmalıdır. – SamGoody

+4

Katılmıyorum. Geçersiz işaretleme ayrıştırıldığında, tarayıcı onu ele alır, ancak uygun görür ve DOM'ta, tarayıcının belgenin kendi temsili olan uygun düğümlerini oluşturur. Bu geçersiz işaretleme, daha sonra en azından DOM (JavaScript'in erişebileceği) kadarıyla atılır.DOM'ı bir dize açısından düşünmeyi bırakıp bunu bir ağaç olarak düşünmeye başlamalısınız. Bitiş etiketleri bu ağacın bir HTML dizgisine serileştirilmesinin bir ürünüdür (örneğin, innerHTML ile). Onlar ağacın içindeki varlıklar olarak var olmazlar. –

4

here bir örnek telaffuz için:

//Example setup of a fragment 
var frag = document.createDocumentFragment(); //make your fragment 
var p = document.createElement('p'); //create <p>test</p> DOM node 
p.textContent = 'test'; 
frag.appendChild(p ); 

//Outputting the fragment content using a throwaway intermediary DOM element (div): 
var div = document.createElement('div'); 
div.appendChild(frag.cloneNode(true)); 
console.log(div.innerHTML); //output should be '<p>test</p>' 
+1

Soruda açıklanan yaklaşım budur. OP daha iyi bir yol ister (ne yazık ki yoktur). –

10

FWIW jQuery yolu:

$('<div>').append(fragment).html() 
İlgili konular