Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript window.scrollTo的选项在Microsoft Edge上不起作用_Javascript_Microsoft Edge - Fatal编程技术网

Javascript window.scrollTo的选项在Microsoft Edge上不起作用

Javascript window.scrollTo的选项在Microsoft Edge上不起作用,javascript,microsoft-edge,Javascript,Microsoft Edge,我有一个奇怪的问题,我只能在微软浏览器上复制(Edge和IE11测试) 身体{ 高度:5000px; 宽度:5000px; } 单击按钮将文档窗口滚动至1000像素 点击我滚动! 函数scrollWin(){ window.scrollTo({ 左:1000, 前1000名, 行为:“平稳” }); } 不幸的是,该方法无法在这两种浏览器中工作。 您可以在此处查看未解决的问题,并查看他们对此问题没有采取任何行动。 从这个词的意义上讲,这可能不是一个真正的答案,但我通过使用这个有用的polyf

我有一个奇怪的问题,我只能在微软浏览器上复制(Edge和IE11测试)


身体{
高度:5000px;
宽度:5000px;
}
单击按钮将文档窗口滚动至1000像素

点击我滚动! 函数scrollWin(){ window.scrollTo({ 左:1000, 前1000名, 行为:“平稳” }); }
不幸的是,该方法无法在这两种浏览器中工作。 您可以在此处查看未解决的问题,并查看他们对此问题没有采取任何行动。
从这个词的意义上讲,这可能不是一个真正的答案,但我通过使用这个有用的polyfill解决了这个问题:它在所有浏览器中都非常有效

pollyfill的示例页面:


非常感谢作者。

您可以尝试在Window.scrollTo()中使用Element.ScrollLeft和Element.ScrollTop属性

下面是使用Edge和其他浏览器的示例


身体{
高度:5000px;
宽度:5000px;
}
单击按钮将文档窗口滚动至1000像素

点击我滚动! 功能scrollWin(pos){ 滚动至(位置偏移设置+1000,位置偏移设置+1000); }
事实上,他们不支持这种变体,MDN文章应该更新

polyfill此方法的一种方法是在requestAnimationFrame循环中运行
scroll
方法。这里没什么特别的

出现的主要问题是如何检测何时不支持此变体。实际上完美地解决了这个问题

为此,我们可以使用这样一个事实:如果视口确实滚动,则调用Window#scroll将触发ScrollEvent。
这意味着我们可以设置一个异步测试,该测试将:

  • 将事件处理程序附加到ScrollEvent
  • 第一次调用
    滚动(左,上)
    变量以确保事件将触发
  • 使用选项变量用第二个呼叫覆盖此呼叫
  • 在事件处理程序中,如果我们没有处于正确的滚动位置,这意味着我们需要附加polyfill
  • 因此,这个测试的警告是,它是一个异步测试。但是,由于在调用此方法之前,您实际上需要等待文档加载,因此我想在99%的情况下,它是可以的

    现在,为了减轻主文档的负担,并且由于它已经是一个异步测试,我们甚至可以将此测试包装在一个iframe中,这给了我们如下内容:

    /*多边形填充窗口#滚动(选项)和窗口#滚动到(选项)*/
    (函数ScrollPolyfill(){
    //异步测试仪
    //包装在iframe中(在SO的StackSnippet®中不起作用)
    var iframe=document.createElement('iframe');
    iframe.onload=函数(){
    var win=iframe.contentWindow;
    //侦听滚动事件
    win.addEventListener('scroll',函数处理程序(e){
    //当scroll事件触发时,请检查我们是否已移动
    如果(win.pageXOffset<99){/!==0应该足够了,但最好是安全的
    attachPolyfill();
    }
    //清理
    document.body.removeChild(iframe);
    });
    //设置文档以便滚动
    var body=win.document.body;
    body.style.width=body.style.height='1000px';
    win.scrollTo(10,0);//强制事件
    scrollTo({left:100,behavior:'instant'});//我们实际测试的那个
    };
    //准备好我们的框架
    iframe.src=“关于:空白”;
    iframe.setAttribute('width',1);
    iframe.setAttribute('height',1);
    setAttribute('style','position:absolute;z-index:-1');
    iframe.onerror=函数(){
    错误('加载帧失败,请在JSFIDLE中重试');
    };
    document.body.appendChild(iframe);
    //Polyfill
    函数attachPolyfill(){
    var original=window.scroll,//保留原始方法
    animating=false,//将保留计时器的id
    dx=0,
    dy=0,
    target=null;
    //超越我们的方法
    window.scrollTo=window.scroll=函数polyFilled滚动(用户选择){
    //如果我们已经平滑滚动,我们需要停止上一个
    //不管当前的争论是什么
    如果(动画){
    clearAnimationFrame(动画);
    }
    //不是对象语法,而是使用默认语法
    if(arguments.length==2){
    返回原件。应用(此,参数);
    }
    如果(!user_opts | | type of user_opts!=='object'){
    抛出新的TypeError(“值无法转换为字典”);
    }
    //创建一个克隆以不弄乱传递的对象
    //并设置缺少的条目
    变量选项={
    左:(“左”在用户选项中)?用户选项。左:window.pageXOffset,
    顶部:(“用户选项”中的“顶部”)?用户选项。顶部:window.pageYOffset,
    行为:(“用户选项”中的“行为”)?用户选项。行为:“自动”,
    };
    if(opts.behavior!==“即时”&&opts.behavior!==“平滑”){
    //基于“平滑行为”属性的CSS计算值分析“自动”
    //但请注意,如果浏览器不支持此变体
    //很有可能它也不支持CSS属性。。。
    opts.behavior=window.getComputedStyle(document.scrollingElement | | document.body)
    .getPropertyValue('scroll-behavior')=='smooth'?
    “平滑”:“瞬间”;
    }
    如果(opts.behavior==='instant'){
    //不是平滑的,只是在解析项目后默认为原始
    返回原始调用(this,opts.left,opts.top);
    }
    //更新我们的方向
    dx=(opts.left-window.pageXOffset)| | 0;
    dy=(opts.top-window.pageYOffset)| 0;
    //无处可去
    如果(!dx&&!dy){
    返回;
    }
    //保存传递的参数
    目标=选择;
    //保存英国皇家空军的身份证
    设置动画=动画();
    };
    //动画循环
    F