2010-08-23 13 views
51

Yeni bir kullanıcı sorusu gelebilir, ancak bir kullanıcı fareyi kullanarak bir sayfada belirli bir metin parçasını seçtiğinde özel bir JavaScript işlevini nasıl tetikleyebileceğimi öğrenmek istedim. Ayrıca web sayfasındaki seçilen metnin konumunu bulmak için herhangi bir yolu var mı?Javascript'te seçilen metin etkinliği tetikleyicisi

Güncelleme: Daha açık olması gerekirse, metin parçası, bir cümlenin veya bir kelimenin bir parçasının veya bir tümcenin veya bir paragrafın bir parçası olabilir.

cevap

53

hiçbir (DOM) olayı "Metin seçildi" Orada, ancak document.body bir mouseup olayı bağlayabilir. Bu olay işleyicisi içinde, sadece

document.selection.createRange().text 

veya

window.getSelection() 

yöntemlerini kontrol edebilirsiniz. Stackoverflow ile ilgili birkaç konu var, bunun gibi bir javascript to get paragraph of selected text in web page.

"Konumu bulma" ile ne demek istediğinizden emin değilim, ancak örnek dünyamda kalmak için X + Y fare konumları için event propertys'u kullanabilirsiniz.

Örnek: http://www.jsfiddle.net/2C6fB/1/

+0

Teşekkürler Andy, Ya da elimizden gelenin en iyi olduğunu düşünüyorum X + Y fare pozisyonları. –

+4

Seçimi klavyeden de düşünmelisiniz. –

+0

Yorumlarınız için teşekkürler Tim. Klavye ile seçim yapmak için herhangi bir işaretçi? –

46

Aşağıda kısa bir mashup var:

$('div').mouseup(function() { 
    var text=getSelectedText(); 
    if (text!='') alert(text); 
}); 

function getSelectedText() { 
    if (window.getSelection) { 
     return window.getSelection().toString(); 
    } else if (document.selection) { 
     return document.selection.createRange().text; 
    } 
    return ''; 
}​ 

<div>Here is some text</div> 

Demo: http://jsfiddle.net/FvnPS/11/

+3

'window.getSelection();' IE'nin document.selection.createRange(). Text;' ile eşdeğer olduğu konusunda yaygın bir fikir var gibi görünüyor. İnsanlar aynı, yanlış kaynaktan kopyalanıyor mu? Herneyse, 'window.getSelection()' 'document.selection.createRange(). Text iken' Selection' nesnesini döndürür; '' dır. Karışıklık, 'Selection' nesnesinin 'toString' yönteminin seçilen metni döndürdüğü gerçeğinden kaynaklanır, yani 'alert (window.getSelection());' seçilen metni uyarır. –

+0

Sabit. Mozilla docs şöyle diyor: "Bu, seçim nesnesinin, kendi özelliklerine ve yöntemlerine sahip bir nesne olduğunda, bir dize gibi görünmesini sağlar. Özellikle, Selection nesnesinin toString() yönteminin çağrılmasının dönüş değeri iletilir." :) https://developer.mozilla.org/en/window.getSelection – karim79

+2

Heh. Bunu daha önce görmedim. Cevabınız için kusura bakmadığınız için üzgünüm: çıkmış olabileceğiniz gibi, bunu daha önce SO üzerinde birkaç kez düzelttim. –

1

AFAIK, sen tarif böyle bir olay yoktur. Ama bu işlevi taklit edebilirsiniz. Kod ve demo için here numaralı telefona bakın. Bu ilgilenen yeni bir deneysel API vardır

+1

Teşekkürler ShiVik, gerçekten yardımcı oluyor. Bu benzetimde tarayıcı bağımlılığı var mı? –

+0

@abhishiktiwari - AFAIU blogu - hiçbiri – vikmalhotra

3

:

Seçim API SelectionChange olay belgesinin seçim obje değiştirildiğinde ateş veya edildiğinde bir <input> ilişkili seçimi veya bir <textarea> değişiklik . Seçim davası olayı, ilk durumda, ikinci davadaki elemanın üzerine dökülür. Bu kenar kanama ve hatta önemli tarayıcılarda çalışması garanti olmadığını

https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange

Not.

+1

Bu bağlantı soruları cevaplayabilmekle birlikte, sorunun cevabının önemli bölümlerini buraya eklemek ve referans linki vermek daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum Yaz] (/ review/düşük kaliteli yazılar/13804253) – eisbehr

+0

3 ay önce –

+0

Kanama kenarını değiştirdim? Acıklı. Her zaman olduğu gibi, bu on yıl boyunca AS3'te kullanıma sunulmuştur: http://help.adobe.com/tr/FlashPlatform/reference/actionscript/3/flashx/textLayout/events/SelectionEvent.html – Triynko

0

"Metin seçildi" etkinliği var. Ama sadece bildiğim gibi textarea için.

(function() { 
    "use strict"; 
    var showSelectedText = function (e) { 
     var text = ''; 
     if (window.getSelection) { 
      text = window.getSelection(); 
     } else if (document.getSelection) { 
      text = document.getSelection(); 
     } else if (document.selection) { 
      text = document.selection.createRange().text; 
     } 

     console.log(text.toString()); 
    } 

    document.onmouseup = showSelectedText; 
    if (!document.all) { 
     document.captureEvents(Event.MOUSEUP); 
    } 

})(); 

Bu benim atama biri sırasında kullanılan örnek kod:

<textarea onselect="message()" name="summary" cols="60" rows="5"> 
请写入个人简介,不少于200字! 
</textarea> 
0

aşağıdaki kodu kullanın. Benim için çalıştı.

İlgili konular