javascript - 有没有办法知道在 text-overflow:ellipsis 和 overflow:hidden 应用后有多少字符被保留或可见?
问题描述
我有一串用分隔符“;”分隔的电子邮件地址 并希望按原样显示所有文本。还希望将任何溢出文本剪切到一行上,然后显示用户没有看到的剩余电子邮件 ID 的计数(由一些 @ 和 ; 字符逻辑驱动)。有没有办法知道在 HTML 文本被剪辑后保留/甚至删除了多少字符?
解决方案
我不知道你的标准到底是什么,但这里有一个如何计算的例子:
var span = document.getElementById("text");
var countSpan = document.getElementById("count");
var orig = span.innerText;
var vis = orig;
while(vis.length && span.scrollWidth > parseFloat(window.getComputedStyle(span).width))
{
vis = vis.slice(0,-1);
span.innerText = vis + "....";
}
span.innerText = orig;
var visibleText = vis;
var truncatedText = orig.replace(new RegExp("^" + vis.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), "");
var visibleCleanLessText;
var visibleCleanMoreText;
var truncatedCleanLessText;
var truncatedCleanMoreText;
if (truncatedText === "" || truncatedText.substr(0, 1) == ";")
{
visibleCleanLessText = vis;
visibleCleanMoreText = vis;
truncatedCleanLessText = truncatedText.substr(1);
truncatedCleanMoreText = truncatedCleanLessText;
}
else
{
var m = vis.match(/;([^;]*)$/);
visibleCleanLessText = m ? vis.replace(/;[^;]*$/, "") : "";
visibleCleanMoreText = vis + (truncatedText.match(/^([^;]*);/) || ["",""])[1];
truncatedCleanMoreText = (m ? m[1] : vis) + truncatedText;
truncatedCleanLessText = truncatedText.replace(/^[^;]*;/, "");
}
var truncatedCount = truncatedCleanMoreText === "" ? 0 : truncatedCleanMoreText.split(";").length;
if (truncatedCount)
{
countSpan.innerText = "+" + truncatedCount;
span.title = orig;
}
console.log("orig ", orig);
console.log("visible ", vis);
console.log("truncated ", truncatedText);
console.log("visibleCleanLess ", visibleCleanLessText);
console.log("truncatedCleanMore", truncatedCleanMoreText);
console.log("visibleCleanMore ", visibleCleanMoreText);
console.log("truncatedCleanLess", truncatedCleanLessText);
div
{
vertical-align: middle;
}
.truncate
{
width: 300px;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: middle;
}
.count:empty
{
display: none;
}
.count
{
display: inline-block;
position: relative;
font-family: monospace;
font-size: 90%;
left: -0.5em;
border: 1px solid black;
border-radius: 0.3em;
padding: 0.1em;
}
<div>
<span id="text" class="truncate">email1@example.com;email2@example.com;email3@example.com;email4@example.com</span>
<span id="count" class="count"></span>
</div>
推荐阅读
- sql-server - SQL Server 代理作业未按计划执行 SSIS 包
- python - 如何在 Django 中测试查询集
- excel - 从范围中排除多个单元格
- c# - vscode 调试 c# 应用程序
- javascript - 使用AJAX请求json类型的列表数据从chart.js动态输出到气泡图中
- mysql - 我有两个表,它们有一对多的关系,我正在尝试通过 id 从两个表中检索数据
- c++ - 当用户键入分隔符时停止 getline() 输入
- jquery - 单击时未打开折叠的 Bootstrap 导航栏
- terraform - 如何在 terraform 中修复 MalformedPolicyDocument
- python - 独立配置 pyspark 以由用户运行执行程序