Как получить текущий активный текст в прокручиваемом 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