2009-11-30 4 views
19

У меня есть динамический текст, содержащийся в div, который настроен на то, что пользователь вводит в поле текстового поля. Если текст не вписывается в div, теперь он просто обрезается по краю, и весь текст, который проходит мимо границы, не отображается. Я хотел бы обрезать текст так, чтобы он помещался внутри коробки и имел в конце многоточие (...). Например:Как я могу имитировать переполнение текста: многоточие в Firefox?

|----div width------| 
Here is some sample text that is too long. 
Here is some sam... 

Очевидно, что в данном примере это легко, так как код тег использует фиксированную ширину шрифта, так что это так же просто, как подсчет символов. У меня шрифт переменной ширины, поэтому, если они войдут в «WWWWWWWWWWW», он заполнит намного меньше символов, чем «................».

Каков наилучший способ для этого? Я нашел потенциальное решение для простого поиска фактической ширины пикселя текста здесь: http://www.codingforums.com/archive/index.php/t-100367.html

Но даже с помощью такого метода немного сложнее реализовать многоточие. Так что, если это 20 символов, и я считаю, что он не подходит, мне придется обрезать до 19, добавить многоточие, а затем проверить, подходит ли он снова. Затем усечь до 18 (плюс многоточие) и повторите попытку. И опять. И снова ... пока это не подойдет. Есть ли способ лучше?

EDIT: Я решил на основании ответов, что мой первоначальный подход является лучшим, за исключением того, что я попытался улучшить решение по ссылке выше, не создавая отдельный элемент td, просто для измерения, который кажется взломанным.

Вот мой код:

<div id="tab" class="tab"> 
    <div id="tabTitle" class="tabTitle"> 
     <div class="line1">user-supplied text will be put here</div> 
     <div class="line2">more user-supplied text will be put here</div> 
    </div> 
</div> 

и стили:

.tab { 
padding: 10px 5px 0px 10px; 
margin-right: 1px; 
float: left; 
width: 136px; 
height: 49px; 
background-image: url(../images/example.gif); 
background-position: left top; 
background-repeat: no-repeat; 
}  

.tab .tabTitle { 
    height: 30px; 
width: 122px; 
    overflow: hidden; 
    text-overflow: ellipsis; 
font-size: 12px; 
font-weight: bold; 
color: #8B8B8B; 
} 

.tab .tabTitle .line1, .tab .tabTitle .line2 { 
    display:inline; 
    width:auto; 
} 

и Javascript, что наличники и добавляет многоточие:

function addOverflowEllipsis(containerElement, maxWidth) 
{ 
    var contents = containerElement.innerHTML; 
    var pixelWidth = containerElement.offsetWidth; 
    if(pixelWidth > maxWidth) 
    { 
     contents = contents + "…"; // ellipsis character, not "..." but "…" 
    } 
    while(pixelWidth > maxWidth) 
    { 
     contents = contents.substring(0,(contents.length - 2)) + "…"; 
     containerElement.innerHTML = contents; 
     pixelWidth = containerElement.offsetWidth; 
    } 
} 

В "line1" и «line2 «divs передаются функции. Он работает в случае ввода одного слова как «WWWWWWWWWWWWWWWWWW», но не работает многословный ввод «WWWWW WWWWW WWWWW», потому что он просто добавляет разрывы строк и измеряет текст как ширину «WWWWW».

Есть ли способ исправить это, не прибегая к копированию текста в скрытый измерительный элемент? Какой-то способ установить стиль разделителей строк так, чтобы они не обтекали текст?

+1

Это теперь поддерживается изначально в Firefox 7! –

ответ

11

каким-то образом установить стиль дивы линии так, чтобы они не зацикливаются текст?

У вас есть white-space: nowrap для. Да, это работает и в древних браузерах.

+0

Спасибо, я думаю, что это будет отлично работать. Для бонусных очков, диагностируйте, почему на другой день Я проверил это, используя фактический символ с многоточием (...), но сегодня его тестирование отображается как неизвестный знак вопроса. –

+1

Ваш неправильное кодирование ответа. Проверьте заголовки и метатеги. Это должно быть 'UTF-8'. – BalusC

0

Попробуйте это:

Link One

Update:

Если вы используете фирменную {перенос слов: брейк-слова;}, IE заставит разрыв строки. Современные браузеры могут иметь значение по умолчанию {overflow: visible;}, и они будут переполняться должным образом, не расширяя контейнер.

1

Совершенно просто, нет, нет лучшего способа, не прибегая к хакам.

Вы можете, например, использовать позицию: абсолютный диапазон для размещения вашего «...» поверх фактического содержимого с переполнением: скрытый набор в контейнере и только скрыть дополнительный интервал, если содержимое подходит в контейнере. Это позволит вам запускать код усечения только один раз.

Лично я просто запустил вычисление ширины пикселя несколько раз.Установка текста и чтение ширины - это быстрая операция, поэтому она не должна быть заметной.

4

Если вы используете jQuery, есть great plugin, который я использую.

В качестве альтернативы, [этот пример] (404 NOT FOUND!), Похоже, работает в перекрестном браузере.

Любые вопросы, попали мне в комментарии!

404 ссылка: http://www.hedgerwow.com/360/dhtml/text_overflow/demo2.php

+0

