2010-04-06 18 views
15

Fareyi kullanarak html sayfasında (firefox'ta açılmış) bir metin seçiyorum ve javascript işlevlerini kullanarak, seçilen metne karşılık gelen/oluşturmuş olan eşdüzey oluştur/oluştur.DOM Range nesnesinin metnini nasıl vurgularım?

userSelection =window.getSelection(); 
var rangeObject = getRangeObject(userSelection); 

Şimdi ben,

var span = document.createElement("span"); 
    rangeObject.surroundContents(span); 
    span.style.backgroundColor = "yellow"; 

Kuyusu böyle yapıyorum rangeobject.I altında gelen tüm metni vurgulamak istiyoruz, bu ince, sadece rangeobject (StartPoint ve bitiş noktası) işleri aynı textnode yatıyor, o zaman ilgili text.Ex

<p>In this case,the text selected will be highlighted properly, 
     because the selected text lies under a single textnode</p> 

vurgular Ama rangeobject birden fazla textnode, o zaman çalışmıyor properlay kapsıyorsa, sadece metinleri vurgular hangi İlk textnode içinde rangeobject altına giriyor Ör

<p><h3>In this case</h3>, only the text inside the header(h3) 
    will be highlighted, not any text outside the header</p> 

i yapabilir dair bir fikrin, tüm metinler, yalan aralığı tek bir düğüm veya çoklu düğüm yatıyor olmasından bağımsız olarak, vurgulanan? Teşekkürler ....

+0

Olası kopya: http://stackoverflow.com/questions/1622629/javascript-highlight-selected-range-button –

cevap

24

Ben document 's veya TextRange' tam da böyle bir amaç için inşa edilmiştir, ama genelde düzenlenebilir belgelerde kullanılan ler execCommand yöntemi kullanarak öneririm. İşte benzer bir soruya verdiğim cevap:

Aşağıdakiler istediğiniz şeyi yapmalıdır. IE olmayan tarayıcılarda designMode'u açar, bir arkaplan rengi uygular ve sonra designMode'u tekrar kapatır.

GÜNCELLEME

IE 9'da çalışmak Sabit

GÜNCELLEME 12 Eylül 2013

İşte bu yöntemle oluşturulan vurgular çıkarılması için bir yöntem ayrıntılı bir bağlantı var:

https://stackoverflow.com/a/8106283/96100

function makeEditableAndHighlight(colour) { 
    var range, sel = window.getSelection(); 
    if (sel.rangeCount && sel.getRangeAt) { 
     range = sel.getRangeAt(0); 
    } 
    document.designMode = "on"; 
    if (range) { 
     sel.removeAllRanges(); 
     sel.addRange(range); 
    } 
    // Use HiliteColor since some browsers apply BackColor to the whole block 
    if (!document.execCommand("HiliteColor", false, colour)) { 
     document.execCommand("BackColor", false, colour); 
    } 
    document.designMode = "off"; 
} 

function highlight(colour) { 
    var range; 
    if (window.getSelection) { 
     // IE9 and non-IE 
     try { 
      if (!document.execCommand("BackColor", false, colour)) { 
       makeEditableAndHighlight(colour); 
      } 
     } catch (ex) { 
      makeEditableAndHighlight(colour) 
     } 
    } else if (document.selection && document.selection.createRange) { 
     // IE <= 8 case 
     range = document.selection.createRange(); 
     range.execCommand("BackColor", false, colour); 
    } 
} 
+0

@crizCraig: Seçim, "click" etkinliğinin başladığı zaman yok olabilir. Bunun yerine 'mousedown' olayını kullanabilirsiniz. –

+0

Bu, bir tıklatma düğmesine basmak için bunu tıklatmaya çalışıyorsanız, IE'de çalışmaz. Bu sorunun cevabını kullanarak seçimi mouseup'a kaydetmeniz yeterlidir. http://stackoverflow.com/questions/5767037/editing-iframe-content-in-ie-problem-in-maintaining-text-selection/5770175#5770175 – crizCraig

+0

@crizCraig: Aşağıdaki basit durumda IE'de benim için iyi çalışıyor : http://jsfiddle.net/LPnN2/ –

1

Bu işlevsellik gereksinimini ayrıntılı olarak değerlendirir misiniz? ':: seçim'

Fazla Bilgi: http://www.quirksmode.org/css/selection.html https://developer.mozilla.org/en/CSS/::selection

+0

Kalıcı bir şekilde bazı metinleri vurgulamak istiyorum (burada, uygulamayı kapatıncaya kadar, tam olarak ne yaptığınıza 'başka bir yere tıkladığınızda' vurgu 'kaybolduğunu, ve dinamik olarak (metin düzenleyicisini kullanarak html dosyasını açmak ve orada bir eleman eklemek istemediğim anlamına gelir) – ganapati

0

çevredeki yayılma için bir sınıf eklemeyi deneyin ve başvurabilir miyim yalnızca CSS kullanabilirsiniz seçilen metnin vurgulamak stilini değiştirmek istiyorsanız hiyerarşik CSS? CSS tanımda

var span = document.createElement("span"); 
span.className="selection"; 
rangeObject.surroundContents(span); 

,

span.selection, span.selection * { 
    background-color : yellow; 
} 

bunu deneyin vermedi. Ama sadece bunun işe yarayacağını tahmin ediyorum.

+0

bunun nasıl olduğunu düşünüyorsunuz? span.style'den daha iyi olduğunu düşünüyorsunuz. backgroundColor = "sarı" bu? – ganapati

+0

Onun span.style.background farklı değil. Ama "span.selection *" adlı hiyerarşik CSS, probleminizi çözecektir. – Mandai

4

Rangy, CSS Class Applier module ile bu sorunu mükemmel bir şekilde çözen bir tarayıcılar arası seçim kütüphanesidir.Bir dizi masaüstü tarayıcıda ve iPad'de vurgulamayı uygulamak için kullanıyorum ve mükemmel çalışıyor.

Tim Down'ın yanıtı harika ama Rangy, bu özellik algılama kodunu kendiniz yazmanız ve saklamanız gerekmeden sizi ayırıyor.

+8

Fark ettim ki [Tim Down] Rangy'nin yazarı] (http://code.google.com/u/107383371366938520460/). :) –