Wyświetlać tylko 10 znaków z długiego ciągu?

88

Jak uzyskać długi ciąg tekstowy (taki jak querystring), aby wyświetlić maksymalnie 10 znaków, używając JQuery?

Przepraszam, jestem nowicjuszem w JavaScript i JQuery: S
Każda pomoc byłaby bardzo mile widziana.

Nasir
źródło
Czy możesz wyjaśnić na przykładzie?
Andy E
Czy jest to jquery, ponieważ jest to ciąg znaków w elemencie DOM?
sje397
1
@Gopi tak, mam na myśli elipsę Aby wyjaśnić ... Pracuję nad systemem intranetowym, w którym użytkownicy mogą zgłaszać przypadki ... niektórzy użytkownicy dodają bardzo długie zapytania, które niszczą układ tabeli, gdy są wyświetlane na stronie głównej. Chcę przechwycić ten querystring, sprawdzając (za pomocą JQuery) wszystko, co ma 10 znaków plus bez spacji i elipsę (np. This = jest-naprawdę-długi i ciąg ...) Proszę dać mi znać, jeśli to ma sens. Dzięki
Nasir
1
To działało na tutaj Dobrej Sukces!
Tran Anh Hien
przeglądarki mogą automatycznie dodawać wielokropek do ciągów, które łamałyby granice elementu (patrz moja odpowiedź poniżej)
Alnitak

Odpowiedzi:

169

Jeśli dobrze rozumiem, chcesz ograniczyć ciąg do 10 znaków?

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

Coś w tym stylu?

Sebs
źródło
15
Instrukcja if jest tutaj opcjonalna. str.substring (0,10) w ciągu zawierającym mniej niż 10 znaków pozostanie niezmienione :)
Andy E
10
ale instrukcja if może być użyta do czegoś takiego jak: {var str = 'Bardzo długi łańcuch'; if (długość.str.> 10) słowo = podłańcuch (0,10) + "..."; }
Daniel Wedlund,
@Daniel: prawda, konieczne byłoby dodanie wielokropka. Na szczęście użyłem słowa opcjonalne :-)
Andy E
4
@Daniel, "if (str.length> 10) str = str.substring (0,10) +" ... ";}" jest błędne, ponieważ łańcuch wynikowy ma długość 13, a nie 10 !! poprawne: "if (str.length> 10) str = str.substring (0,10-3) +" ... ";}"
Floyd,
1
Oto test wydajności dla tych, którym zależy. Działają prawie tak samo, jeśli przypadek, w którym podciąg jest faktycznie potrzebny, zdarza się w 50% przypadków.
Juan Mendes,
22

A oto przykład jQuery:

Pole tekstowe HTML:

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

Kod jQuery, aby ograniczyć jego rozmiar:

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

Na przykład możesz użyć powyższego kodu jQuery, aby uniemożliwić użytkownikowi wprowadzanie więcej niż 10 znaków podczas pisania; poniższy fragment kodu robi dokładnie to:

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

Aktualizacja : powyższy fragment kodu został użyty tylko do pokazania przykładowego zastosowania.

Poniższy fragment kodu rozwiąże problem z elementem DIV:

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

Zwróć uwagę , że używam textzamiast valw tym przypadku, ponieważ valmetoda wydaje się nie działać z elementem DIV.

Giuseppe Accaputo
źródło
Cześć Giu, nie mam do czynienia z tekstem, kiedy jest wprowadzany ... raczej kiedy jest wyświetlany i niszczy mój układ tabeli. Querystring tekst jest wyświetlany w DIV o nazwie .tasks-overflow
Nasir
@Nasir Dzięki za podpowiedź; Zaktualizowałem moją odpowiedź; to powinno pomóc ci rozwiązać twój mały problem
Giuseppe Accaputo,
Cześć Giu, wypróbowałem twój kod i nie zadziałał. Chcę, aby ten długi ciąg „thisisonelooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongquerystring” był wyświetlany jako „thisisonelooo ...”
Nasir
Tak wygląda kod: $ (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);}); // Kod Giu var elem = $ (". jobs-overflow"); if (elem) {if (elem.val (). length> 10) elem.val (elem. val (). substr (0,10))}});
Nasir,
@Nasir Przepraszam; moja stara odpowiedź zawierała valmetodę, która wydaje się nie działać dla elementów DIV. Ponownie zaktualizowałem moją odpowiedź i teraz textmetoda służy do zmiany tekstu, który powinien działać idealnie (ponownie przetestowałem go lokalnie). Czy mógłbyś przetestować go ponownie z moim zaktualizowanym kodem i dać mi znać?
Giuseppe Accaputo,
21

