给定一个文本区域,有没有办法根据行数限制长度?

2023-12-05

我有一个文本区域字段,我希望用户能够输入不超过 3 行。

那可能吗?


Fiddle: http://jsfiddle.net/nvLBZ/1/

我刚刚(2小时)创建了一个脚本always将文本区域的高度限制为 3 行。

  1. 为特定文本区域计算字符的最大可能宽度(如果之前尚未计算)。
  2. 计算每行的最少字数。
  3. 克隆文本区域,以测试是否有必要继续该功能。当输入有效时,函数返回而不中断用户。

  4. 否则,克隆的文本区域将用作参考,并且用户的文本区域将被删除。出于性能原因,用户的文本区域也是暂时不可见的。

  5. 使用有效的方法填充文本区域:将已知小于文本区域宽度的块添加到文本区域中。
  6. 当添加的块超过最大大小时,最后的字符将被单独删除,直到最终达到最大行限制。
  7. 默认值已恢复。

代码如下,代码在底层实现($(document).ready(...)).

(function(){        
    var wordWidthMappers = {};
    function checkHeight(textarea, maxLines){
        if(!(textarea instanceof $)) return; /*JQuery is required*/
        if(isNaN(maxLines) || !isFinite(maxLines) || maxLines == 0) return;
        var areaWidth = textarea.width();
        var oldHeight = textarea.css("height");
        var oldOverflow = textarea.css("overflow-y");
        var lineHeight = parseFloat(textarea.css("line-height"));
        var maxTxtHeight = maxLines*lineHeight + "px";

        /*Calculations for an efficient determination*/
        var fontstyles = "font-size:"+textarea.css("font-size");
        fontstyles += ";font-family:"+textarea.css("font-family");
        fontstyles += ";font-weight:"+textarea.css("font-weight");
        fontstyles += ";font-style:"+textarea.css("font-style");
        fontstyles += ";font-variant:"+textarea.css("font-variant");
        var wordWidth = wordWidthMappers[fontstyles];
        if(!wordWidth){
            var span = document.createElement("span");
            span.style.cssText = fontstyles+";display:inline;width:auto;min-width:0;padding:0;margin:0;border:none;";
            span.innerHTML = "W"; //Widest character
            document.body.appendChild(span);
            wordWidth = wordWidthMappers[fontstyles] = $(span).width();
            document.body.removeChild(span);
        }

        textarea = textarea[0];
        var temparea = textarea.cloneNode(false);
        temparea.style.visibility = "hidden";
        temparea.style.height = maxTxtHeight;
        temparea.value = textarea.value;
        document.body.appendChild(temparea);
        /*Math.round is necessary, to deal with browser-specific interpretations
          of height*/
        if(Math.round(temparea.scrollHeight/lineHeight) > maxLines){
            textarea.value = "";
            textarea.style.visibility = "hidden";
            if(oldOverflow != "scroll") textarea.style.overflowY = "hidden";
            textarea.style.height = maxTxtHeight;
            var i = 0;
            var textlen = temparea.value.length;
            var chars_per_line = Math.floor(areaWidth/wordWidth);
            while(i <= textlen){
                var curLines = Math.round(textarea.scrollHeight/lineHeight);
                if(curLines <= maxLines){
                    var str_to_add = temparea.value.substring(i, i+chars_per_line);
                    var nextLn = str_to_add.indexOf("\n");
                    if(nextLn > 0) str_to_add = str_to_add.substring(0, nextLn);
                    else if(nextLn == 0) str_to_add = "\n";
                    i += str_to_add.length;
                    textarea.value += str_to_add;
                } else if(curLines > maxLines){
                    textarea.value = textarea.value.substring(0, textarea.value.length-1);
                    i--;
                    if(Math.round(textarea.scrollHeight/lineHeight) <= maxLines) break;
                }
            }
            textarea.style.visibility = "visible";
            textarea.style.height = oldHeight;
            textarea.style.overflowY = oldOverflow;
        }
        temparea.parentNode.removeChild(temparea);
    }

    $(document).ready(function(){/* Add checker to the document */
        var tovalidate = $("#myTextarea");
        tovalidate.keyup(function(){
            /*Add keyup event handler. Optionally: onchange*/
            checkHeight(tovalidate, 3);
        });
    });
})();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个文本区域,有没有办法根据行数限制长度? 的相关文章

  • 如何正确编写 CSS 属性选择器来提取所有 id 属性?

    情况 我目前正在尝试在 VBA 中使用语法重现属性选择器 attr 来自给出的 CSS 选择器练习here https www w3schools com cssref trysel asp 选择器旨在根据给定属性的值选择元素 预期结果 在
  • 获取更改前选择(下拉)的值

    我想要实现的目标是每当
  • 如何在不使用 Flexbox 的情况下水平对齐元素?

    有没有一种方法可以在不使用的情况下将 Web 组件彼此相邻对齐Flexbox 我知道它是一个很棒的工具 但不幸的是它不适用于 IE 9 或 10 我希望链接内的文本显示在图像旁边 JSFiddle 显示了工作代码 但是使用 FlexBox
  • 如何使用 jQuery 在悬停时显示工具提示消息?

    正如标题所述 如何使用 jQuery 在悬停时显示工具提示消息 工具提示插件可能对于您的需要来说太重了 只需使用您希望在工具提示中显示的文本设置 标题 属性即可 yourElement attr title This is the hove
  • JQuery - 选中时禁用重复的复选框

    我有一个复选框列表 分为几个部分 其中一些复选框可以出现在多个部分中 我想要做的是通过禁用用户选择复选框时相同的所有复选框来阻止用户在多个部分中选择相同的复选框 但是 他们选择的复选框不得被禁用 以便他们可以取消选中它 这还必须重新启用所有
  • 使用 javascript 加载不同的 CSS 样式表

    我需要使用 javascript 根据正在传递的 URL 变量加载不同的样式表 场景是这样的 我们需要使用一个 CSS 样式表和一个不同的样式表来维护一个移动网站 当通过 iOS 应用程序中加载的 Web 视图访问该页面时 该样式表将用于设
  • jQuery datepicker 无法正确更新值

    在我目前正在工作的网站上 我有一个用于添加事件的表单 此事件需要用户使用 jQuery 日期选择器选择日期 一个日期只能有一个事件 所以我想检查用户在日期选择器中插入的日期 我尝试通过在用户选择日期后获取值来执行此操作 然而问题是 日期选择
  • 如何使用 jQuery 在输入元素上实现占位符文本?

    我如何在输入上实现 jquery 提示文本
  • 如何使用ajax post请求将模态值插入数据库?

    查看代码 div class price div
  • ajaxComplete后重新加载reCaptcha

    ajaxComplete 事件完成时 我的 reCaptcha 不会重新加载 我遇到控制台错误 不存在 reCAPTCHA 客户端 那么为什么我的 reCaptcha 客户端在 ajaxComplete 之后就消失了 这是我的示例代码 do
  • 有没有办法让div在通过jquerydraggable[或等等]拖动时不互相重叠?

    有没有办法让div在通过jquerydraggable 拖动时不互相重叠 我有一堆 div 用户可以拖动它们 但我不能让它们彼此重叠 基本上 我正在创建一个画布 用户可以在其中自由移动网站内容 但在移动它们时不需要与其他内容重叠 有任何想法
  • javascript 可以从父页面访问 iframe 元素吗?

    我的页面上有 iframe iframe 和父页面位于不同的域中 父页面上的 javascript 代码可以访问此 iframe 内的元素吗 如果页面来自不同的域 则不应该这样做 浏览器安全沙箱应该阻止这种类型的访问 当两个页面来自不同的时
  • $(document).ready 回调何时执行?

    假设我们附加一个 click http api jquery com click 锚点的处理程序 a 中的标签 document ready http api jquery com ready 打回来 该处理程序将取消默认操作 遵循href
  • 为什么视口宽度与实际显示宽度不匹配?

    Chrome 显示我的视口宽度为 1280px 然而 我的实际显示分辨率是2560x1600px 我使用的机器是13 3英寸的MacBook Pro 为什么视口不是 2560px 宽 使用没有任何区别 my display settings
  • JQuery mouseover 函数多次触发

    我很长时间以来一直使用这种方法来为整个类 按钮等 设置事件 div bigButton mouseover function this style backgroundColor dfdfdf 然而 在进行一些测试时 我刚刚注意到 当将鼠标
  • vue基于媒体查询绑定值

    carousel 3d display 3 width 150 height 150 我想根据媒体查询设置属性绑定 e g 当屏幕宽度 gt 960px 时 显示应变为 5 您可以尝试绑定display组件属性的值
  • mat-table 自动调整列宽以适应更大的内容

    我有一个垫表 我想自动调整列宽 任何人都将与最长的列内容一样长
  • 通过 jQuery ajax 将 JSON 对象数组发送到 MVC3 操作方法

    模型绑定器不支持 JSON 对象数组吗 下面的代码在发送单个 JSON 域对象作为 ajax post 的一部分时起作用 但是 当发送 JSON 域对象数组时 action 参数为 null var domains DomainName t
  • Bootstrap 面板主体,内有表格

    我有一个引导面板 单击图标即可折叠并自动关闭 该面板内部包含一个全宽的表格 但只有在没有任何内容时才看起来像这样panel body 例如 这张桌子横跨面板的整个宽度和高度 看起来不错 但如果我可以有一个围绕桌子的类 我会更喜欢 但是 如果
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不

