読了: 約 4 分
現在関わっているサービスで、Infinite ScrollとInfinite Scrollのリスト内に含まれるバナーの計測を行うという機能実装する中で、画面内に入った特定Classが付与されているものをscroll時に監視してトラッキングする際のメモ。
Infinite Scroll
シングルページアプリケーションが台頭し、今となっては昔ながらのページングに変わり新しいページング機能として使われているインフィニティスクロール。サービスによっても実装方法は異なるかと思いますが、ここで今一度実装方法を検討してみたい。
jQueryのプラグインでもありますが、大体独自実装している企業やサービスが多いかと思います。
autoLoad等ともの呼ばれるのでPHP等で検索すると結構情報が出て来ます。
https://github.com/infinite-scroll/infinite-scroll
自分たちのサービスでは独自実装しているのですが、リストの個数(表示したい一つのブロック)に応じて、
またはその中の画像等の要素に応じてユーザビリティを考慮した設計にする必要があります。
そういった状況を加味した上で最適なコードとは何かを考えている次第。
◆引数にデータを渡して、render関数を実行するケース
画面の高さを取得して、その高さからbodyの高さを引き、画面のどこ迄スクロールしているかを割って、
の値が0.6より上なら実行というロジック。
var autoload = function(data) {
var window_height = $(window).innerHeight(),
num = 0.6,
checkPosition = function() {
var $body = $('body');
if ($(window).scrollTop() / ($body.height() - window_height) > num) {
$(window).off('scroll', checkPosition);
render(data);
}
}
$(window).on('scroll', checkPosition);
};
もしくは、下記で紹介するjQuery.inviewプラグインを利用して、最後のリストが読み込まれた時に、renderするもの。
取得・読み込むリストの個数によって、異なるかと思いますが、li:eq(-5)とか定数にするのが微妙なので、どうすれば良いものか。
// インフィニティスクロール
var autoload = function(data){
$('#target').find('li:last').one('inview', function(event, isInView, visiblePartX, visiblePartY) {
if(isInView) render(data);
});
};
これに加えて、renderされるリストの中に含まれる特定classを監視して、
トラッキングを実行するという実装。
対象がスクロールして画面内に入って来た時に実行するjQueryプラグインのinview
非常に便利で助かっています。上記のようにinfiniteScrollのように使用する事も出来れば、色々な用途があると思います。
複数の対象を監視して、oneメソッドで一回だけイベントを登録。
autoloadでテンプレートがappendされる度に下記のappAnalyticsメソッドを実行する形。
function appAnalytics(){
// Dependency jquery.inview.js (https://github.com/protonet/jquery.inview)
var $appElm = $('.js-app');
$appElm.each(function() {
$(this).one('inview', function(event, isInView, visiblePartX, visiblePartY) {
var key = '',
index = 0,
data = {};
key = $(this).find('.js-ad').data('toAppKey');
index = $appElm.has('[data-to-app-key="'+key+'"]').index(this);
data = {
action: 'view',
option: trackOptions[key][index]
};
if(visiblePartY === 'both') tracking(data);
});
});
}
appendされたらAnalytics実行でえーやんという話なのですが、バナーが見られた時のみ取得したいようで。
実際広告主からしたらimp計測されていた場合マジないわーって思うので、必要ですね。