2016-08-18 20 views
0

jQueryを使用してスティッキーサイドバーのスニペットを作成しようとしています。何らかの理由で、.scroll()の内部の関数は、すべてのスクロールイベントで実行されるのではなく、1回だけ実行されます。私は何が間違っていますか?.scroll()は1回だけ実行されています

var sticky = $('#sticky'); 
var staticSticky = $(sticky).offset().top; 

$(window).scroll(moveEl(sticky, staticSticky)); 

function moveEl(element, staticElToTop){ 
    if($(window).scrollTop() >= staticElToTop){ 
     $(element).css('top', $(window).scrollTop() + 'px'); 
    } 
} 

は全体の試みは、ここを参照してください:http://codepen.io/ExcellentSP/pen/GqZwVG

上記のコードが完全に機能していません。私は、スクロールイベントを正常に動作させてから、続行しています。説明

var sticky = $('#sticky'); 
var staticSticky = $(sticky).offset().top; 

$(window).scroll(moveEl(sticky, staticSticky)); 

function moveEl(element, staticElToTop) { 
    return function() { 
    if($(window).scrollTop() >= staticElToTop){ 
     $(element).css('top', $(window).scrollTop() + 'px'); 
    } 
    } 
} 

主な違いは、関数を呼び出すと、それことであるあなたは、このような関数へのあなたのごmoveEl方法($(window).scroll()のために返される)の内容をラップする必要が

答えて

1

既定ではundefinedが返され、$(window).scroll(undefined)に等しくなります。あなたが実際にそれを呼び出したので、あなたは一度だけ解雇されていることが分かります。

moveElメソッド内の関数を返すと、.scroll()はハンドラを取得するので、$(window).scroll(handler)になります。だから、期待どおりに動作します。

+0

違いを説明する参考資料はありますか?私はまだ図書館の理解を深めています。あなたの答えに含めてください。ドキュメンテーションは、 "イベントがトリガされるたびに実行する関数"というハンドラについてこれを示しています。 – ExcellentSP

+0

@Shaneは答えを –

0

$(window).scroll(moveEl(sticky、staticSticky));を実行すると、javascriptに関数の実行を依頼します。あなたはその参照を渡すことはありません。

$(window).scroll(function(){ 
    moveEl(sticky, staticSticky); 
}); 
+1

に更新しました。#Oleg Meleshkoのソリューションはよりエレガントです。しかし、なぜ同じですか。 –

関連する問題