У меня есть текстовое поле со многими строками ввода, и возникает событие JavaScript, которое требует прокрутки текстового поля до строки 345.
scrollTop делает то, что я хочу, за исключением того, насколько я могу судить, на уровне пикселей, а мне нужно что-то, что работает на линейном уровне. Что также усложняет ситуацию, так это то, что, опять же, снова невозможно сделать текстовые поля без переноса строк.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете остановить перенос с помощью атрибута wrap. Он не является частью HTML 4, но его поддерживает большинство браузеров. Вы можете вычислить высоту линии, разделив высоту области на количество строк.
<script type = "text/javascript" language = "JavaScript">
function Jump(line)
{
var ta = document.getElementById("TextArea");
var lineHeight = ta.clientHeight / ta.rows;
var jump = (line - 1) * lineHeight;
ta.scrollTop = jump;
}
</script>
<textarea name = "TextArea" id = "TextArea"
rows = "40" cols = "80" title = "Paste text here"
wrap = "off"></textarea>
<input type = "button" onclick = "Jump(98)" title = "Go!" value = "Jump"/>
Протестировано нормально в FF3 и IE6.
Если вы используете .scrollHeight вместо .clientHeight, он будет правильно работать для текстовых областей, которые отображаются с ограниченной высотой и полосой прокрутки:
<script type = "text/javascript" language = "JavaScript">
function Jump(line)
{
var ta = document.getElementById("TextArea");
var lineHeight = ta.scrollHeight / ta.rows;
var jump = (line - 1) * lineHeight;
ta.scrollTop = jump;
}
</script>
<textarea name = "TextArea" id = "TextArea"
rows = "40" cols = "80" title = "Paste text here"
wrap = "off"></textarea>
<input type = "button" onclick = "Jump(98)" title = "Go!" value = "Jump"/>
Что следует учитывать при обращении к принятому ответу: возможно, вы не указали атрибут rows в своем textarea, например. вместо этого вы могли установить высоту textarea с помощью CSS.
Поэтому обращение к ta.rows не будет работать, как указано выше (по умолчанию это 2), поэтому вместо этого вы можете получить line-height вашего textarea через currentStyle / getComputedStyle или даже .css() jQuery и сделать что-то вроде следующего:
function jump(line) {
var ta = document.getElementById("TextArea");
var jump = line * parseInt(getStyle(ta, 'line-height'), 10);
ta.scrollTop = jump;
}
function getStyle(el, styleProp) {
if (el.currentStyle) {
var y = el.currentStyle[styleProp];
} else if (window.getComputedStyle) {
var y = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
}
return y;
}
Не могли бы вы дать немного больше информации о том, что вы пытаетесь сделать. В частности, обязательно ли это текстовое поле? т.е. будут ли пользователи редактировать его содержимое?