Как отследить конец прокрутки элемента?
Всех приветствую!
Задача: нужно вызвать событие при прокрутке скролла элемента до конца. Почти везде встречал одно и то же решение, которое работает не совсем адекватно (по крайней мере в хроме), это: if(element.scrollHeight - element.scrollTop === element.clientHeight) alert('Конец прокрутки') Проблема в том, что element.scrollHeight - это целое число, а element.scrollTop - дробное, причем при ресайзе окна и прокрутке до конца вниз, element.scrollTop может быть как больше, так и меньше реального размера. То есть: ( element.scrollHeight - element.scrollTop - element.clientHeight ) = больше или меньше нуля. Кто знает, как быть?
<html>
<head></head>
<body>
<p id="out">0.0</p>
<div id="scroll" style="height: 50%; width: 200px; overflow: auto; font-size: 30px;">
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
</div>
<script>
var out = document.getElementById('out');
var element = document.getElementById('scroll');
element.onscroll = function() {
var scroll = element.scrollTop;
var height = element.scrollHeight - element.clientHeight;
out.innerHTML = scroll + ' : ' + height;
if( height - scroll === 0 ) alert('ok!')
}
</script>
</body>
</html>
|
torrius,
чем код не устраивает? |
в ие и файрфоксе - все устраивает. В опере и хроме работает не стабильно, т.к. element.scrollTop в конце прокрутки возвращает дробное и непостоянное число.
|
torrius,
Math.round |
пробовал, там может получится, допустим, так:
element.scrollHeight - element.clientHeight = 100, а element.scrollTop = 99.2 или 99,8 или 100.4 и т.д. поэтому условие срабатывает не всегда. Но это пол-беды. Из-за округления, событие может вызваться и несколько раз подряд, потому что оно наступает и при 99.6 и 99.8 и 100... как это победить? ) |
максимальный scroll элемента
torrius,
вот такие танцы с бубном ...
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
#scroll{
background-color: #8B008B;
}
body, html{
height: 100%;
}
*{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<p id="out">0.0</p>
<div id="scroll" style="height: 50%; width: 200px; overflow: auto; font-size: 30px;">
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
0<br>0<br>0<br>0<br>0<br>0<br>0<br>0<br>
</div>
<script>
var out = document.getElementById('out');
var element = document.getElementById('scroll');
var temp = element.scrollTop
element.scrollTop = 1 + element.scrollHeight - element.clientHeight;
var height = element.scrollTop;
element.scrollTop = temp;
element.onscroll = function() {
var scroll = element.scrollTop ;
out.innerHTML = scroll + ' : ' + height ;
if( height - scroll === 0 ) out.innerHTML += "end"
}
</script>
</body>
</html>
|
рони, как всегда - спаситель! )) Спасибо человеческое!
Да уж, оригинальный бубен! и ведь работает! :) Я уж было стал через onmousewheel мудрить. Немножко только доработал, чтоб при ресайзе продолжало работать:
var
out = document.getElementById('out'),
element = document.getElementById('scroll'),
temp, height;
init();
window.onresize = init;
element.onscroll = function() {
var scroll = element.scrollTop ;
out.innerHTML = scroll + ' : ' + height ;
if( height - scroll === 0 ) alert('ok')
}
function init() {
temp = element.scrollTop;
element.scrollTop = 1 + element.scrollHeight - element.clientHeight;
height = element.scrollTop;
element.scrollTop = temp;
}
|
| Часовой пояс GMT +3, время: 15:14. |