Mesurer la zone de contournement du nœud de texte en Javascript

J'ai du mal à obtenir la taille, en pixels, d'un nœud de texte utilisant Javascript. Exemple:

 <P>
   Premier bloc de texte
   <B> deuxième bloc de texte </ b>
 </ P>

J'ai besoin d'obtenir la zone de délimitation des deux blocs de texte indépendamment. Je pourrais obtenir la taille du deuxième bloc simplement en mesurant l'élément <b>, mais le premier m'échappe. Il ne semble pas que les nœuds de texte de Javascript aient une hauteur ou une largeur, pour autant que je puisse le dire.

Enrouler le premier bloc de texte dans un <span> et mesurer ce n'est pas une option, car j'ai découvert qu'une portée n'héritent pas nécessairement de tous les styles ci-dessus, et quand j'enveloppe le texte, il change soudain de taille. C'est comme le principe d'incertitude de Heisenberg de Javascript; Ma tentative de mesurer quelque chose l'modifie.

Je crée une application qui brise HTML en pages (EPUB HTML, en fait), et j'ai besoin de connaître la position, la hauteur et la largeur de chaque bloc de texte sur la page afin que je puisse savoir s'il faut le placer sur cette page ou La page suivante.

Aucune suggestion?

Vous pouvez le faire avec une Range qui prend en charge les extensions CSSOM View , qui sont les navigateurs les plus récents (Firefox 4+, WebKit depuis début 2009, Opera 11, peut-être plus tôt) et un TextRange dans IE. Le code TextRange est fastidieux, donc je l'ai omis ici.

JsFiddle: http://jsfiddle.net/gdn6C/1/

Code:

 function getTextNodeHeight(textNode) { var height = 0; if (document.createRange) { var range = document.createRange(); range.selectNodeContents(textNode); if (range.getBoundingClientRect) { var rect = range.getBoundingClientRect(); if (rect) { height = rect.bottom - rect.top; } } } return height; } 

Essayez de créer les éléments que vous souhaitez mesurer en ligne. Les éléments en ligne ne prennent que l'espace requis. Ainsi, il a une largeur et une hauteur absolue qui peuvent être récupérées par javascript. Les éléments de blocs complètent toute la largeur de l'élément contenant. Ainsi, javascript ne peut pas accéder à sa largeur.