Відображати лише 10 символів довгого рядка?


84

Як отримати довгий текстовий рядок (наприклад, рядок запиту) для відображення максимум 10 символів за допомогою JQuery?

Вибачте, хлопці, я новачок у JavaScript & JQuery: S
Будь-яка допомога буде вдячна.


Можете пояснити на прикладі?
Andy E

Це jquery, оскільки це рядок у елементі DOM?
sje397

1
@Gopi так, я маю на увазі еліпсайз Щоб пояснити ... Я працюю над системою інтрамережі, де користувачі можуть порушувати справи ... деякі користувачі додають наддовгий рядок запитів, який порушує макет таблиці при відображенні на домашній сторінці. Я хочу перехопити цей рядок запиту, перевіривши (за допомогою JQuery) наявність будь-чого, що має 10 символів плюс пробіли, і виділити його еліпсисом (наприклад, this = is-a-really-long & string ...) Будь ласка, дайте мені знати, якщо це має сенс. Подяка
Насір

1
Він працював тут Good Sucess!
Тран Ань Хієн,

браузери можуть автоматично додавати еліпсис до рядків, які порушують межі елемента (див. мою відповідь нижче)
Alnitak

Відповіді:


166

Якщо я правильно розумію, ви хочете обмежити рядок до 10 символів?

var str = 'Some very long string';
if(str.length > 10) str = str.substring(0,10);

Щось таке?


15
Оператор if тут необов’язковий. str.substring (0,10) на рядку, що має менше 10 символів, залишиться незмінним :)
Andy E

10
але оператор if можна використовувати для чогось типу: {var str = 'Якийсь дуже довгий рядок'; if (str.length> 10) str = str.substring (0,10) + "..."; }
Даніель Ведлунд

@Daniel: правда, потрібно було б додати еліпсис. На щастя, я вжив слово необов’язково :-)
Енді Е

4
@Daniel, "if (str.length> 10) str = str.substring (0,10) +" ... ";}" помилковий, оскільки рядок результатів має довжину 13, а не 10 !! правильно: "if (str.length> 10) str = str.substring (0,10-3) +" ... ";}"
Флойд

1
Ось тест ефективності для тих, хто піклується. Вони виконують майже однаково, якщо випадок, коли насправді потрібен підрядок, трапляється 50% часу.
Хуан Мендес,

22

І ось приклад jQuery:

Текстове поле HTML:

<input type="text" id="myTextfield" />

Код jQuery для обмеження його розміру:

var elem = $("#myTextfield");
if(elem) elem.val(elem.val().substr(0,10));

Як приклад, ви можете використовувати наведений вище код jQuery, щоб заборонити користувачеві вводити більше 10 символів під час набору тексту; наступний фрагмент коду робить саме це:

$(document).ready(function() {
    var elem = $("#myTextfield");
    if (elem) {
        elem.keydown(function() {
            if (elem.val().length > 10)
                elem.val(elem.val().substr(0, 10));
        });
    }            
});

Оновлення : Наведений фрагмент коду був використаний лише для демонстрації прикладу використання.

Наступний фрагмент коду вирішить проблему з елементом DIV:

$(document).ready(function() {
    var elem = $(".tasks-overflow");
    if(elem){
        if (elem.text().length > 10)
                elem.text(elem.text().substr(0,10))
    }
});

Зверніть увагу, що я використовую textзамість valцього, оскільки, valздається, метод не працює з елементом DIV.


Привіт Гіу, я не маю справу з текстом, коли він вводиться ... швидше, коли він відображається і порушує макет таблиці. Текст запиту відображається у DIV із назвою .tasks-overflow
Насір

@Nasir Дякую за підказку; Я оновив свою відповідь; це повинно допомогти вам вирішити вашу маленьку проблему
Джузеппе Аккапуто

Привіт Гіу, я спробував ваш код, і він не спрацював. Я хочу, щоб цей довгий рядок 'thisisoneloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongquerystring' відображався як 'thisisonelooo ...'
Насір

