2016-09-28 8 views
0

スクロール中に要素にクラスが追加されているかどうかを確認し、次の要素にが追加されるまでを1回だけ起動します。クラスが可視要素に追加されている場合は、一度起動関数

ここに私の第一の機能:

function onScreen() { 

    $('article').each(function() { 

     var thisTop = $(this).offset().top - $(window).scrollTop(); 
     var middleScreen = $(window).height()/2; 

     if (thisTop < middleScreen && (thisTop + $(this).height()) > middleScreen) { 
      $(this).addClass('visible'); 
     } else { 
      $(this).removeClass('visible'); 
     } 
    }); 
} 

// launch 
$(window).on('load scroll', onScreen); 

マイseconde機能:私は一度だけvisibleクラスが別のarticleに追加された場合に起動したいと思います。

function textChange() { 

    var v = $('article.visible'); 
    var el = $('.el', v); 
    var text = $(el).html(); 
    $('.titre').html(text); 

} 

$(window).on('load scroll', textChange); 

注:2つの別々の機能を維持することが重要です。 私の問題はスクロール機能です。textChange()各ピクセルをページ上でスクロールします。奇妙なことに、onScreen()関数は、次のarticleが表示されるまで、visibleクラスを1回追加します。

ありがとうございました。

+0

:別の方法としては、関数が呼び出される前にチェックを行うことができます'$(this).addClass( 'visible');'?の後に 'textChange'を呼び出します。 –

+0

'onScreen()'関数を分離したいので、編集関数を終了してください。とにかく、問題はまだ同じです。 – BrownBe

+0

私はあなたがページ上に目に見える記事を1つだけ持っていると仮定します。 –

答えて

0

機能が実行されたかどうかを示しますグローバル変数を導入:関数が初めて呼び出されたとき

var textChanged = false; 

あなたtextChangeで()関数がtrueに設定します。

function textChange() { 
    if(!textChanged){ 
     textChanged = true; 
     var v = $('article.visible'); 
     var el = $('.el', v); 
     var text = $(el).html(); 
     $('.titre').html(text); 
    } 
} 

EDIT:なぜあなたはしないでください

if (thisTop < middleScreen && (thisTop + $(this).height()) > middleScreen) { 
    $(this).addClass('visible'); 
    if(!textChanged){ 
     textChange(); 
    } 
} else { 
    $(this).removeClass('visible'); 
} 
+0

フラグソリューションの問題は ' textChange() 'はブロックされます。 **次の記事が 'visible'クラスを取得するまで関数ブロック**を望みます。 – BrownBe

関連する問題