使用 JavaScript 通过“阅读更多”和“阅读更少”截断文本

2024-03-03

如果我错误地提出了这个问题,或者如果之前有人问过并回答过这个问题,我很抱歉,我的搜索发现了类似的基于 JQuery 的问答,我正在寻找一个纯 JavaScript 解决方案。

var len = 100;
var p = document.getElementById('shrinkMe');
if (p) {

 var trunc = p.innerHTML;
 if (trunc.length > len) {

trunc = trunc.substring(0, len);
trunc = trunc.replace(/\w+$/, '');

trunc += '<a href="#" ' +
  'onclick="this.parentNode.innerHTML=' +
  'unescape(\''+escape(p.innerHTML)+'\');return false;">' +
  'Read More<\/a>';
p.innerHTML = trunc;
  }
}

JSFiddle http://jsfiddle.net/f484126/dx7w8jb2

小提琴用 JavaScript 截断文本,但在当前状态下,它只出现一次,这并不是我所需要的。我在 html 正文中多次出现“shrinkMe”作为 div id,并且使用 .getElementById 时,需要对此进行调整,因为单击“阅读更多”时它会同时展开所有出现的情况。我相信更改为 .getElementsByClassName 可能是一种解决方案,使我能够多次出现某个类名,而不是仅限于 .getElementById 的一个实例,但我不确定如何进行切换。

我还希望在单击“阅读更多”后显示可点击的“少读”,“少读”将文本返回到截断状态,然后“阅读更多”再次可见,依此类推。

总之,我请求帮助:

  1. 将 .getElementById 切换为 .getElementsByClassName
  2. 添加“阅读较少”以显示帖子“阅读更多”点击。

感谢您花时间阅读本文 - 抱歉,如果我无意中不清楚。如果是这样,请告诉我,我会尽力进一步解释。


所以,有些人对此的第一反应可能是“去jquery,这样你就可以轻松查询父母、兄弟姐妹等,等等等等”。我已经抵制并用纯 JS 完成了它(这很有趣)。

我改变了两件主要的事情:

  1. 我已将您的隐藏文本存储在父段落标记下方的隐藏段落中。这样我们就不必使用一些全局 JS 变量来保存隐藏文本;我宁愿将这样的东西存储在 DOM 上。像这样:

    <span id="parent1">Some text<span class="hidden">Hidden overflow text</span></span>
    
  2. 我已经给出了彼此相关的相关锚标记和隐藏段落标记对应的ID。所以你将有shrinkMe、shrinkMeOverflow、shrinkMeMoreLink、shrinkMeLessLink。这使得对相关事物进行分组变得更容易。这可能是渲染时间的考虑因素,但对于这个示例并保留原始代码,我通过替换innerHtml来完成它。你会在这个循环中看到:

    for (var i = 0; i < shrinkables.length; i++){
        var fullText = shrinkables[i].innerHTML;
        if(fullText.length > len){
            var trunc = fullText.substring(0, len).replace(/\w+$/, '');
            var remainder = "";
            var id = shrinkables[i].id;
            remainder = fullText.substring(len, fullText.length);
            shrinkables[i].innerHTML = '<span>' + trunc + '<span class="hidden" id="' + id + 'Overflow">'+ remainder +'</span></span>&nbsp;<a id="' + id + 'MoreLink" href="#!" onclick="showMore(\''+ id + '\');">More</a><a class="hidden" href="#!" id="' + id + 'LessLink" onclick="showLess(\''+ id + '\');">Less</a>';
        }
    }
    

这是完整的小提琴:http://jsfiddle.net/oxfb3wjs/3/ http://jsfiddle.net/oxfb3wjs/3/

如果您有任何疑问,请告诉我。希望我有帮助!

