2010-12-31 9 views
4

Diese Funktion wurde von der Website angepasst: http://eriwen.com/javascript/measure-ems-for-layout/Warum ist diese JavaScript-Funktion bei Firefox so langsam?

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

ich diese Funktion als Teil einer anderen Funktion auf window.resize leite, und es verursacht Leistungsprobleme auf Firefox 3.6, die auf aktuelle Safari nicht existieren oder Chrom. Der Profiler von Firefox sagt, dass ich die meiste Zeit in dieser Funktion verbringe, und ich bin neugierig, warum das so ist.

Gibt es eine Möglichkeit, die Größe von em in Javascript zu erhalten, ohne all diese Arbeit zu tun? Ich möchte die Größe auf Größe neu berechnen, wenn der Benutzer es geändert hat.

+0

können Sie uns zeigen, wie diese Funktion in der anderen Funktion auf window.resize verwendet wird? – mauris

+0

@thepphdeveloper Ich könnte, aber ich denke, es ist überflüssig. Die Funktion wird nur einmal in dieser Funktion aufgerufen und das Ergebnis wird zwischengespeichert. – macrael

+0

Firefox hat einen Profiler? Ist es integriert oder sprichst du von JavaScript Debugger (Venkman)? – MatrixFrog

Antwort

8

Scheint, wie die Funktion nur

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

Mit anderen Worten könnte, können Sie einfach Ermitteln Sie die berechnete Schriftgröße des Elements, anstatt ein div zu erstellen und zu skalieren.

+0

Danke für deine Antwort, David. Ich schrieb die ursprüngliche Funktion im Jahr 2008, als wir Safari 2 noch unterstützen mussten (ohne * getComputedStyle() *). Ich vermute, dass die beste Antwort eigentlich deine Antwort mit der Caching-Idee ist. Ich habe meinen Blogbeitrag entsprechend aktualisiert. –

+0

Ich mag das. Der einzige seltsame Fehler, den ich getroffen habe, ist Chrome. Da diese Funktion bei der Größenanpassung aufgerufen wird, protokolliert Chrome einige Fehler in der Konsole, die den Eindruck erwecken, als würden zwei Kopien der Funktion gleichzeitig ausgeführt, wobei einige Daten ausgelassen werden. – macrael

+1

Übrigens könnte der resultierende Pixelwert ein Fließkomma sein, also sollte der reguläre Ausdruck etwa wie folgt aussehen: '/ (\ d + (\. \ D *)?) Px /'. – mgiuffrida

2

Versuchen Sie dies (es ist die gleiche Funktion mit dem Wert gebunkert, so dass es nur einmal ausgeführt wird):

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); 
    }; 
};