Ось як виглядає код: $ (document) .ready (function () {$ (".tasks-overflow: contains ('http: //')") .each (function () {var self = $ (this ), txt = self.text (); txt = txt.replace (/ (http [s] *: [\ / \] {2}) [^ \ s] * / g, '$ 1 ...'); self.text (txt);}); // код Giu var elem = $ (". tasks-overflow"); if (elem) {if (elem.val (). length> 10) elem.val (elem. val (). substr (0,10))}});
Насір

@Nasir Вибач; моя стара відповідь містила valметод, який, здається, не працює для елементів DIV. Я знову оновив свою відповідь, і тепер textметод використовується для зміни тексту, який повинен працювати бездоганно (перевірено локально, знову). Не могли б ви протестувати його ще раз за допомогою мого оновленого коду та повідомити мене?
Джузеппе Аккапуто

19

Створення власної відповіді, оскільки ніхто не вважав, що розколу може не статися (коротший текст). У цьому випадку ми не хочемо додавати '...' як суфікс.

Тернарний оператор це розбере:

var text = "blahalhahkanhklanlkanhlanlanhak";
var count = 35;

var result = text.slice(0, count) + (text.length > count ? "..." : "");

Можна закрити, щоб функціонувати:

function fn(text, count){
    return text.slice(0, count) + (text.length > count ? "..." : "");
}

console.log(fn("aognaglkanglnagln", 10));

І розширтесь до класу помічників, щоб Ви навіть могли вибрати, хочете крапки чи ні:

function fn(text, count, insertDots){
    return text.slice(0, count) + (((text.length > count) && insertDots) ? "..." : "");
}

console.log(fn("aognaglkanglnagln", 10, true));
console.log(fn("aognaglkanglnagln", 10, false));

18
var example = "I am too long string";
var result;

// Slice is JS function
result = example.slice(0, 10)+'...'; //if you need dots after the string you can add

Змінна результату містить "Я занадто л ..."



5

html

<p id='longText'>Some very very very very very very very very very very very long string</p>

javascript (на документі готовий)

var longText = $('#longText');
longText.text(longText.text().substr(0, 10));

Якщо у вас є кілька слів у тексті, і ви хочете, щоб кожне з них обмежувалось щонайбільше 10 символами, ви можете зробити:

var longText = $('#longText');
var text = longText.text();
var regex = /\w{11}\w*/, match;
while(match = regex.exec(text)) {
    text = text.replace(match[0], match[0].substr(0, 10));
}
longText.text(text);

2
.text () більше підходить, ніж .html (), коли йдеться лише про текст.
Andy E

Привіт, sje397, мені потрібно вміти ігнорувати інші слова до і після цього рядка (цей рядок є довгим рядком запиту і не має пробілів) дякую
Насір

@Nasir - ви можете змінити аргументи на substr ... або ви можете переглянути регулярні вирази.
sje397

4

Що ви також повинні зробити, якщо скоротити рядок до десяти символів, це додати фактичну суть еліпсів html: &hellip;замість трьох крапок.


3

Мені це більше схоже на те, що ти, мабуть, хочеш.

$(document).ready(function(){
var stringWithShorterURLs = getReplacementString($(".tasks-overflow").text());

function getReplacementString(str){
    return str.replace(/(https?\:\/\/[^\s]*)/gi,function(match){
        return match.substring(0,10) + "..."
    });
}});


ви надаєте йому свій елемент html у першому рядку, а потім він бере весь текст, замінює URL-адреси на 10 символьних версій і повертає вам. Це здається трохи дивним, щоб мати лише 3 символи url, тому я б рекомендував це, якщо це можливо.

$(document).ready(function(){
var stringWithShorterURLs = getReplacementString($(".tasks-overflow p").text());

function getReplacementString(str){
    return str.replace(/https?\:\/\/([^\s]*)/gi,function(match){
        return match.substring(0,10) + "..."
    });
}});

який вирве http: // або https: // та надрукує до 10 символів www.example.com


2

Хоча це не обмежить рядок рівно 10 символами, чому б не дозволити браузеру виконувати роботу за вас із CSS:

.no-overflow {
    white-space: no-wrap;
    text-overflow: ellipsis;
    overflow: hidden;
}

а потім для комірки таблиці, що містить рядок, додайте вищезазначений клас і встановіть максимально дозволену ширину. Результат повинен виглядати краще, ніж будь-що зроблене на основі вимірювання довжини рядка.


1

@ jolly.exe

Гарний приклад Веселий. Я оновив вашу версію, яка обмежує довжину символів на відміну від кількості слів. Я також додав налаштування заголовка до справжнього оригінального innerHTML, щоб користувачі могли навести курсор і побачити, що усічено.

HTML

<div id="stuff">a reallly really really long titleasdfasdfasdfasdfasdfasdfasdfadsf</div> 

JS

 function cutString(id){    
     var text = document.getElementById(id).innerHTML;         
     var charsToCutTo = 30;
        if(text.length>charsToCutTo){
            var strShort = "";
            for(i = 0; i < charsToCutTo; i++){
                strShort += text[i];
            }
            document.getElementById(id).title = "text";
            document.getElementById(id).innerHTML = strShort + "...";
        }            
     };

cutString('stuff'); 


-2

Показати цей "довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст довгий текст "

до

довгий текст довгий текст довгий ...

        function cutString(text){    
            var wordsToCut = 5;
            var wordsArray = text.split(" ");
            if(wordsArray.length>wordsToCut){
                var strShort = "";
                for(i = 0; i < wordsToCut; i++){
                    strShort += wordsArray[i] + " ";
                }   
                return strShort+"...";
            }else{
                return text;
            }
         };

Ви тут розглядаєте слова. У запитанні згадуються персонажі
Віктор Фернандес,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.