m2

Togetter を下までスクロールすると重くなっていたので Lazy Load Plugin for jQuery にパッチを書いた

https://github.com/miya2000/jquery_lazyload/commit/a739355d631209f0e482f7523dbc436aac05dba4

Togetter でとトギャられたページを下までスクロールすると重くなっているのを確認しました。たしか Chrome, Firefox だとそれほどでもなかった気がしますが、Opera, ie では顕著です。

何が起こっているのかといいますと、Togetter では Lazy Load Plugin for jQuery を使って画像の遅延ロードを行っているのですが、

この「原発」・「被災」等の注目のキーワードの下にけっこうな数の画像(はてブ数、Twitterアイコン)があるのですね。これが LazyLoad できずにスクロールイベント毎に、残りの画像すべて(100個くらい)をループで回していました。スクロールイベントはホイール1回で3回くらい発生しますので、これまたけっこうな数です。

	var counter = 0;
	elements.each(function() {
	    if ($.abovethetop(this, settings) ||
	        $.leftofbegin(this, settings)) {
	            /* Nothing. */
	    } else if (!$.belowthefold(this, settings) &&
	        !$.rightoffold(this, settings)) {
	            $(this).trigger("appear");
	    } else {
	        if (counter++ > settings.failurelimit) {
	            return false;
	        }
	    }
	});

非表示の画像は最初の if ブロックに入りますので、$.abovethetop がぼちぼち重たいということになります。
これを避けるため、、ループの先頭で非表示の画像は読み飛ばすコードを追加しました。

一番下までスクロールしないと再現しないのは、それまでは最後の else に入って、途中でループを終えていたからです*1

  • -

Lazy Load Plugin for jQuery は

Lazy Load is currently not usable. It does not work with the latest browsers as expected. I have currently no time updating the code myself.

http://www.appelsiini.net/projects/lazyload

とご本人がおっしゃっているように、今後積極的にアップデートされることは無いと思われます。
実装をみるとまだまだ改善できるところはあると思いますので、どなたか挑戦してみるとよいのではないでしょうか。

  • -

Togetter さんでは、上のパッチを適用するのもいいですが、そもそも該当部分の LazyLoad は不要だと思うので、外してもらうのがいいのではないかと思います。

  • -

Togetter の application.js は minify されていたのですが、id:os0x が紹介してくれていた Chrome の Developer Tools を使うことで難なくデバッグすることが出来ました。Opera でもできるといいですね。

  • -

Opera でページ側のスクリプトをハックする時は、こんな user.js を書いて、ページ側のスクリプトを上書きしています。

// ==UserScript==
// @include http://togetter.com/li/*
// ==/UserScript==
(function(){
    opera.addEventListener('AfterScript', function(e) {
        var script = e.element;
        if (script.src && /application\.js/.test(script.src)) {
            _ll(jQuery);
        }
    }, false);

    function _ll($) {
        ...

*1:画像を上から走査していき、表示領域より下に位置する画像が settings.failurelimit 個(2個)見つかったらループを終える、という実装です