2010-12-31 7 views
4

この機能は、Webサイトから適応されました:http://eriwen.com/javascript/measure-ems-for-layout/Firefoxでこのjavascript機能が遅いのはなぜですか?

function getEmSize(el) { 
    var tempDiv = document.createElement("div"); 
    tempDiv.style.height = "1em"; 
    el.appendChild(tempDiv); 
    var emSize = tempDiv.offsetHeight; 
    el.removeChild(tempDiv); 
    return emSize; 
} 

私はwindow.resize上の他の機能の一部として、この機能を実行していますし、それが現在のSafariや上に存在しないのFirefox 3.6でのパフォーマンスの問題を引き起こしていますクロム。 Firefoxのプロファイラは、私がこの機能で最も多くの時間を費やしていると言います。なぜそうなのか不思議です。

この作業をすべて実行せずにjavascriptでemサイズを取得する方法はありますか?私はユーザーがそれを変更したときにサイズを再計算したいと思います。

+0

この関数がwindow.resizeのほかの関数でどのように使われているかを教えてください。 – mauris

+0

@thephpdeveloper私はそれを行うことができますが、それは余計なことだと思います。関数はその関数で1回だけ呼び出され、結果はキャッシュされます。 – macrael

+0

Firefoxにプロファイラがありますか? JavaScript Debugger(Venkman)が組み込まれているのですか? – MatrixFrog

答えて

8

は、機能だけで言い換える

function getEmSize(el) { 
    return Number(getComputedStyle(el, "").fontSize.match(/(\d+)px/)[1]); 
} 

可能性のように、あなただけのことができますようですdivを作成してサイズを変更するのではなく、要素の計算されたフォントサイズを取得します。

+0

答えてくれてありがとう、David。私はSafari 2(* getComputedStyle()*を持たない)をサポートしなければならないときに、元の関数を2008年に書きました。私は最高の答えは実際にキャッシングのアイデアと答えていると思う。私はそれに応じて自分のブログの投稿を更新しました。 –

+0

私はこれが好きです。私がヒットした唯一の奇妙なバグはChromeです。サイズ変更時にこの関数を呼び出すので、Chromeはいくつかのエラーをコンソールに記録します。これにより、機能の2つのコピーが並行して実行されているように見えるようになります。 – macrael

+1

ちなみに、結果のピクセル値は浮動小数点である可能性があるので、正規表現は '/(\ d +(\。\ d *)?)px /'のようになります。 – mgiuffrida

2

は、(それが一度だけ実行されるように、隠し値と同じ機能です)、これを試してみてください:

var getEmSize = function() { 
    var underlyingFunction = function(el) { 
     var tempDiv = document.createElement("div"); 
     tempDiv.style.height = "1em"; 
     el.appendChild(tempDiv); 
     var emSize = tempDiv.offsetHeight; 
     el.removeChild(tempDiv); 
     underlyingFunction = function() { 
     return emSize; 
     }; 
     return emSize; 
    }; 
    return function(el) { 
     return underlyingFunction(el); 
    }; 
}; 
関連する問題