首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更可靠地从动态变化的元素中获取变量?

如何更可靠地从动态变化的元素中获取变量?
EN

Stack Overflow用户
提问于 2016-06-29 00:10:38
回答 2查看 73关注 0票数 2

我仍然是一个编写代码的新手,因此我对这个我似乎无法修复的bug陷入了停滞。我正在我的个人网站http://yeemachine.com上工作,它有一个粘稠的肚脐,当达到滚动顶函数中的某个阈值时,它会改变它的"html内容“。

这就是我用来加载初始函数的方法。当它试图加载var=pdr或.class2的高度时,bug就会出现。.class2是一个div,包含使用Masonry.js设置的图像。有时是命中或失误。大多数情况下,在第一次加载时,它给出高度的div作为2000+ px,这将是高度,如果所有的图像是堆叠在一起的。

代码语言:javascript
复制
    $(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" );

            }
        });

除了这个初始加载函数之外,我还有一个调整大小的函数,每次调整窗口大小时都会解决这个问题。

代码语言:javascript
复制
    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是否也在影响它,使用砖石来获取网格图像。下面是剩下的代码:https://github.com/yeemachine/yeemachine/blob/gh-pages/index.html

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 00:42:55

你很可能是种族状况的牺牲品。也就是说,有时砖石js会在代码运行之前完成大小调整,而其他时候则不会。

除非绝对必要,否则不会通过添加延迟来解决这个问题。添加延迟并不能解决问题:它只会降低发生的可能性。相反,您的代码运行后,砖石告诉您它已经完成。

它看起来像砖石js有一些您可以链接到的事件

我想看看在layoutComplete事件中运行您的代码是否解决了您的问题。例如,类似于:

代码语言:javascript
复制
// jQuery
var $grid = $('.grid').masonry({...});

function onLayout() {
  /* YOUR CODE HERE */
}
// bind event listener
$grid.on( 'layoutComplete', onLayout );
票数 1
EN

Stack Overflow用户

发布于 2016-06-29 00:31:10

您可能试图在dom元素可用之前读取它,这会导致有时工作有时不工作的争用条件。

您可以简单地延迟和回忆相同的方法来推迟执行,直到dom元素出现。

代码语言:javascript
复制
var $pdr = $('.class2');
if ($pdr.length == 0)
    return window.setTimeout(arguments.callee, 10);

var pdr = $pdr.height();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38088253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档