Bir dizeyi düz JavaScript olarak kesme


167

Dinamik olarak yüklenmiş bir dizeyi düz JavaScript kullanarak kısaltmak istiyorum. Bu bir url, bu yüzden boşluk yok ve açıkçası kelime sınırlarını umursamıyorum, sadece karakterler.

İşte ne var:

var pathname = document.referrer; //wont work if accessing file:// paths
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

1
Hangi kısmı kısaltmak istiyorsun? Örneğinizin amacı pek iyi değil.
Larsenal

1
oh ok- URL'yi belirli miktarda karakterde kısaltmak istiyorum, böylece "foo" içHTML'sini ayarladığımda çok uzunsa div'den dışarı akmayacak.
Bob

1
* ama - sadece innerHTML, var pathname'nin kendisi değil.
Bob

1
Neden sadece div'in taşmasını gizlemek için css kullanmıyorsunuz? taşma: gizli
Samuel

2
@Samuel Zayıf uygulama UI-bilge olacağı için - kullanıcı yeni geldikleri URL'yi görmeyi beklerse (document.referrer) ve kısalıyorum, onlara sadece bir kısmını gördüklerini belirtmek istiyorum ve bir hata olmadığını. Bunun yanı sıra, önerdiğiniz yöntem, karakterleri yarıya indirecek ve korkunç görünecekti.
Bob

Yanıtlar:


334

Alt dize yöntemini kullanın :

var length = 3;
var myString = "ABCDEFG";
var myTruncatedString = myString.substring(0,length);
// The value of myTruncatedString is "ABC"

Yani sizin durumunuzda:

var length = 3;  // set to the number of characters you want to keep
var pathname = document.referrer;
var trimmedPathname = pathname.substring(0, Math.min(length,pathname.length));

document.getElementById("foo").innerHTML =
     "<a href='" + pathname +"'>" + trimmedPathname + "</a>"

1
0'dan başlayan bir alt dize istiyorsanız, substr işlevi 3 daha az karakterle aynı şeyi yapar;)
jackocnr 21:14

1
dizelength
boştan

"Dizginiz" bir sayı .toString().ise substring(), işleyebileceğiniz bir dizeye dönüştürmek için eklemeniz gerekir .
not2qubit


16

evet, alt dize. Bir Math.min yapmanıza gerek yoktur; dizenin uzunluğundan daha uzun bir dizine sahip alt dize orijinal uzunlukla biter.

Fakat!

document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

Bu bir hata. Belge.referrer'de kesme işareti varsa ne olur? Veya HTML'de özel anlamı olan diğer çeşitli karakterler. En kötü durumda, yönlendirendeki saldırgan kodu sayfanıza bir XSS güvenlik deliği olan JavaScript ekleyebilir.

Bu olayı durdurmak için yol adındaki karakterlerden manuel olarak kaçmak mümkün olsa da, biraz acı çekiyor. DOM yöntemlerini kullanarak innerHTML dizeleriyle uğraşmaktan daha iyidir.

if (document.referrer) {
    var trimmed= document.referrer.substring(0, 64);
    var link= document.createElement('a');
    link.href= document.referrer;
    link.appendChild(document.createTextNode(trimmed));
    document.getElementById('foo').appendChild(link);
}

Kafam karıştı, çözümünüz güvenlik boşluğunu nasıl önlüyor?
Bob

10
'CreateTextNode' ve '.href = ...' gibi DOM yöntemlerini kullandığınızda, doğrudan temel düz metin değerini ayarlarsınız. Bir HTML dosyasında veya innerHTML aracılığıyla HTML yazarken HTML çıkış kurallarına uymalısınız. Dolayısıyla 'createTextNode (' A <B&C ')' iyi olurken, innerHTML ile 'innerHTML =' A <B & C '' demelisiniz.
bobince

11

Sugar.js'den bahsedeceğimi düşündüm . Oldukça akıllı olan kesik bir yöntemi var.

Gönderen belgeler :

Bir dizeyi keser. Bölme doğru olmadığı sürece, kesilme sözcükleri bölmez ve bunun yerine kesmenin gerçekleştiği sözcüğü atar.

Misal:

'just sittin on the dock of the bay'.truncate(20)

Çıktı:

just sitting on...

9
Sugar is a Javascript library that extends native objects… Yerel nesnelerin JavaScript'te genişletilmesi genellikle bir Bad Idea ™ olarak kabul edilir.
Jezen Thomas

@JezenThomas Bazen kötü fikir en uygun fikirdir.
viditkothari

10

Aşağıdaki kod bir dizeyi keser ve kelimeleri bölmez ve bunun yerine kesmenin gerçekleştiği sözcüğü atar. Tamamen Sugar.js kaynağını temel alır.

function truncateOnWord(str, limit) {
        var trimmable = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF';
        var reg = new RegExp('(?=[' + trimmable + '])');
        var words = str.split(reg);
        var count = 0;
        return words.filter(function(word) {
            count += word.length;
            return count <= limit;
        }).join('');
    }

2
Sonuç bir "..." eklemek hoş olurdu! == str;
Leo Caseiro

9

İşte kullanabileceğiniz bir yöntem. FreeCodeCamp Mücadelelerinden birinin cevabı şu:

function truncateString(str, num) {


if (str.length > num) {
return str.slice(0, num) + "...";}
 else {
 return str;}}

6

Güncellenmiş ES6 sürümü

const truncateString = (string, maxLength = 50) => {
  if (!string) return null;
  if (string.length <= maxLength) return string;
  return `${string.substring(0, maxLength)}...`;
};

truncateString('what up', 4); // returns 'what...'

bu her zaman gerekli değildir bile alt dize çağırır ...
Clint Eastwood

@ ClintEastwood iyi geribildirim, cevabı güncelledim. Dize uzunluğunu maksimum uzunluğa göre kontrol etmek de showDots const ve ternary'yi daha düzenli hale getirebileceğim anlamına geliyordu. Şerefe.
Sam Logan

3

Evet, substringharika çalışıyor:

stringTruncate('Hello world', 5); //output "Hello..."
stringTruncate('Hello world', 20);//output "Hello world"

var stringTruncate = function(str, length){
  var dots = str.length > length ? '...' : '';
  return str.substring(0, length)+dots;
};

0

kelime ile kısaltmak istediğinizde.

function limit(str, limit, end) {

      limit = (limit)? limit : 100;
      end = (end)? end : '...';
      str = str.split(' ');
      
      if (str.length > limit) {
        var cutTolimit = str.slice(0, limit);
        return cutTolimit.join(' ') + ' ' + end;
      }

      return str.join(' ');
    }

    var limit = limit('ILorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus metus magna, maximus a dictum et, hendrerit ac ligula. Vestibulum massa sapien, venenatis et massa vel, commodo elementum turpis. Nullam cursus, enim in semper luctus, odio turpis dictum lectus', 20);

    console.log(limit);


0

var pa = document.getElementsByTagName('p')[0].innerHTML;
var rpa = document.getElementsByTagName('p')[0];
// console.log(pa.slice(0, 30));
var newPa = pa.slice(0, 29).concat('...');
rpa.textContent = newPa;
console.log(newPa)
<p>
some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here
</p>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.