ใครบ้างมีโซลูชัน / ไลบรารีที่ซับซ้อนยิ่งขึ้นสำหรับตัดทอนสตริงด้วย JavaScript และวางจุดไข่ปลาไว้ท้ายกว่าแบบที่เห็นได้ชัด:
if (string.length > 25) {
string = string.substring(0, 24) + "...";
}
ใครบ้างมีโซลูชัน / ไลบรารีที่ซับซ้อนยิ่งขึ้นสำหรับตัดทอนสตริงด้วย JavaScript และวางจุดไข่ปลาไว้ท้ายกว่าแบบที่เห็นได้ชัด:
if (string.length > 25) {
string = string.substring(0, 24) + "...";
}
คำตอบ:
เป็นหลักคุณตรวจสอบความยาวของสตริงที่กำหนด หากยาวเกินความยาวที่กำหนดให้n
ตัดให้ยาวn
( substr
หรือslice
) และเพิ่มเอนทิตี html …
(... ) ลงในสตริงที่ถูกตัด
วิธีการดังกล่าวดูเหมือนว่า
function truncate(str, n){
return (str.length > n) ? str.substr(0, n-1) + '…' : str;
};
หาก 'ซับซ้อนยิ่งขึ้น' คุณหมายถึงการตัดทอนที่ขอบเขตคำสุดท้ายของสตริงดังนั้นคุณต้องมีการตรวจสอบพิเศษ ก่อนอื่นให้คุณตัดสตริงตามความยาวที่ต้องการจากนั้นให้คุณตัดผลลัพธ์ที่ได้ตามขอบเขตของคำสุดท้าย
function truncate( str, n, useWordBoundary ){
if (str.length <= n) { return str; }
const subString = str.substr(0, n-1); // the original check
return (useWordBoundary
? subString.substr(0, subString.lastIndexOf(" "))
: subString) + "…";
};
คุณสามารถขยายString
ต้นแบบดั้งเดิมด้วยฟังก์ชันของคุณ ในกรณีนั้นstr
ควรลบพารามิเตอร์และstr
ภายในฟังก์ชันควรแทนที่ด้วยthis
:
String.prototype.truncate = String.prototype.truncate ||
function ( n, useWordBoundary ){
if (this.length <= n) { return this; }
const subString = this.substr(0, n-1); // the original check
return (useWordBoundary
? subString.substr(0, subString.lastIndexOf(" "))
: subString) + "…";
};
นักพัฒนาที่มีความเชื่อมากขึ้นอาจยอมแพ้คุณอย่างมากเกี่ยวกับเรื่องนั้น (" อย่าดัดแปลงวัตถุที่คุณไม่ได้เป็นเจ้าของ " ฉันไม่รังเกียจหรอก)
วิธีที่ไม่มีการขยายString
ต้นแบบคือการสร้างวัตถุตัวช่วยของคุณเองซึ่งมีสตริง (ยาว) ที่คุณให้และวิธีการที่กล่าวมาก่อนหน้านี้เพื่อตัดทอนมัน นั่นคือสิ่งที่ตัวอย่างด้านล่างทำ
สุดท้ายคุณสามารถใช้ css เพื่อตัดทอนสตริงที่ยาวในโหนด HTML เท่านั้น มันช่วยให้คุณควบคุมน้อยลง แต่อาจเป็นทางออกที่ดี
substr
คือความยาวดังนั้นควรsubstr(0,n)
แทนที่จะ จำกัด ไว้ที่n
ตัวอักษรตัวแรก
…
ด้วยจุดไข่ปลาที่แท้จริง ( ...
) ในตัวอย่างโค้ดของคุณ หากคุณพยายามใช้สิ่งนี้ในการโต้ตอบกับ API คุณจะต้องมีเอนทิตีที่ไม่ใช่ HTML
โปรดทราบว่าสิ่งนี้จะต้องทำสำหรับ Firefox เท่านั้น
เบราว์เซอร์อื่น ๆทั้งหมดสนับสนุนโซลูชัน CSS (ดูตารางสนับสนุน ):
p {
white-space: nowrap;
width: 100%; /* IE6 needs any width */
overflow: hidden; /* "overflow" value must be different from visible"*/
-o-text-overflow: ellipsis; /* Opera < 11*/
text-overflow: ellipsis; /* IE, Safari (WebKit), Opera >= 11, FF > 6 */
}
ประชดคือฉันได้รับรหัสนั้นจาก Mozilla MDC
white-space: nowrap;
) เมื่อพูดถึงมากกว่าหนึ่งบรรทัดคุณจะติดกับ JavaScript
Your picture ('some very long picture filename truncated...') has been uploaded.
มีเหตุผลที่ถูกต้องที่ผู้คนอาจต้องการทำสิ่งนี้ใน JavaScript แทน CSS
วิธีตัดให้เหลือ 8 อักขระ (รวมถึงจุดไข่ปลา) ใน JavaScript:
short = long.replace(/(.{7})..+/, "$1…");
หรือ
short = long.replace(/(.{7})..+/, "$1…");
.replace(/^(.{7}).{2,}/, "$1…");
แทน
long
และshort
สงวนไว้เป็นคำหลักในอนาคตด้วยข้อกำหนด ECMAScript ที่เก่ากว่า (ECMAScript 1 ถึง 3) ดูMDN: คำหลักที่สงวนไว้ในอนาคตในมาตรฐานที่เก่ากว่า
_.truncate('hi-diddly-ho there, neighborino');
// → 'hi-diddly-ho there, neighbo…'
หรือunderscore.string ของตัด
_('Hello world').truncate(5); => 'Hello...'
('long text to be truncated').replace(/(.{250})..+/, "$1…");
อย่างใดรหัสข้างต้นไม่ทำงานสำหรับคัดลอกวางหรือเขียนข้อความบางชนิดในแอป vuejs ดังนั้นฉันจึงใช้lodash ตัดทอนและมันก็ใช้ได้ดี
_.truncate('long text to be truncated', { 'length': 250, 'separator': ' '});
นี่คือโซลูชันของฉันซึ่งมีการปรับปรุงเล็กน้อยสำหรับข้อเสนอแนะอื่น ๆ :
String.prototype.truncate = function(){
var re = this.match(/^.{0,25}[\S]*/);
var l = re[0].length;
var re = re[0].replace(/\s$/,'');
if(l < this.length)
re = re + "…";
return re;
}
// "This is a short string".truncate();
"This is a short string"
// "Thisstringismuchlongerthan25characters".truncate();
"Thisstringismuchlongerthan25characters"
// "This string is much longer than 25 characters and has spaces".truncate();
"This string is much longer…"
มัน:
ฟังก์ชั่นที่ดีที่สุดที่ฉันได้พบ เครดิตข้อความจุดไข่ปลา
function textEllipsis(str, maxLength, { side = "end", ellipsis = "..." } = {}) {
if (str.length > maxLength) {
switch (side) {
case "start":
return ellipsis + str.slice(-(maxLength - ellipsis.length));
case "end":
default:
return str.slice(0, maxLength - ellipsis.length) + ellipsis;
}
}
return str;
}
ตัวอย่าง :
var short = textEllipsis('a very long text', 10);
console.log(short);
// "a very ..."
var short = textEllipsis('a very long text', 10, { side: 'start' });
console.log(short);
// "...ng text"
var short = textEllipsis('a very long text', 10, { textEllipsis: ' END' });
console.log(short);
// "a very END"
ขณะนี้เบราว์เซอร์สมัยใหม่ทั้งหมดสนับสนุนโซลูชัน CSS อย่างง่ายสำหรับการเพิ่มจุดไข่ปลาโดยอัตโนมัติหากบรรทัดข้อความเกินความกว้างที่มี:
p {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
(โปรดทราบว่าสิ่งนี้ต้องการความกว้างขององค์ประกอบที่ จำกัด ในบางวิธีเพื่อให้มีผลกระทบใด ๆ )
ขึ้นอยู่กับhttps://css-tricks.com/snippets/css/truncate-string-with-ellipsis/
ควรสังเกตว่าวิธีนี้ไม่จำกัด ตามจำนวนอักขระ นอกจากนี้ยังไม่ทำงานหากคุณต้องการอนุญาตให้มีข้อความหลายบรรทัด
text-direction: rtl
text-align: left
ดูdavidwalsh.name/css-ellipsis-left
เฟรมเวิร์ก Javascript ที่ทันสมัยที่สุด ( JQuery , Prototype , ฯลฯ ... ) มีฟังก์ชั่นยูทิลิตี้ที่ตรึงอยู่กับ String ที่จัดการสิ่งนี้
นี่คือตัวอย่างใน Prototype:
'Some random text'.truncate(10);
// -> 'Some ra...'
ดูเหมือนว่าหนึ่งในฟังก์ชั่นที่คุณต้องการให้คนอื่นจัดการ / ดูแลรักษา ฉันปล่อยให้เฟรมเวิร์กจัดการแทนการเขียนโค้ดเพิ่มเติม
_.trunc
นี้
บางทีฉันอาจพลาดตัวอย่างที่มีคนจัดการโมฆะ แต่ 3 คำตอบท็อปไม่ทำงานสำหรับฉันเมื่อฉันมีโมฆะ (แน่ใจว่าฉันรู้ว่าการจัดการข้อผิดพลาดและอื่น ๆ อีกนับล้านไม่ใช่ความรับผิดชอบของบุคคลที่ตอบคำถาม แต่เนื่องจาก ฉันใช้ฟังก์ชั่นที่มีอยู่แล้วพร้อมกับคำตอบที่ยอดเยี่ยมอย่างหนึ่งของการตัดคำไข่ที่ฉันคิดว่าฉันจะให้มันแก่ผู้อื่น
เช่น
javascript:
news.comments
ใช้ฟังก์ชั่นการตัด
news.comments.trunc(20, true);
อย่างไรก็ตามใน news.comments เป็นโมฆะ สิ่งนี้จะ "หยุด"
สุดท้าย
checkNull(news.comments).trunc(20, true)
ฟังก์ชั่นการตัดทอนมารยาทของKooiInc
String.prototype.trunc =
function (n, useWordBoundary) {
console.log(this);
var isTooLong = this.length > n,
s_ = isTooLong ? this.substr(0, n - 1) : this;
s_ = (useWordBoundary && isTooLong) ? s_.substr(0, s_.lastIndexOf(' ')) : s_;
return isTooLong ? s_ + '…' : s_;
};
ตัวตรวจสอบ null แบบง่ายของฉัน (ตรวจสอบสิ่ง "null" ตามตัวอักษรเช่นกัน (สิ่งนี้จับไม่ได้กำหนด "", null, "null" ฯลฯ )
function checkNull(val) {
if (val) {
if (val === "null") {
return "";
} else {
return val;
}
} else {
return "";
}
}
บางครั้งชื่อไฟล์จะมีหมายเลขซึ่งดัชนีอาจอยู่ที่จุดเริ่มต้นหรือจุดสิ้นสุด ดังนั้นฉันจึงต้องการให้สั้นลงจากจุดศูนย์กลางของสตริง:
function stringTruncateFromCenter(str, maxLength) {
const midChar = "…"; // character to insert into the center of the result
var left, right;
if (str.length <= maxLength) return str;
// length of beginning part
left = Math.ceil(maxLength / 2);
// start index of ending part
right = str.length - Math.floor(maxLength / 2) + 1;
return str.substr(0, left) + midChar + str.substring(right);
}
ระวังว่าฉันใช้อักขระเติมที่นี่มีมากกว่า 1 ไบต์ใน UTF-8
คุณสามารถใช้ฟังก์ชันExt.util.Format.ellipsisหากคุณใช้ Ext.js
ฉันยกระดับโซลูชันของ Kooilnc ทางออกกะทัดรัดดีจริง ๆ มีกล่องเล็ก ๆ ที่ฉันอยากจะพูดถึง หากมีคนเข้าสู่ลำดับอักขระที่ยาวมาก ๆ ไม่ว่าด้วยเหตุผลใดมันจะไม่ถูกตัดทอน:
function truncate(str, n, useWordBoundary) {
var singular, tooLong = str.length > n;
useWordBoundary = useWordBoundary || true;
// Edge case where someone enters a ridiculously long string.
str = tooLong ? str.substr(0, n-1) : str;
singular = (str.search(/\s/) === -1) ? true : false;
if(!singular) {
str = useWordBoundary && tooLong ? str.substr(0, str.lastIndexOf(' ')) : str;
}
return tooLong ? str + '…' : str;
}
ด้วย Googling ที่รวดเร็วฉันพบสิ่งนี้ ... มันเหมาะกับคุณไหม?
/**
* Truncate a string to the given length, breaking at word boundaries and adding an elipsis
* @param string str String to be truncated
* @param integer limit Max length of the string
* @return string
*/
var truncate = function (str, limit) {
var bits, i;
if (STR !== typeof str) {
return '';
}
bits = str.split('');
if (bits.length > limit) {
for (i = bits.length - 1; i > -1; --i) {
if (i > limit) {
bits.length = i;
}
else if (' ' === bits[i]) {
bits.length = i;
break;
}
}
bits.push('...');
}
return bits.join('');
};
// END: truncate
Text-overflow: จุดไข่ปลาเป็นคุณสมบัติที่คุณต้องการ ด้วยสิ่งนี้และสิ่งที่ล้น: ซ่อนอยู่กับความกว้างที่เฉพาะเจาะจงทุกอย่างที่เหนือกว่าซึ่งจะได้ผลสามช่วงเวลาในตอนท้าย ... อย่าลืมเพิ่มช่องว่าง: ตอนนี้rapหรือข้อความจะใส่หลายบรรทัด
.wrap{
text-overflow: ellipsis
white-space: nowrap;
overflow: hidden;
width:"your desired width";
}
<p class="wrap">The string to be cut</p>
คำตอบของ c_harm อยู่ในความคิดของฉันที่ดีที่สุด โปรดทราบว่าหากคุณต้องการใช้
"My string".truncate(n)
คุณจะต้องใช้ตัวสร้างวัตถุ regexp แทนที่จะเป็นตัวอักษร นอกจากนี้คุณจะต้องหลบหนี\S
เมื่อแปลง
String.prototype.truncate =
function(n){
var p = new RegExp("^.{0," + n + "}[\\S]*", 'g');
var re = this.match(p);
var l = re[0].length;
var re = re[0].replace(/\s$/,'');
if (l < this.length) return re + '…';
};
ใช้รหัสต่อไปนี้
function trancateTitle (title) {
var length = 10;
if (title.length > length) {
title = title.substring(0, length)+'...';
}
return title;
}
การแก้ปัญหาของ Kooilnc:
String.prototype.trunc = String.prototype.trunc ||
function(n){
return this.length>n ? this.substr(0,n-1)+'…' : this.toString();
};
ส่งคืนค่าสตริงแทนอ็อบเจกต์ String หากไม่จำเป็นต้องถูกตัดทอน
ฉันเพิ่งจะทำเช่นนี้และจบลงด้วย:
/**
* Truncate a string over a given length and add ellipsis if necessary
* @param {string} str - string to be truncated
* @param {integer} limit - max length of the string before truncating
* @return {string} truncated string
*/
function truncate(str, limit) {
return (str.length < limit) ? str : str.substring(0, limit).replace(/\w{3}$/gi, '...');
}
รู้สึกดีและสะอาดสำหรับฉัน :)
ฉันชอบใช้ .slice () อาร์กิวเมนต์แรกคือดัชนีเริ่มต้นและที่สองคือดัชนีสิ้นสุด ทุกสิ่งในระหว่างนั้นคือสิ่งที่คุณได้รับกลับมา
var long = "hello there! Good day to ya."
// hello there! Good day to ya.
var short = long.slice(0, 5)
// hello
ที่ไหนสักแห่งที่ชาญฉลาด: D
//My Huge Huge String
let tooHugeToHandle = `It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).`
//Trim Max Length
const maxValue = 50
// The barber.
const TrimMyString = (string, maxLength, start = 0) => {
//Note - `start` is if I want to start after some point of the string
if (string.length > maxLength) {
let trimmedString = string.substr(start, maxLength)
return (
trimmedString.substr(
start,
Math.min(trimmedString.length, trimmedString.lastIndexOf(' '))
) + ' ...'
)
}
return string
}
console.log(TrimMyString(tooHugeToHandle, maxValue))
ฟังก์ชั่นนี้ทำการเว้นวรรคและส่วนคำด้วย (ex: Mother to Moth ... )
String.prototype.truc= function (length) {
return this.length>length ? this.substring(0, length) + '…' : this;
};
การใช้งาน:
"this is long length text".trunc(10);
"1234567890".trunc(5);
เอาท์พุท:
นี่คือ ...
12345 ...