2016-11-07 14 views
0

現在、最大行数に達した後、Enterキーを押してテキストエリアに新しい行の作成を停止するのが難しいです。行数は、作成したコンポーネントのパラメータとして渡されます。私のtextareaはRedactorエディタであり、新しい行は改行で区切られています。Textarea(Redactor)の行数を制限する方法は?

私はテキスト内の改行の数に基づいて行数を決定し、計算に観察を持っており、それが正しい値を返すされています。私のredactorの設定で

self.numberOfRows = ko.computed(function() { 
     return self.value().split(/<br>/).length; 
    }, this); 

を私は比較keydownCallback機能を持っています

keydownCallback: function (e) { 
      if (e.keyCode > 48 || e.keyCode === 32) { 
       if (self.remainingCharacters() <= 0) {      
        e.preventDefault(); 
       } 
      } else if (e.keyCode === 13) { 
       if (self.maxRows != null) { 
        if (self.numberOfRows() >= self.maxRows) { 
         e.preventDefault(); 
        } 
       } 
      } 
     }, 

コールバック関数の最初の部分は、文字の数を制限している:最大に達するか超えたとき防ぐ必要があり、行の最大数までの行数は、新しい行を作成するから、キーを入力します働くp roperlyしかし、Enterキーはまだ新しい行を作成します。私はまた、 "偽を返す"試みた。 preventDefaultの代わりに、私もpreventDefaultの前にstopPropagationを試しましたが、運はありません。私はテキストエリアに値を貼り付けるユーザーは心配していません。また、単語の折り返しを心配していません。提案?

分離コールバック:

 enterCallback: function(e) { 
      if (self.maxRows != null) { 
       if (self.numberOfRows() >= self.maxRows) { 
        return false; 
       } 
      } 
     }, 
     keydownCallback: function (e) { 
      if (e.keyCode > 48 || e.keyCode === 32) { 
       if (self.remainingCharacters() <= 0) { 
        e.preventDefault(); 
       } 
      } 
     }, 
+0

はすぐに戻って呼び出すと、まだ最大行に達するか上回ったときに新しい行を入力する入力して使用して、別々のコールバックに分離しました。 Enterコールバックのif文は正しく実行されます。私はエンターキーを押して最大行に達したときにコンソールにメッセージを表示することができました。 –

答えて

0

UPDATE

はのredactorで遊ぶ機会があったと私はリターンを押したときに、何<br>が挿入されていない、その代わりに、新しい<p>タグが作成されていることに気づきました。空の段落には、<p><br></p>が含まれます。

<h2>Foo</h2> 
<p>Bar 
</p> 
<p>Buz 
</p> 

私は一緒に私は新しいラインによって分割がもっとあるかのかどうかわからないんだけど、これは

$('#content').redactor({ 
    focus: true, 
    enterCallback: function(e) 
    { 
     var lines = this.code.get().split(/\r?\n/g).length; 
     console.log(this.code.get(), lines); 
     if (lines > 3) { // self.numberOfRows() 
      return false; 
     } 
    }, 
    keydownCallback: function(e) 
    { 
     // 
    } 
}); 

を扱うことかもしれない方法の概念の最小限の証拠を置く:だから、実際のtextarea値は、のようなものがあります this.code.get().split(/<\/(p|h[1-6])>/)のようなタグを閉じることで分割するよりも信頼性が高い。

私は


新しい行または終了タグによって分割のいずれかにself.numberOfRows関数内ORIGINAL ANSWERを正規表現を更新してしまう

は、あなたが彼らのdocsを確認しましたか?

あなたは/入力 取り扱いからのredactorを防ぐためのキー入力を返すために、このコールバックにはfalseを返すことができます。 enterkeyupのための2つの別々のコールバックがあるように思われます。このイベントのカスタム ハンドラを開発することができます。

$('#redactor').redactor({ 
    callbacks: { 
     enter: function(e) 
     { 
      console.log(this.code.get()); 
      return false; 
     } 
    } 
}); 

あなたが彼らのLimiter pluginを見ればまた、それだけではfalseを返します:

if (count >= this.opts.limiter) 
{ 
    return false; 
} 
+0

ありがとうございます。私はこれを試しても、私が投稿したオリジナルのコードと同じ動作をしているように見えます。あなたの答えを反映するように編集コールバックを投稿しました。 –

+0

私は段落タグを使用するのではなく、ユーザーがEnterキーを押すたびに
を挿入する改行をtrueに設定しました。私はそれを取り出し、タグを閉じることで分割しています。それはより良く働いています。今残っている唯一の問題は、ユーザーがテキストを入力する前に複数の空の行を入力してから、前に戻って後で入力できることです。最大に達すると新しい行の入力を停止しますが、入力を開始する前にmaxより大きい値を入力した場合、その行を回避することができます。 –

関連する問題