随机推荐

  • 熊猫系列中所有列表中最大的元素

    我有一个熊猫系列说 import pandas as pd a pd Series 1 2 3 4 5 6 7 8 3 334 333 4 5 3 4 我想找到所有列表中最大的元素 即 334 有什么简单的方法可以做到这一点 Option
  • JSON解析数组和同名单个对象

    我需要解析来自外部源的 JSON 数据 问题是有时数据数组被发送进来 有时它作为单个对象传入 但数组和单个对象具有相同的名称 OuterObject Names name John Doe name William Watson 但是当 J
  • 明确允许的端口在最新的 google chrome v.72.0.3626.109 中不起作用

    我们的本地站点很少有不安全端口 即 100 101 102 103 这些在 google chrome 上运行良好 在快捷方式目标中具有明确允许的端口 突然他们停止了 chrome v 72 0 3626 109 的新更新版本的工作 我无法
  • 在 Auth::attempt 上禁用散列

    我正在使用一个没有哈希密码的旧数据库 该数据库也需要未哈希 因为它连接到可运行的 JAR 我做了一切将它与 Laravel 5 3 连接并且它有效 但是 当登录时它总是返回 false 这是函数代码 public function logi
  • connection_aborted() 不适用于 ajax 调用

    EDITED 我有一个ajax调用 使用 ajax 它调用以下 php 脚本 for i 0 i lt 40 i echo flush if connection aborted log message error CONNECTION I
  • CMake find_package 找不到 Find.cmake

    我制作并安装了 aruco 库 它将 Findaruco cmake 文件放在 usr local lib cmake 目录中 在我的 CMakeLists txt 文件中 find package aruco REQUIRED 它总是返回
  • 如何禁用XE6中的嵌入式设计器?

    为了在一个窗口中查看多个视图 我阅读了this回答但似乎这些选项不再可用 现在我的问题是如何配置 rad studio xe6 以查看多个视图 在窗口中 例如实际代码和设计形式 您链接到的问题中讨论的选项仍然适用于 XE6 关键是禁用嵌入式
  • document.write 之后按钮不显示

    我做了一个石头 剪刀 布游戏 在程序中 我有一个应该出现的按钮 但它从来没有出现过 它一直给我一个错误 提示 未捕获的类型错误 无法读取 null 的属性 样式 如果我去掉最后一个 if 语句 它会出现 但在单击一次后就会消失
  • 卷曲:谷歌电子表格作为.csv

    我想使用curl 下载我的谷歌电子表格之一并将其保存为 csv 文件 以下是我正在使用的命令 curl silent header 授权 GoogleLogin auth AUTH KEY gt a csv 这是下载 pdf 格式的文件 任
  • PHP 准备语句...将变量绑定为 REGEXP 中的数字范围?

    query SELECT FROM mytable WHERE file REGEXP val 9 stmt dbh gt prepare query stmt gt bindValue val 1 I have also tried 1
  • Linq to Objects 中 UPDATE 的扩展方法

    在以下场景中 我正在查询 List 对象 并且对于匹配谓词 我想更新一些值 var updatedList MyList Where c gt c listItem1 someValue Update m gt m someProperty
  • 如何区分泛型类中具有相同名称和参数数量的两个方法?

    这是我的班级 public class MyClass
  • tryCatch 未捕获 RStudio 中 install.packages 产生的错误

    考虑以下用法 tryCatch log a error function e NULL NULL 现在我正在尝试做基本上相同的事情 但以更复杂的方式 我有两个网络存储库 如果第一个网络存储库由于某种原因不可用 我想从第二个网络存储库安装软件
  • 从 ng 服务中排除文件夹

    我有一个文件夹 project src Backend 我想排除其中ng serve Angular 版本是 6 1 x 我已经尝试过添加一些排除项tsconfig app json tsconfig json and 角度 json 我在
  • 无法从方法组转换为 Int32

    我希望我的小数学程序看起来非常时尚 我的意思是在Main方法我有以下方法 Greet UserInput1 UserInput2 Result In Greet 我只是说 嗨 在UserInput1 我想收集第一个数字 在UserInput
  • 如何将所有非 www URL 重定向到 https://www。在IIS 中?

    我想在 IIS 8 5 中添加正确的 301 永久重定向规则 我添加了以下规则 但它不起作用
  • 如何在 Fragment 中设置 ViewPager

    我需要将 ViewPager 放置在片段内 但我有两个片段 片段 1 是我的菜单 片段 2 我想用作 ViewPagerIndicator 但是一个片段不能有另一个片段 我需要为此做什么 从 Android 4 2 开始 出现了嵌套片段 h
  • 是否有可能在 ngrx-effects 内部抛出错误而不完成 Observable 流?

    有什么办法可以使用吗throw在 ngrx effects 流内有一个 Error 对象而没有完成流 我读过这些关于为什么流被抛出错误而被终止的很好的答案 ngrx 效果不会第二次运行 ngrx 影响错误处理 https github co
  • 重复过滤后的列表顺序

    我正在尝试自学函数式语言思维 并编写了一个过程 该过程接受一个列表并返回一个已过滤掉重复项的列表 这是可行的 但是输出列表是按照last在输入列表中找到每个重复项的实例 define inlist L n cond null L f car
  • 给定一个文本区域,有没有办法根据行数限制长度?

    我有一个文本区域字段 我希望用户能够输入不超过 3 行 那可能吗 Fiddle http jsfiddle net nvLBZ 1 我刚刚 2小时 创建了一个脚本always将文本区域的高度限制为 3 行 为特定文本区域计算字符的最大可能宽