2011-10-07 20 views
5

Le Kodu: Yani şu anda http://jsfiddle.net/frf7w/12/Javascript: Bir kullanıcı seçimini html etiketlerine göre nasıl genişletirim?

mevcut yöntem seçilmiş olarak ... tam olarak seçilen metni alıyoruz ve görüntülendiğinde, sayfa patlatmak kalmaması etiketler ekleyecektir.

Ama ne yapmak istiyorum: Bir kullanıcı bir sayfanın bir bölümünü seçtiğinde, seçim içinde eşlenmemiş etiketler varsa, seçim ileriye veya geriye doğru atlayacaktır (ne benzersiz eşleme etiketine bağlı olarak) seçimi geçerli html yapmak etiket (ler) için seçimdir. Bir kullanıcı bir sayfadaki metni seçin ve şu anda bağlı kodla yapabilirsiniz (WYSIWYG editörü bu metni düzenleyebilmek için te mümkün istiyorum çünkü

ben bunu yapmak istiyorum sebebi vardır) ve daha sonra yeniden düzenlediklerimi sayfaya koyduk (şu an bunu yapamıyorum çünkü kullandığım yöntem etiketleri ekler).

+0

Seçiminize bir div eklediğinizi ekledikten sonra, eklendikten sonra bu div'in ebeveyni alabileceğinizi düşünüyor musunuz? Ancak, garip bir davranışla sonuçlanabilir. – boulaycote

+0

Bu div yalnızca seçilen metni görüntülemek içindir. Seçilen metnin kendisi eklendi. = \ – NullVoxPopuli

+0

Yani, bu divanın ana sayfasının seçilmesi, muhtemelen tüm sayfayı seçer. – NullVoxPopuli

cevap

2

Sen adding a range tarafından seçimin sınırlarını değiştirebilirsiniz:

var sel = window.getSelection(), 
    range = sel.getRangeAt(0); 

var startEl = sel.anchorNode; 
if (startEl != range.commonAncestorContainer) { 
    while (startEl.parentNode != range.commonAncestorContainer) { 
     startEl = startEl.parentNode; 
    } 
} 
var endEl = sel.focusNode; 
if (endEl != range.commonAncestorContainer) { 
    while (endEl.parentNode != range.commonAncestorContainer) { 
     endEl = endEl.parentNode; 
    } 
} 

range.setStartBefore(startEl); 
range.setEndAfter(endEl); 

sel.addRange(range); 

Yukarıdaki örnek size kapsayacak şekilde genişletilir bir seçim verecektir Başlangıç ​​ve bitiş düğümleri arasındaki ağacın tamamı, kapsayıcı (commonAncestorContainer() sayesinde).

Bu, metin düğümlerini dom öğelerine eşit olarak ele alır, ancak bu sizin için bir sorun olmamalıdır.

Demo: http://jsfiddle.net/Nq6hr/2/

+0

, bu çapraz tarayıcı IE7 + 'da ve daha sonra gerçek tarayıcılarda olduğu gibi mi? – NullVoxPopuli

+1

Chrome 14, FF7, IE9’da test ettim. IE'nin sadece – Deebster

+0

versiyonundan 'range' nesnesini desteklediğini düşünüyorum. Patronumuzu müşterilerimize önermek için başka bir neden vermek için bana bir mazeret verecektir = D – NullVoxPopuli

3

bu SO yanıtında coverAll yöntemi Use javascript to extend a DOM Range to cover partially selected nodes istediğiniz tam olarak ne var. Bazı nedenlerle Selection prototipini genişletmek benim kromumda çalışmıyor, bu yüzden kodu çıkardım ve this ile window.getSelection(). Son kod şunun gibi görünür:

function coverAll() { 
    var ranges = []; 
    for(var i=0; i<window.getSelection().rangeCount; i++) { 
     var range = window.getSelection().getRangeAt(i); 
     while(range.startContainer.nodeType == 3 
       || range.startContainer.childNodes.length == 1) 
      range.setStartBefore(range.startContainer); 
     while(range.endContainer.nodeType == 3 
       || range.endContainer.childNodes.length == 1) 
      range.setEndAfter(range.endContainer); 
     ranges.push(range); 
    } 
    window.getSelection().removeAllRanges(); 
    for(var i=0; i<ranges.length; i++) { 
     window.getSelection().addRange(ranges[i]); 
    } 
    return; 
}
İlgili konular