Я не использую jQuery, так что это не может мне помочь. Пример, который вы опубликовали, в порядке, но несколько глючный, и он ставит эллипсис выше, где он должен, и выглядит не очень хорошо. Я застрял в своем оригинальном решении (сохраните текст в расширяемом контейнере и измерьте его ширину, итеративно отрежьте символы до тех пор, пока он не подходит). Это работает для одной длинной строки, но если текст содержит пробелы, текст просто обертывается. Мне нужно, чтобы текст был одной строкой, независимо от того, сколько времени она или что она содержит. –

+0

Вы должны захватить копию jQuery. Вероятно, это самый простой способ решить эту проблему, и вы обязательно найдете приложение для него в другом месте вашего развития. – Gausie

+1

Как корпоративный гудок, получивший одобрение для jQuery, является монументальной задачей, поэтому, к сожалению, я все еще ищу альтернативы без jQuery. –

0

Нет, это не простая задача. Я должен был сделать то же самое год назад и обнаружил, что даже Internet Explorer (с версии 6), Opera и Safari могут это сделать, но не Firefox. Извините, только хаки могут сэкономить вам

3

Новая версия CSS (CSS3) должна содержать text-overflow:ellipsis, что делает это за вас. В настоящее время он работает в версиях IE версии 6 и выше, а также в Safari и Chrome. Это не поддерживается Firefox, так что пока это не очень полезный ответ, но стоит иметь в виду, что самым лучшим способом, в конечном счете, станет позволить CSS справиться с этим.

CSS3 проект спецификации: http://www.w3.org/TR/2001/WD-css3-text-20010517/#text-overflow-props

Поддерживаемые браузеры: http://www.quirksmode.org/css/contents.html (прокрутите вниз до "текст-перелива" в нижней части)

+1

Конечно, мне все еще нужно поддерживать IE6, чтобы «со временем», вероятно, через 20 лет :( –

+2

На самом деле (и несколько удивительно) IE6 уже имел функцию переполнения текста: эллипсис, поэтому вы в порядке. –

+1

Изменено мое сообщение, чтобы указать, какие браузеры в настоящее время поддерживаются: IE6 и выше, Safari, Chrome. –

1

Использование text-overflow:ellipsis. Это не IE-только ... Большинство основных браузеров могут это сделать.
Но если вы не можете here is a jQuery plugin для этого.

0

попробовать dojox.html.ellipsis

+0

спасибо, Я дам ему шанс ... в отличие от jQuery, dojo - это библиотека, которую мы используем уже, так что это может быть идеально. –

1

Чтобы ответить только один из пунктов вы поднимаете:

Так что, если это 20 символов, и я нахожу , что он не подходит, я бы усечения до 19, добавить многоточие, и затем проверьте, подходит ли он снова. Затем усечь до 18 (плюс многоточие) и повторите попытку. И опять. И еще ... пока он не подойдет. Есть ли способ ?

Более быстрый способ нахождения правильной длины состоит в том, чтобы вырезать строку пополам, проверить это, чтобы увидеть, подходит ли она. Если это так: добавьте четверть первоначальной длины назад, и если она не выйдет на четверть, проверьте ее, чтобы она соответствовала. Повторите рекурсивно с 1/8th, 1/16th, 1/32th, ... от первоначальной длины, пока это значение добавления/вычитания не станет меньше.

Это алгоритм поиска: для строк, которые длиннее, чем просто несколько слов вы обычно можете сократить количество тестов, которые необходимо выполнить в DOM, в 10 раз.

5

Эта проблема также должна работать на Firefox.

HTML

<div class="ellipsis">Here goes too long text and when it is takes more than 200px in "end" of the text appears "..."</div> 

CSS

.ellipsis{ 
width:200px; 
text-overflow:ellipsis; 
-o-text-overflow:ellipsis; 
-moz-binding:url('bindings.xml#ellipsis');//issue for Firefox 
} 

bindings.xml

<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 
<binding id="none"> 
    <content><children/></content> 
</binding> 
<binding id="ellipsis"> 
    <content> 
     <xul:label crop="end"><children/></xul:label> 
    </content> 
    <implementation> 
     <field name="label">document.getAnonymousNodes(this)[0]</field> 
     <field name="style">this.label.style</field> 
     <property name="display"> 
      <getter>this.style.display</getter> 
      <setter>if(this.style.display!= val)this.style.display=val</setter> 
     </property> 
     <property name="value"> 
      <getter>this.label.value</getter> 
      <setter>if(this.label.value!=val)this.label.value=val</setter> 
     </property> 
     <method name="update"> 
      <body> 
       var strings= this.textContent.split(/\s+/g) 
       if(!strings[0])strings.shift() 
       if(!strings[strings.length-1])strings.pop() 
       this.value=strings.join('') 
       this.display=strings.length?'':'none' 
      </body> 
     </method> 
     <constructor>this.update()</constructor> 
    </implementation> 
    <handlers> 
     <handler event="DOMSubtreeModified">this.update()</handler> 
    </handlers> 
</binding> 
</bindings> 
+0

Означает ли это какие-либо проблемы с производительностью? Есть ли какой-либо тест, использующий этот хак? – jayarjo

+0

К сожалению, текст с использованием этой привязки xml-объекта Firefox не поддается выбору. – timmfin

+0

Это не работает в Firefox 4. – Ms2ger

0

Я изменил this.value=strings.join('') на this.value=strings.join(' ') от Ответ Binyamin, и это сработало для меня хорошо!

0

О Firefox 4.0 и, до сих пор нереализованных, text-overflow:ellipsis CSS собственности:

This ссылка дает частичное решение проблемы.

Он производит аналогичный результат до text-overflow:ellipsis, используя только css.