2016-11-28 15 views
1

私はアプリケーション内でgetBoundingClientRect()を使用して、ユーザーが項目をドラッグしている間に要素の寸法を取得しています。私はこれを使用してきており、うまくいきました。しかし、この計算がマウスの移動中に実行されている間は、大きなパフォーマンス上の問題が発生し始めています。それはノードが移動しているほど大きなものになることはさらに悪化します。私はChromeでプロファイリングツールを使用しました。ユーザーがドラッグしている間にマウスの移動イベントにラップされているこの関数は、長い時間がかかっています(呼び出しごとに31.4ms ---毎回呼び出されるマウスを動かす時間)問題を研究している間に、私はそれを使用した他の人たちと出会い、パフォーマンスの問題にも気づいた(http://dcousineau.com/blog/2013/09/03/high-performance-js-tip/)。vanilla JSの代わりにelement.getBoundingClientRect()

バニラJavascriptでのgetBoundingClientRect()の代替手段は何ですか(jQueryは絶対にありません)。私のフロントエンドのフレームワークはAngularJS 1.5.8です。コンポーネントを使用してアプリケーションを構築しました(大型のアプリケーションを将来NG2に移行することを目指しています)。ありがとう!

+0

、最初のクリックですべてのマウスの動きでそれを再計算する必要が要素の初期位置を取得していません –

+0

遊びに最小限のコードを投稿できますか? –

+2

カールが答えて言ったように、「より多くの」バニラは得られません。確かに、値の一部しか必要ない場合は、それらを保持する個々のプロパティを要求することができますが、それははるかに高速になることはありません。したがって、パフォーマンスを向上させる唯一の方法は、値のクエリ頻度を減らすことです。デバウンス/スロットルを調べます。 https://css-tricks.com/the-difference-between-throttling-and-debouncing/、https://css-tricks.com/debouncing-throttling-explained-examples/ – CBroe

答えて

2

Element.getBoundingClientRect()は、仕様のworking draftの一部ですが、「バニラ」です。コードをより効率的にするには、呼び出し回数を制限します。同じようなパフォーマンスに言及したリンクでは、次のように言います。

DOMから計算されたディメンションを取得するためのすべての呼び出しは、キャッシュまたは回避する必要があります。

+0

右。だから私の質問は、 "代わりのものは何ですか(代替がありますか?"とgetBoundingClientRect()を使うことです)。私はそれがバニラだと理解しています、私の質問は "バニラの代替品は何ですか?"です。私が見ている記事の重要な見積もりは、「問題はWebKitがgetBoundingClientRectに似た何かを使用するたびにdomのレイアウトを再計算するのが好きなのです」だから、getBoundingClientRectが提供するデータをgettinしながらWebKitにdomのレイアウトを再計算させないようにするにはどうすればいいですか? – JRAnderson

+0

'getBoundingClientRect()'を使うことができます。いくつかのサンプルコードを提供できれば、お客様の特定のパフォーマンス上の問題をお手伝いすることができます。 –

0

!!ソリューションに従うことを変換CSS3スケールとの組み合わせで動作しますが、それは代替だしません:

function getPosition(elm) { 
    var xPos = 0, yPos = 0; 

    while(elm) { 
    xPos += (elm.offsetLeft - elm.scrollLeft + elm.clientLeft); 
    yPos += (elm.offsetTop - elm.scrollTop + elm.clientTop); 
    elm = elm.offsetParent; 
    } 

    return { x: xPos, y: yPos }; 
} 

Source

+1

CSS3スケール変換がある場合、これは機能しません。 –

+0

@QuentinEnglesありがとう、私の答えを – tdhulster

+0

私はgetBoundingClientRectにフォールバックする方法を探していますが、要素が変換されているかどうかを確認するうまく実行する簡単な方法はありません。 getComputedStyleがありますが、これはgetBoundingClientRectと同じように遅い(おそらく遅い)ことがあります。 'element.transformed'プロパティなどが必要です。 –

関連する問題