Javascriptを使ってtextareaをwidthで文字制限

| コメント(0) | トラックバック(0)

このはてなの質問にあるプロポーショナルフォントにぴったりのTextareaの回答を見てなるほどと思ったので、なんかやってみる。

挙動は胡散臭いが、作業スペースをvisibility: hidden; にすればそれなりに見える。まあ、ふつうはonKeyUp何かにしかけず、submit時のチェックに利用すると思う。
firefox, operaはwrap=offでないと日本語がうまくいかなかった。
利用価値としては...、帳票系の業務WEBアプリの前処理とかだろうか?

以下はこのまま使ってはいけないコード。

  • 改行の扱いが雑すぎる。
  • ブラウザの分類も雑。
  • scrollHeightとclientHeightはスタイルによっては一致しないらしい。ボーダー?
  • 適当に5px増やしてるけど、最小値をどこかで計っておくべき。
  • ブラウザによってpxの扱いが違うので最大幅もどこかで計っておくべき。
  • そもそもコードが...。
function limitChars(target, maxWidth)
{
  var change = false;
  if (navigator.appVersion.match(/AppleWebKit|MSIE/))
  {
    var strText = target.value;
    var arrText = strText.split("\r\n");
    for(var i = 0; i < arrText.length; i++)
    {
      $('hta1').value = arrText[i];
      var j;
      for (j = maxWidth % 5; j < maxWidth + 5; j += 5)
      {
        $('hta1').style.width = j + 'px' ;
        if ($('hta1').scrollHeight == ($('hta1').clientHeight))
          break ;
      }

      if(j > maxWidth)
      {
        alert('一行の幅が'+ maxWidth + 'pxを超えました。');
        $('hta1').style.width = maxWidth + 'px' ;
        for (var k = 1; k < arrText[i].length; k++)
        {
          $('hta1').value
            = arrText[i]
            = arrText[i].substr(0, arrText[i].length - k);
          if ($('hta1').scrollHeight == ($('hta1').clientHeight))
            break;
        }
        change = true;
      }
    }
  }
  else if (navigator.userAgent.match(/Firefox/))
  {
    var strText = target.value;
    var arrText = strText.split("\n");
    for(var i = 0; i < arrText.length; i++)
    {
      $('hta2').value = arrText[i];

      var j;
      $('hta2').style.width = '0px';
      $('hta2').style.width = $('hta2').scrollWidth + 'px' ;
      j = $('hta2').scrollWidth;

      if(j > maxWidth)
      {
        alert('一行の幅が'+ maxWidth + 'pxを超えました。');
        $('hta2').style.width = maxWidth + 'px' ;
        for (var k = 1; k < arrText[i].length; k++)
        {
          $('hta2').value
            = arrText[i]
            = arrText[i].substr(0, arrText[i].length - k);
          $('hta2').style.width = '0px';
          if(maxWidth >= $('hta2').scrollWidth)
            break;
        }
        change = true;
      }
    }
  }
  else if (navigator.appName == 'Opera')
  {
    var strText = target.value;
    var arrText = strText.split("\r\n");
    for(var i = 0; i < arrText.length; i++)
    {
      $('hta2').value = arrText[i];

      var j;
      $('hta2').style.width = '0px';
      $('hta2').style.width = $('hta2').scrollWidth + 'px' ;
      j = $('hta2').scrollWidth;

      if(j > maxWidth)
      {
        alert('一行の幅が'+ maxWidth + 'pxを超えました。');
        $('hta2').style.width = maxWidth + 'px' ;
        for (var k = 1; k < arrText[i].length; k++)
        {
          $('hta2').value
            = arrText[i]
            = arrText[i].substr(0, arrText[i].length - k);
          $('hta2').style.width = '0px';
          if(maxWidth >= $('hta2').scrollWidth)
            break;
        }
        change = true;
      }
    }
  }
  if(change)
    target.value = arrText.join("\n");
}

トラックバック(0)

トラックバックURL: http://uwi.but.jp/mt/mt-tb.cgi/235

コメントする

このブログ記事について

このページは、uwiが2008年11月26日 11:03に書いたブログ記事です。

ひとつ前のブログ記事は「ActionScript 3.0 でパラメータ(GET)を受け取る」です。

次のブログ記事は「年賀状 2009」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。