【问题标题】:Javascript: calculating number of columns of a dynamically sized textareaJavascript:计算动态大小的文本区域的列数
【发布时间】:2009-07-19 07:28:16
【问题描述】:

我有一个 HTML 文本区域,其宽度设置为浏览器窗口的 100%,使用 CSS。

如何计算文本区域中的文本列数?

【问题讨论】:

    标签: javascript dynamic textarea


    【解决方案1】:

    。 @jes5199 我从未来写信给你。我比你早了大约 11 年,我带来了新闻。也许我得到的最好的消息与您的问题直接相关:完全可以计算文本区域中的列数。第二条消息是,我可以使用一些方便的 Web 原型设计工具快速演示如何计算 <textarea /> 的列。我可以分享的最后一条消息是,您绝对应该毫无疑问地投资 Facebook,因为我将使用他们的一个神奇的 javascript 工具来快速演示如何解决这个问题。我们不知道它是如何工作的。您还需要几年的时间才能享受到这样的魔力,但让我们来看看未来会发生什么。

    我创建了一个小型 CodeSandbox 应用程序,它将在此处计算文本区域中的列数:https://codesandbox.io/s/stack-textarea-width-dkwij

    应用程序依赖于执行您正在寻找的计算的这个函数:

    /**
     * calTextAreaCols -- function
     * @param {string} divId The element id of the `<textarea />` that requires measuring.
     * @param {string} font The font that is used in the targeted `<textarea />`.
     * @return {number} The number of characters / columns that fit within the width of the `<textarea />`
     */
    export default function calcTextAreaCols(divId, font) {
      // get div font size; from: https://stackoverflow.com/a/15195345
      var element = document.getElementById(divId);
      var style = window
        .getComputedStyle(element, null)
        .getPropertyValue("font-size");
      var fontSize = parseFloat(style) + "px";
    
      // prepare environment to figure out row maximum; from: https://stackoverflow.com/a/21015393
      var canvas =
        calcTextAreaCols.canvas ||
        (calcTextAreaCols.canvas = document.createElement("canvas"));
      var context = canvas.getContext("2d");
      context.font = fontSize + " " + font;
    
      // <textarea> offsetWidth, minus border and padding
      var rawWidth = element.offsetWidth;
      rawWidth -= parseInt(
        getComputedStyle(element, null).getPropertyValue("border-left-width")
      );
      rawWidth -= parseInt(
        getComputedStyle(element, null).getPropertyValue("border-right-width")
      );
      rawWidth -= parseInt(
        getComputedStyle(element, null).getPropertyValue("padding-left")
      );
      rawWidth -= parseInt(
        getComputedStyle(element, null).getPropertyValue("padding-right")
      );
    
      // <textarea> width, divided by the width of the 'a' character
      rawMeasure = rawWidth / context.measureText("a").width;
    
      // round down
      var measure = Math.floor(rawMeasure);
    
      return measure;
    }
    
    

    基本上,此函数将使用&lt;canvas&gt; 元素来确定&lt;textarea /&gt; 元素的宽度内可以容纳多少字符。

    在我上面的演示中,我会注意到一些明显的缺陷,但我把它留给你值得信赖的人从这里开始:

    1. 仅当样式为&lt;textarea /&gt; 的字体是统一的(如等宽字体)时,此计算才有效。如果字符的宽度不同,则需要使用一些额外的代码来解决。
    2. 在我创建的简单 React 应用程序中,您会看到 setTextAreaCols 挂钩仅在重新渲染时调用,并且当用户将新信息输入到 &lt;textarea /&gt; 时调用,但不一定在调整元素大小时调用。李>

    【讨论】:

    • 这是一个不错的答案,但演示在 chrome 和 firefox [ubuntu 18.04] 中给我的结果都不准确
    • 感谢 @marcosassis 发现了这个错误,我在 Firefox 和 Chrome [Debian 10.5] 上进行了测试,你是对的,计算结果略有偏差。我相信这是由于 &lt;textarea /&gt; 的填充和边框造成的,现在该函数考虑了这些像素(它只偏离了 4px,但对我来说足以将计算抛开 2 个字符),它似乎运作良好。你能确认一下吗? CodeSandbox 也使用此功能进行了更新。
    【解决方案2】:

    DOM textarea 对象支持cols 方法,可用于获取或设置textarea 的列数。

    var numCols = document.getElementById('myTextArea').cols

    有关 Textarea 的更多信息,请访问w3cschools

    【讨论】:

    • 没有帮助 - 如果文本区域是动态调整大小的,“cols”返回“-1”
    • 我认为您最好的选择是使用document.getElementById("myTextArea").clientWidth) 和/或document.getElementById("myTextArea").offsetWidth) 并除以影响字体宽度的各种因素。或查看extjs.com/deploy/dev/docs/?class=Ext.util.TextMetrics
    猜你喜欢
    • 2012-06-27
    • 2015-07-21
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2017-01-17
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多