Подтвердить что ты не робот

Измените ограничительную рамку текста node в Javascript

У меня возникли проблемы с получением размера в пикселях текста node с помощью Javascript. Пример:

<p>
  first text block
  <b>second text block</b>
</p>

Мне нужно получить ограничительную рамку из двух текстовых блоков независимо. Я мог бы получить размер второго блока, просто измеряя элемент <b> , но первый ускользает от меня. Похоже, что текстовые индексы в Javascript имеют высоту или ширину, насколько я могу судить.

Обертка первого текстового блока в < span и измерение, которое не является опцией, потому что я обнаружил, что span не обязательно наследует все стили над ним, и когда я обертываю текст, он внезапно меняет размер. Это похоже на принцип неопределенности Гейзенберга Javascript; моя попытка измерить что-то меняет его.

Я создаю приложение, которое разбивает HTML на страницы (на самом деле, EPUB HTML), и мне нужно знать положение, высоту и ширину каждого блока текста на странице, чтобы я мог знать, этой страницы или следующей страницы.

Любые предложения?

4b9b3361

Ответ 1

Вы можете сделать это с помощью Range, который поддерживает CSSOM View extensions, который является последним браузером (Firefox 4+, WebKit с раннего времени 2009, Opera 11, возможно, раньше) и TextRange в IE. Код TextRange является утомительным, поэтому я опустил его здесь.

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

код:

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

Ответ 2

Попробуйте сделать элементы, которые вы хотите измерить в строке. Встроенные элементы занимают столько места, сколько требуется. Таким образом, он имеет абсолютную ширину и высоту, которые могут быть получены javascript. Элементы блока заполняют всю ширину содержащего элемента. Таким образом, javascript не может получить доступ к своей ширине.