要计算当前输入的宽度,您必须将其嵌入到一个临时span元素中,将该东西附加到 DOM,使用该scrollWidth属性获取计算出的宽度(以像素为单位)并span再次删除。当然,您必须确保input在 和span元素中使用相同的字体系列、字体大小等。因此,我为他们分配了相同的class。
我将函数附加到keyup事件中,因为keypress输入字符尚未添加到 input 中value,因此将导致错误的宽度。不幸的是,我不知道如何摆脱输入字段的滚动(在字段末尾添加字符时);它滚动,因为在adjustWidthOfInput()调用之前添加并显示了字符。而且,如上所述,我不能反过来这样做,因为那样您将在插入按下的字符之前获得输入字段的值。我稍后会尝试解决这个问题。
顺便说一句,我只在 Firefox (3.6.8) 中测试过这个,但我希望你会明白这一点。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Get/set width of <input></title>
    <style>
      body {
        background: #666;
      }
      .input-element {
        border: 0;
        padding: 2px;
        background: #fff;
        font: 12pt sans-serif;
      }
      .tmp-element {
        visibility: hidden;
        white-space: pre;
      }
    </style>
  </head>
  <body>
    <input id="theInput" type="text" class="input-element" value="1">
    <script>
      var inputEl = document.getElementById("theInput");
      function getWidthOfInput() {
        var tmp = document.createElement("span");
        tmp.className = "input-element tmp-element";
        tmp.innerHTML = inputEl.value.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
        document.body.appendChild(tmp);
        var theWidth = tmp.getBoundingClientRect().width;
        document.body.removeChild(tmp);
        return theWidth;
      }
      function adjustWidthOfInput() {
        inputEl.style.width = getWidthOfInput() + "px";
      }
      adjustWidthOfInput();
      inputEl.onkeyup = adjustWidthOfInput;
    </script>
  </body>
</html>