2011-03-03 20 views
25

seçilen Başlarken: Özel bir tuşa basıldığındaBu tarayıcıda seçili metin yapıyor alıyorum bir anda metin pozisyonunu

window.getSelection(); 

Şimdi bu metinde üzerinde bir araç ipucu göstermek gerekir (not fare olabilir o artık metnin üzerinde olmamalı), bu yüzden bunu yapmak için seçilen metnin mutlak konumuna ihtiyacım var.

Bunu yapmak için bir yol var mı, belki de bu metni bir etiketin içine yerleştirip sonra ofsetleri mi alıyorsunuz?

Fikriniz Var mı?


PS: tüm tarayıcılar için, krom çalışmak zorunda.

PS2: Benim berbat İngilizcem için özür dilerim.

+0

Olası kopyalar [I kullanıcının yanındaki bir öğe konumlandırmak nasıl metin seçimi?] (https://stackoverflow.com/questions/1589721/how-can-i-position-an-element-next-to-user-text-selection) – Liam

cevap

11

En kolay yol, seçimin başlangıcında veya sonunda geçici bir işaretleyici elemanın yerleştirilmesi ve konumunun elde edilmesidir. Ben Yığın taşması önce bunun nasıl göstermiş: How can I position an element next to user text selection?

+0

Eğer bu sorunun bir kopyası ise o zaman Kapatmak için oy verdiniz mi? Başka bir cevaba işaret eden bir cevap eklemiyor musunuz? – Liam

+1

@Liam: Emin değilim; Sorular özdeş değildir, ancak onlara cevap vermek için gereken teknik aynıdır. Cevaplama sırasında en fazla yeniden avlanma aşamasında olduğumu inkar edemem. –

38
s = window.getSelection(); 

bir Seçimi döndürür. Bu nedenle, istemci (sabit) koordinatlarında sınırlayıcı dikdörtgeni oRect olacak oRect .

+0

Aralığın 'getBoundingClientRect()' yöntemi, maalesef oraya varmasına rağmen, evrensel olarak desteklenmemektedir. Örneğin IE9'un sahip olduğunu sanmıyorum. –

+5

Soru, yalnızca Chrome için yazıyor. Bu, Chrome ve FF'de çalışır. – Jerinaw

+3

'oRange' ... Orada ne yaptığınızı görüyorum :) – volter9

0

getBoundingClientRect kullanmadan önce, this note bilmek gerekir:

CSSOM çalışılan taslak her sınır kutusu için bir ClientRect döndüren belirtir

Ve bu 'standart' ile

:

Satır içi bir öğe için, iki tanım aynıdır. Ancak bir blok öğesi için Mozilla sadece tek bir dikdörtgen döndürür. Bu yayını okuyan herkes daha hassas pozisyonlarda ve seçilen metinlerin düzenleri için genel bir çözüm istiyor Yani eğer

, aşağıdaki yaklaşımlar önermek:

Seçenek 1: kesin başlayan ve ve metinlerin bitiş noktası bulun tarafından inserting invisible elements. Ardından, seçilen satır dikdörtgenlerini çıkarılan hesaplanmış çizgi yüksekliği ve kapsayıcı genişliği ile hesaplayın. Kullanımdaki API'ler: window.getComputedStyle.

  • Pro: Sonuç, her metin satırı için en kesin sonuçtur.
  • Con: 1) Seçim, farklı çizgi yükseklikleri ve genişlikleri olan birkaç düğüm üzerinde ise, algoritma karmaşık hale gelir. 2) Basit bir özelliği uygularken çok fazla zaman harcayan hesaplama algoritmasını uygulamanız gerekir.

Seçenek 2: Wrap her her kutunun düzenini ayıklanması bir dikkatle tarz sıralı eleman ile metin, ve çizgilerin içine sonuçlarını birleştirmek.

  • Pro: Tüm sürekli seçimler için geçerlidir (temel olarak geçerli ana tarayıcı uygulamalarındaki tüm durumlar anlamına gelir.). Metinlerin her satırı için yeterince iyi.
  • Con: 1) Bazı durumlarda hata, kerning hata genişlikleri eklediğinden, biraz yanlıştır. 2) Çok geniş bir metin seçiminde yavaştır. seçenek 2 için

, rangeblock size metnin her satırının affı düzenini verir kolay API ile varolan uygulamasıdır:

let block = rangeblock.extractSelectedBlock(window, document); 
console.info("Text layout: " + JSON.stringify(block.dimensions)); 
// output: Text layout: {Left: 100, Top: 90, Width: 200, Height: 50} 
ait