6

アラートおよび確認ダイアログのテキストを記述する際の一般的な問題: 改行文字を追加する前に入力する文字数。ある時点で自動ブレークするブラウザもあれば、別の時点で自動ブレークするブラウザもあります。だからあなたは推測のままです。便利なスニペットは、アラートまたは確認ダイアログの意図したテキストと文字の長さを入力として受け取り、渡された文字の長さに最も近いスペースのある位置に改行文字のみが追加された同じ入力文字列を返す Javascript 関数です。単語は途中で分割されません。

例:
1. 警告または確認ダイアログ ボックスに使用するテキストの文字列に var を割り当てます

2. 次のように、関数を通してテキストを実行します
。// デフォルト、50 文字ごとに改行
または
a = breakLines(a, 20); // 20 文字ごとに

改行 関数を実行した後に 'a' の値を表示すると、指定した文字位置に最も近いスペース文字で、指定したすべての位置に改行が追加されていることがわかります。たとえば、20 を指定した場合、「a」は次のように変換されます。

「私の犬にはノミがいます\n素早い茶色のキツネが\n怠け者の犬を飛び越えます」など

文字列の各行 (行とは、改行文字で終わる文字列の一部です) で、行の両側の空白が削除されます。以下のコード スニペットでは、jQuery の $.trim() 関数を使用してこれを行っていますが、jQuery ライブラリを使用せずに行う方法は他にもあります (regexp を使用するなど)。別の手段を使用したい場合は、コードを変更するだけです。

これは私の質問につながります:以下に示すようにやりたいことを行う以外に、より簡単でコンパクトな方法、たとえば正規表現を活用できるものはありますか? テイカーはいますか?

function breakLines(text, linelength)
{
 var linebreak = '\n';
 var counter = 0;
 var line = '';
 var returntext = '';
 var bMatchFound = false;
 var linelen = 50; // 50 characters per line is default

 if(linelength)
 {
  linelen = linelength;
 }

 if(!text){ return '';}
 if(text.length < linelen+1) { return $.trim(text);}

 while(counter < text.length)
 {
  line = text.substr(counter,linelen);
  bMatchFound = false;
  if (line.length == linelen)
  {
   for(var i=line.length;i > -1;i--)
   {
    if(line.substr(i,1)==' ')
    {
     counter += line.substr(0,i).length;
     line = $.trim(line.substr(0,i)) + linebreak;
     returntext += line;
     bMatchFound = true;
     break;
    }
   }

   if(!bMatchFound)
   {
    counter+=line.length;
    line = $.trim(line) + linebreak;
    returntext += line;
   }
  }
  else
  {
   returntext += $.trim(line);
   break; // We're breaking out of the the while(), not the for()
  }
 }

 return returntext;
}
4

4 に答える 4

3

パラメータ検証なしの短いバージョン

function explode(str, maxLength) {
    var buff = "";
    var numOfLines = Math.floor(str.length/maxLength);
    for(var i = 0; i<numOfLines+1; i++) {
        buff += str.substr(i*maxLength, maxLength); if(i !== numOfLines) { buff += "\n"; }
    }
    return buff;
}
于 2016-01-08T07:37:22.333 に答える
1

多分 ?

function breadLines( str, len )
{
    var len = len || 50, i, j, lines, count, lineBreak = '\n', out = [];

    if ( str.length < len )
        return str;

    lines = str.split(/\s+/);

    for ( i=0, j=0, count=lines.length; i<count; i++ )
    {
        if ( ( out[j] + lines[i] ).length > len )
            j++, out.push("");

        out[j] += lines[i];
    }

    return out.join(lineBreak);
}
于 2012-09-14T14:29:45.573 に答える
-1

これはそれを行う必要があります:

function breaklines(str, n) {
    var lines = str.split(/\s+/), // explode on whitespaces
        n = +n || 50;
    var res = [];
    for (var i=0; i<lines.length; ) {
        for (var l = 0, line = []; l + lines[i].length <= n; i++) {
            l += 1 + lines[i].length;
            line.push(lines[i]);
        }
        res.push(line.join(" "));
    }
    return res.join("\n");
}
于 2012-09-14T15:22:58.913 に答える