2016-08-03 15 views
0

この例では、サイズ変更時にdivの束の幅を計算する方法を知る必要があります。リサイズ時に複数のdivの幅を計算する最適な方法は何ですか?

私はこれを可能な限り絶対に実行したいと思います。 1つのページでわずか10 divから10,000 divまでの極端な例のように思えます。ここで

が問題のjQueryのでは基本的な例です:

$justABunchOfParentDivs = $('.class-matching-500-elements-on-a-page'); 
$(window).resize(function() { 

    $justABunchOfParentDivs.each(function() { 
     $(this).attr('data-width', $(this).width()); 
    }); 

}); 

私はjQueryのソリューションを必要とするだけでなく、超高速です非jQueryのソリューションを参照してくださいしたいと思います。あなたはこのようなwindow.requestAnimationFrameを使用することができます少しパフォーマンスを向上させるために

+1

ここでは何も計算していませんが、達成しようとしているのは何ですか?なぜここで「パフォーマンス」が問題になるのですか?実際に問題がありますか? – Amit

+0

例のようにデータ属性を幅で更新する必要があります。ページに10,000要素がある場合は、JSでより良い方法があるかどうかを知りたいと思います。私の恐怖は、上記の解決策は、大量の要素で遅くなることです – envysea

+0

あなたができることは、イベントハンドラを絞ることです。 10000要素の各サイズ変更イベントでそのコードスニペットを実行すると、ブラウザがクラッシュする可能性があります。 'resize'と' scroll'は2つの野生の馬です。 – undefined

答えて

3

$(window).resize(function() { 
    window.requestAnimationFrame(function() { 
    $justABunchOfParentDivs.each(function() { 
      $(this).attr('data-width', $(this).width()); 
    }); 
    }); 
}); 

これは、ブラウザが(FPSのためのより良い)ことを望んでいる場合にのみ、あなたのコードを発射します。 はまた、あなたが標準のAPIを使用してそれを実行するかどうか、それは同様にパフォーマンスが向上します。

$justABunchOfParentDivs = document.querySelectorAll('.class-matching-500-elements-on-a-page'); 

window.onresize = function() { 
    window.requestAnimationFrame(function() { 
    Array.prototype.forEach.call($justABunchOfParentDivs, function(element) { 
      element.setAttribute('data-width', element.offsetWidth); 
    }); 
    }); 
}; 
+1

良い提案。あなたは 'call'関数を見逃しています。また、 'Array.prototype.forEach.call'を使うと' [] .forEach.call'よりも少し速くなります。 'forEach'は、外側スコープのプロトタイプから切り離し、' call'メソッドを使って呼び出すこともできます。 – undefined

+0

投稿したことはありますか? – envysea

+1

@Vohuman参考にしていただきありがとうございます – Max

0

を最大の答えにデバウンスを追加しました。生のJavaScript:

var query = document.querySelectorAll('.class-goes-here'), 
    delay = 250, 
    timeout = false; 

window.addEventListener('resize', function() { 
    clearTimeout(timeout); 
    timeout = setTimeout(function() { 
     window.requestAnimationFrame(function() { 
      Array.prototype.forEach.call(query, function(element) { 
        element.setAttribute('data-width', element.offsetWidth); 
      }); 
     }); 
    }, delay); 
}); 
関連する問題