编辑:另外,您会在小提琴中看到我确实像您想要的那样使用了 getElementsByClassName 。我忘了提及这一点,但它就像循环返回的元素一样简单。 (参见小提琴)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 通过“阅读更多”和“阅读更少”截断文本 的相关文章

  • Imgur API 版本 3 JavaScript 上传示例

    我在网上找到的所有示例都是早期版本的 Imgur API 或非 JS 代码 所有这些都使用新 API 中不存在的 API 密钥 相反 你会得到一个client id and secret 任何人都有示例代码 展示如何使用其 API 版本 3
  • 在生产中使用 babel-node 可以吗

    我一直在使用 babel node 和 browserify 以及 babelify 转换来开发一个网站 以支持 ES6 语法 我只是想知道 我可以在生产中运行它吗 babel node server 而不是 node server 要在
  • 如何在react-select v2中创建optgroup?

    我想在我的反应选择列表中包含 optgroups 但它似乎没有记录在任何地方 我有以下结构 是从评论中提取的https github com JedWatson react select issues 59 https github com
  • 1分30秒倒计时器javascript

    我有代码 但它适用于 2 分钟计时器 我需要将其修改为 1 分 30 秒计时器 我已经尝试过 但未能从 1 30 开始计时器 因为我是这一行的初学者 并且想学习如何做到这一点 这是代码 div div
  • 将组件注册到现有的 Vue.js 实例

    我是 Vue js 新手 我想注册一个本地组件 如下所述 https v2 vuejs org v2 guide components html Local Registration https v2 vuejs org v2 guide
  • 在 angularjs 模块初始化期间有条件地注入依赖项

    我有一个角度模块 我想有条件地将依赖项注入其中 IE var myapp angular module myapp ngRoute myappcontroller ngGrid I want to include ngGrid only i
  • Webpack 和 Angular HTML 图像加载

    我一直对 webpack 和 Angular 感到头疼 这可能有一个简单的答案 但我无法弄清楚 我已经阅读了堆栈溢出中关于这个主题的几乎所有答案 但都无济于事 我有一个像这样的 html 页面 还有其他包含图像的模板 img
  • Disqus 评论数始终为 0 条评论

    我想我已经按照通用代码的说明设置了 Disqus 问题是它总是说某个帖子有 0 条评论 拿这个帖子来说 http tx0rx0 com retropie and the raspberry pi http tx0rx0 com retrop
  • 变量前面加双下划线

    我的节点代码中有以下代码片段 var fs require fs fs readdir dirname function err files console log files 为什么变量 dirname 有双下划线 我知道一个下划线是私有
  • getElementsByClassName & IE8:对象不支持此属性或方法[重复]

    这个问题在这里已经有答案了 I know getElementsByClassName 不支持IE8 你知道我可以用什么来代替吗 我因错误而变得烦人 对象不支持此属性或方法 HTML 代码是 function sumar var elems
  • 模型不是 AngularJS 中输入的日期对象

    使用 AngularJS 我试图使用输入显示日期type date
  • Famo.us 滚动视图高度

    我正在尝试使用著名的顺序布局在滚动视图下方添加图像 但滚动视图的高度有问题 这就是我创建滚动视图的方式 var scrollview new Scrollview direction Utility Direction X options
  • 自 2012 年 6 月 12 日以来,“未定义”随机附加在我网站上 1% 的请求网址中

    自 2012 年 6 月 12 日 11 20 TU 起 我在我的 varnish apache 日志中看到非常奇怪的错误 有时 当用户请求一页时 几秒钟后我会看到类似的请求 但 url 中最后一个 之后的所有字符串已被 未定义 替换 例子
  • 将数组中的所有元素相乘

    我在这里找不到我真正想要的例子 我想将所有数组元素相乘 因此如果数组包含 1 2 3 总和将为 123 6 到目前为止 我已经得到了这段代码 但它返回未定义 function multiply array var sum 1 for var
  • 添加选项以选择框而不用 Internet Explorer 关闭该框?

    我正在尝试构建一个包含多个下拉选择框的网页 这些下拉选择框在首次打开时异步加载其选项 这在 Firefox 下工作得很好 但在 Internet Explorer 下则不然 下面是我想要实现的目标的一个小例子 基本上 有一个选择框 ID 为
  • 当表格在 IE 中获得焦点时,表格滚动条会向上跳跃

    问题 我有一个table有包装的div with overflow y auto 一旦table获得焦点 滚动条向上跳 我怎样才能防止这种情况发生 我经历过这种行为IE9 不在 Chrome 中 请注意 我已添加tabindex到桌子上 以
  • javascript/jquery 禁用点击提交按钮,防止重复提交

    所以我的提交按钮如下所示 a href img src images user create product png border 0 a 当我双击它时 显然会双重提交 问题是 我将信息保存在数据库中 因此那里会有重复的信息 我不想那样 这
  • 使用 Socket.IO 时如何访问会话标识符?

    我有一个聊天 我需要管理独特的连接 我四处搜寻 但我找到的解决方案似乎都已被弃用 那么 如何使用 Socket IO 获取套接字的会话 ID 我在用着Node js http en wikipedia org wiki Node js Ex
  • Morgan Logger + Express.js:写入文件并在控制台中显示

    我正在尝试将 Morgan 与 Express js 结合使用来编写日志文件 同时也在控制台上显示我的日志 我正在使用这段代码 var logger require morgan var accessLogStream fs createW
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将

随机推荐