Javascript 如何检测需要滚动哪个元素体或html

Javascript 如何检测需要滚动哪个元素体或html,javascript,Javascript,在Fireofx和IE中,要获得scrollTop,需要从html中获取,在chrome中需要从body元素获取 有没有一种不用浏览器嗅探就能检测到的方法 var html=document.querySelector('html'); var body=document.querySelector('body'); var input=document.querySelector('input'); addEventListener('scroll',function(){ input.va

在Fireofx和IE中,要获得scrollTop,需要从html中获取,在chrome中需要从body元素获取

有没有一种不用浏览器嗅探就能检测到的方法

var html=document.querySelector('html');
var body=document.querySelector('body');
var input=document.querySelector('input');
addEventListener('scroll',function(){
input.value=html.scrollTop+“”+body.scrollTop;
});
正文{
高度:1000px;
}
输入{
位置:固定;
顶部:10px;
}

你能测试其中一个的真实性吗(假设
0
表示不存在)

函数getScrollTop(){ 返回html.scrollTop | | body.scrollTop | 0; } var html=document.querySelector('html'); var body=document.querySelector('body'); var input=document.querySelector('input'); addEventListener('scroll',function(){ input.value=getScrollTop(); });
正文{
高度:1000px;
}
输入{
位置:固定;
顶部:10px;
}

您只需检查
html.scrollTop
body.scrollTop
的值:

  • 如果
    它们都是0,则滚动顶部为0
使用
!如果它的值等于零或未定义,scrollTop将返回
true

  • 如果
    html.scrollTop
    大于
    0
    (存在)则小于则scrollTop为html.scrollTop
  • 否则,如果
    主体。scrollTop
    大于
    0
    (chrome)大于scrollTop主体。scrollTop
在本例中,我将scrolltop值存储在一个名为
myScrollTop

var myScrollTop

if (!html.scrollTop && !body.scrollTop) {
    myScrollTop = 0
} else if (html.scrollTop) {
    myScrollTop = html.scrollTop
} else if (body.scrollTop) {
    myScrollTop = body.scrollTop
}
console.log(myScrollTop())
您还可以将代码包装到函数中,并将值返回给调用方

function myScrollTop() {
    if (!html.scrollTop && !body.scrollTop) {
        return 0
    } else if (html.scrollTop) {
        return html.scrollTop
    } else if (body.scrollTop) {
        return body.scrollTop
    }
}
或者更简短的版本

function myScrollTop() {
    return html.scrollTop || body.scrollTop || 0
}
现在,您可以通过调用
myScrollTop()


如果生活很简单,那么可以使用此事件处理程序属性。但是IE在没有浏览器支持的情况下,在工作中使用了扳手。如果IE不可用,你当然可以编写一些代码来绕过IE

if (!('scrollingElement' in document)) (function() {
   alert('IE is a pain in the arse');
}


window.addEventListener('scroll', function(event) {
   alert(event.scrollingElement);
});

我想出了这个方法,它添加了触发scrollbar的预标记,设置scrollTop并检查它更改了哪些元素:

var html=$('html');
变量body=$('body');
var scrollTop=body.scrollTop()| | html.scrollTop();
var pre=$('').appendTo('body');
html(新数组(1000).join('\n'));
$('body,html').scrollTop(10);
变量对象;
if(body.scrollTop()==10){
console.log('body');
滚动对象=身体;
body.scrollTop(scrollTop);
}else if($('html').scrollTop()==10){
log('html');
scrollObject=html;
html.scrollTop(scrollTop);
}
pre.remove()

对不起,我没有提到我还想从代码中更改scrollTop,这是我需要检测滚动哪个元素的方式。@jcubic检查我的编辑。其主要思想是在页面加载时手动触发一个滚动,以确定更改了哪个属性,然后使用该信息创建一个函数,在需要时更新正确的属性。哇,我的wekit userAgent检查要简单得多。它不需要滚动事件就可以工作,但无论如何还是要感谢你。是的,这绝对是一个更简单的选择,我只是按照你的要求建议了另一种方法:)虽然你可能已经解决了这个用户的问题,但代码式的答案对将来遇到这个问题的用户来说并没有多大帮助。请编辑您的答案,以解释代码解决原始问题的原因。完成后,将在以后的答案中尝试解释更多内容。谢谢你的评论。