我仍然是编码的新手,因此我似乎无法修复这个错误。我正在我的个人网站http://yeemachine.com上工作,该网站有一个粘性导航栏,当达到scrolltop函数中的某个阈值时,该导航栏会更改其“html内容”。
这是我用来加载初始函数的。当它试图加载var = pdr或.class2的高度时出现错误。 .class2是一个包含使用Masonry.js设置的图像的div。有时候会受到重创。大部分时间在第一次加载时,它将div的高度设置为2000+ px,如果所有图像堆叠在彼此之上,则高度为高度。
$(window).load(function() {
var mn = $(".main-nav");
var mns = "main-nav-scrolled";
var hdr = $('#container').height();
var pdr = $('.class2').height();
var gdr = $('.class1').height();
var sdr = $('.hundred').height();
console.log(gdr);
console.log(pdr);
var windowPosY = $(this).scrollTop();
$(window).scroll(function() {
if($(this).scrollTop() > (hdr*.85) && windowPosY < (hdr+(gdr)))
{
mn.addClass(mns);
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Design<br><i class='fa fa-chevron-down'></i>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() < (hdr*.85) && windowPosY ){
mn.removeClass(mns);
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up hideicon'></i><br>Richard<br>Yee<br><i class='fa fa-chevron-down'></i>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() > (hdr+gdr) && windowPosY < (hdr+gdr+pdr)){
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Painting?<br><i class='fa fa-chevron-down'></i>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() > (hdr+gdr+pdr) && windowPosY < (hdr+gdr+pdr+sdr)){
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Sound<br><i class='fa fa-chevron-down hideicon'></i>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
});
我有这个初始加载函数,还有一个调整大小的函数,可以在每次调整窗口大小时修复问题。
var resizeTimeout;
$(window).resize(function() {
clearTimeout(resizeTimeout);
resizeTimeout= setTimeout(doneResizing, 500);
});
doneResizing(); //trigger resize handling code for initialization
});
function doneResizing()
{
mn = $(".main-nav");
mns = "main-nav-scrolled";
hdr = $('#container').height();
gdr = $('.class1').height();
pdr = $('.class2').height();
sdr = $('.hundred').height();
$(window).scroll(function() {
var windowPosY = $(this).scrollTop();
console.log(gdr);
if($(this).scrollTop() > (hdr*.85) && windowPosY < (hdr+(gdr)))
{
mn.addClass(mns);
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Design<br><i class='fa fa-chevron-down'>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() < (hdr*.85) && windowPosY ){
mn.removeClass(mns);
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up hideicon'></i><br>Richard<br>Yee<br><i class='fa fa-chevron-down'>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() > (hdr+(gdr)) && windowPosY < (hdr+gdr+pdr)){
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Painting?<br><i class='fa fa-chevron-down'>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
if($(this).scrollTop() > (hdr+gdr+pdr) && windowPosY < (hdr+(gdr)+pdr+sdr)){
$( ".iconcontainer li a" ).html( "<i class='fa fa-chevron-up'></i><br>Sound<br><i class='fa fa-chevron-down hideicon'>" );
$( ".iconcontainer li a" ).css( "font-size", "10px" );
}
});
}
在div中的所有图像加载后,有没有办法延迟/获取高度变量?我已经尝试了很多我在Stack上看过的方法,但我想我无法正确实现它们。我不确定我的其他凌乱的JS是否也会影响它,使用Masonry来获取网格图像。以下是代码的其余部分:https://github.com/yeemachine/yeemachine/blob/gh-pages/index.html
谢谢!
答案 0 :(得分:1)
你可能试图在可用之前读取一个dom元素,导致有时候工作的竞争条件,有时候不会。
你可以简单地延迟并调用相同的方法来推迟执行直到dom元素存在。
var $pdr = $('.class2');
if ($pdr.length == 0)
return window.setTimeout(arguments.callee, 10);
var pdr = $pdr.height();
答案 1 :(得分:1)
您可能是竞争条件的受害者。即,有时砌体js会在代码运行之前完成大小调整,有时则不会。
除非绝对必要,否则不要通过添加延迟解决此问题。 添加延迟并不能解决问题:它只会降低发生的可能性。相反,在砌体告诉你它完成后运行你的代码。
看起来砌石js有一些events that you can hook into。
我会看到在layoutComplete
事件中运行代码是否能解决您的问题。例如:
// jQuery
var $grid = $('.grid').masonry({...});
function onLayout() {
/* YOUR CODE HERE */
}
// bind event listener
$grid.on( 'layoutComplete', onLayout );