Как получить текущий активный текст в прокручиваемом DIV

Обрезанный DIV содержащий абзацы, которым нужна полоса прокрутки

например.

<div id="text" style='overflow:scroll;width:200px;height:200px'>

<div style='font-size:64px;'>BIG TEXT</div> 
Lorem Ipsum is simply dummy text of the printing and typesetting 
industry. Lorem Ipsum    has been the industry standard dummy text ever  
since the 1500s, when an unknown printer took a galley of type and scrambled it 
to make a type specimen book. It has survived not only five centuries, but also 
the leap into electronic typesetting, remaining essentially unchanged.
It was popularised in the 1960s with the release of Letraset sheets 
containing Lorem Ipsum passages, and more recently with desktop publishing software 
like Aldus PageMaker 
including versions of Lorem Ipsum.

</div>

При перемещении полосы прокрутки изменение текста (из-за overflow:scroll) возможно выбрать только текст, отображаемый в текущем порт представления?

Пример: http://jsfiddle.net/cxgkY/15/

Обновлено: внутренний HTML может содержать текст с переменным размером

Ответ 1

Вот небольшая демоверсия, которая должна делать то, что вы ожидаете: небольшая ссылка (также работает с переменными размерами). Идея состоит в том, чтобы автоматически создать отдельный span для каждого слова, а затем, каждый раз, когда прокручивается div, проверьте, какие span видны (проверяя их смещение top), тем самым обновляя диапазон выбора документа. Если что-то не ясно, я был бы рад объяснить это.

Ответ 2

Не уверен, что вы имеете в виду, выбрав только текст в текущем окне просмотра, но, возможно, что-то вроде этого:

var elm = $("#text"),
    t = $(elm).text().split(' '),
    html = [],
    selected_text = '';

$.each(t, function(i,e) {
    html.push('<span>'+e+'</span>');
});

elm.html(html.join(' '));

$('span', elm).each(function(i,e) {
    if ($(e).offset().top < elm.height()) {
        $(e).css('background', 'red');
        selected_text += $(e).text()+' ';
    }
});

FIDDLE

Если точкой этого упражнения является просто отображение текста в другом элементе контейнера, вы можете просто сделать это обычным способом и подделать его:

$("#text").on('scroll', function() {
    $('#visible').html($(this).html()).scrollTop($(this).scrollTop());
});

FIDDLE  

Ответ 3

Может быть что-то вроде этого (см. DEMO: http://jsfiddle.net/cxgkY/14/):

HTML:

<div id="text">
    <div id="wrapper">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </div>
</div>

   JavaScript:

$('#text').scroll(function () {
  var text = $(this).text();

  var begin = $(this).scrollTop() / 
      $(this).children('#wrapper').height();

  var end = begin + $(this).height() /
    $(this).children('#wrapper').height();

  var text = text.slice(text.length * begin, text.length * end);
  $('#visible').text(text);
});  

Ответ 4

<div id="text">
    <p>Line 1</p>
    <p>Line 2</p>
    <p>Line 3</p>

</div>

Вы могли бы сделать..

$(function(){
    var meanLineHeight = $('#text > p').first().outerHeight();

    var result = $('#result');

    $('#text').scroll(function(){
        var linesScrolled = Math.ceil(this.scrollTop/ meanLineHeight);
        console.log(linesScrolled);

        var linesToSelect = $('#text > p').slice(linesScrolled);
        linesToSelect.css('background-color', 'yellow');
    });​​​​​​​
});

DEMO