【问题标题】:Infinite loop when checking if element is off screen, if not then move up检查元素是否在屏幕外时无限循环,如果不是则向上移动
【发布时间】:2017-04-21 22:43:33
【问题描述】:

我似乎无法弄清楚为什么这段代码作为 while 循环和递归函数会无限运行。 我正在检查一个元素是否在视口中,如果不在,则将其父元素的顶部偏移量向上移动,直到其子元素离开视口。

HTML 结构:

<div id="outter">
    <div id="inner"></div>
    <div id="inner"></div>
    <div id="inner"></div>
</div>

它们都有设置的高度和宽度,并且是 display:inline-block 和可见的。

我已经有一个 jQuery 伪类来检查元素是否在屏幕外,例如 `.is(':offscreen')。它工作正常,但我想知道原始值是否缓存在 jQuery 中的某个地方。

在代码中:

var top=1;
do{
    $('#outter').css('top', top);
    top++;  
}
while(!$('#inner').is(':offscreen'));

这是在 StackOverflow 上找到的屏幕外 psuedoclass 的代码:

jQuery.expr.filters.offscreen = function(el) {
  var rect = el.getBoundingClientRect();
      return(
        (rect.x + rect.width) < 0  || (rect.y + rect.height) < 0 || 
        (rect.x > window.innerWidth || rect.y > window.innerHeight));
};

【问题讨论】:

  • 您不能重复使用 ID。多个id="inner"s 无效。
  • @Xufox 感谢您指出这一点,但这只是在此示例代码中

标签: javascript jquery


【解决方案1】:

当您选择具有重复 ID 的标签时,JQuery 将不起作用。

将您的内部 div id="inner" 更改为 class="inner" 并将您的选择器更改为 $('.inner'),或者为您的内部 div 提供唯一 ID。

【讨论】:

  • 感谢您指出这一点,但这只是在此示例代码中
【解决方案2】:

根据thisgetBoundingClientRect 在某些浏览器上可能有也可能没有xy 属性(我刚刚在Chrome 57 上对其进行了测试,它返回了undefined)。使用left 代替xtop 代替y,因为DOMRect 总是有它们。

【讨论】:

  • 谢谢,这有帮助,但我仍然遇到无限循环。
  • @wordSmith 我会说这有点远,但请尝试在top 之后添加"px"$('#outter').css('top', top + "px");
  • @wordSmith 和我刚刚注意到的一件事。您正在设置#outer 的顶部并检查#inner 的屏蔽。 #inner 可以有一个固定的或绝对的position 吗?
  • @wordSmith 顺便说一句,为了使top 工作,该元素应该具有fixedrelativeabsolute 定位。
猜你喜欢
  • 2012-02-12
  • 2019-07-10
  • 2015-03-29
  • 1970-01-01
  • 2011-07-18
  • 2016-04-18
  • 2019-09-17
  • 1970-01-01
  • 2014-12-19
相关资源
最近更新 更多