Tworzenie własnej odpowiedzi, ponieważ nikt nie brał pod uwagę, że podział może się nie wydarzyć (krótszy tekst). W takim przypadku nie chcemy dodawać „...” jako sufiksu.

Operator potrójny rozwiąże to:

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

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

Może być zamknięty, aby działał:

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

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

I rozszerz do klasy pomocników, więc możesz nawet wybrać, czy chcesz kropki, czy nie:

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));
Tatranskymedved
źródło
19
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

Zmienna wynikowa zawiera „Jestem zbyt słaba ...”

Ranjita Naik
źródło
11
('very long string'.slice(0,10))+'...'
// "very long ..."
Kai Light
źródło
5

html

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

javascript (w gotowym dokumencie)

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

Jeśli masz wiele słów w tekście i chcesz, aby każdy był ograniczony do maksymalnie 10 znaków, możesz zrobić:

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);
sje397
źródło
2
.text () jest bardziej odpowiedni niż .html (), gdy mamy do czynienia tylko z tekstem.
Andy E
Cześć sje397, muszę być w stanie zignorować inne słowa przed i po tym ciągu (ten ciąg jest długim querystring i nie ma spacji) dzięki
Nasir
@Nasir - możesz zmienić argumenty na substr ... lub możesz chcieć spojrzeć na wyrażenia regularne.
sje397
4

Skracając ciąg do dziesięciu znaków, powinieneś również dodać rzeczywistą elipsę HTML: &hellip;zamiast trzech kropek.

Ken Ray
źródło
3

To wygląda bardziej na to, czego prawdopodobnie chcesz.

$(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) + "..."
    });
}});


dajesz mu swój element HTML w pierwszym wierszu, a następnie pobiera cały tekst, zastępuje adresy URL wersjami o długości 10 znaków i zwraca go do Ciebie. Wydaje się to trochę dziwne, mając tylko 3 znaki adresu URL, więc poleciłbym to, jeśli to możliwe.

$(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) + "..."
    });
}});

co spowodowałoby wyrwanie http: // lub https: // i wydrukowanie do 10 znaków www.example.com

mraaroncruz
źródło
2

Chociaż nie ograniczy to ciągu do dokładnie 10 znaków, dlaczego nie pozwolić przeglądarce wykonać pracy za Ciebie za pomocą CSS:

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

a następnie dla komórki tabeli zawierającej ciąg dodaj powyższą klasę i ustaw maksymalną dozwoloną szerokość. Wynik powinien wyglądać lepiej niż cokolwiek zrobionego na podstawie pomiaru długości struny.

Alnitak
źródło
1

@ jolly.exe

Niezły przykład Jolly. Zaktualizowałem twoją wersję, która ogranicza długość znaków w przeciwieństwie do liczby słów. Dodałem również ustawienie tytułu do prawdziwego oryginalnego innerHTML, aby użytkownicy mogli najechać kursorem i zobaczyć, co jest obcięte.

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'); 
DaFrenzy
źródło
1

Spróbuj tego :)

var mystring = "How do I get a long text string";
mystring = mystring.substring(0,10);
alert(mystring);
Vishal P Gothi
źródło
-2

Pokaż to „długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst długi tekst "

do

długi tekst długi tekst długi ...

        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;
            }
         };
Code Spy
źródło
Rozważasz tutaj słowa. Pytanie dotyczy postaci
Victora Fernandesa