0

我对 jQuery 有一个奇怪的问题,这是我以前从未见过的。

我有一些脚本来计算position().top始终在页面上的元素的值。这是一个li里面一个ul里面一个div

每次我发布新请求时的作品,通常都会返回300. 但是,如果我随后点击ctrl-r并重做请求,则同一页面的相同代码返回0. position().top再次刷新可以看到它的工作。

这种情况始终如一地发生,每次2nd页面刷新。但是,每个新页面请求(更改参数或只是重新提交表单)似乎都可以正常工作。我还没有目睹这个奇怪的失败循环失序。

警告

现在需要注意的是(和一些代码):我正在使用easingzebra_datepicker插件,并编写了我自己的垂直滑块插件,其中包含始终无法获得我的元素正确位置的代码。

所以我不认为这是一个常见的情况,我也不能发布完整的源代码,所以我发布了一个带有奇怪代码的片段,而不是其他任何东西:

// inside each loop for slider parent elements
// $(this) references the slider container, i.e <div>
var slideTo = $(this).find('.slideTo').position().top; //300 or 0

此代码在插件本身中,然后在$(window).load()事件中调用。

这种行为方式让我认为这是某种竞争条件,但我在我的代码中找不到任何以错误顺序执行操作或多次运行的东西,相信我已经用调试将它填满了。

tl;博士

所以我的问题是:如果目标元素存在并且在调用时已加载,是否有任何情况jQuery.position().top会返回?0

为了实现这一点,我可能会犯什么愚蠢的错误吗?可能是由于无效标记还是与元素是一个事实有关li

4

3 回答 3

1

这是在 Webkit 浏览器中吗?元素是图像吗?这里需要更多信息,但在基于 Webkit 的浏览器中,您将无法访问 $(window).ready() 上图像的位置值,因为它尚未计算它们的尺寸,您必须等到 $(window)。加载()

我假设它在第二次加载时起作用的原因是因为图像被缓存了,但是我再次假设你正在使用 Webkit 并且元素是图像......

编辑:抱歉,刚刚意识到你说它在 $(window).load() 中,你可以使用 setTimeOut 继续轮询该值并查看它是否在一段时间后填充?

于 2012-07-17T09:15:55.520 回答
0

您可以使用parseInt()获取css()值,因此只剩下数字值;

尝试这个:

var slideTo = parseInt($(this).find('.slideTo').css('top'));
于 2012-07-17T09:11:17.027 回答
0

事实证明,这并不总是像我想象的那样返回零。

发生的事情是,当我修改scrollTop父元素的 ,然后刷新页面时,Firefox记住了刷新时的scrollTop值 - 所以我的计算返回为零,因为记住的scrollTop值,该元素的位置为零

所以这种行为根本不是错误的,并且position()正在做它应该做的事情。

我通过在运行这些计算之前将元素的 scrollTop 设置为零来解决这个问题,这阻止了 Firefox 的记忆值对我的破坏。

于 2012-07-17T10:25:22.987 回答