2016-11-07 92 views
0

我目前很難得到輸入鍵,以達到最大行數後,停止在我的textarea中創建新行。行數作爲參數傳遞到我所做的組件中。我的textarea是一個Redactor編輯器,新行被換行符隔開。如何限制Textarea(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粗略地說,然而輸入鍵仍然會創建新的行。我也嘗試過「返回假」;而不是preventDefault,並且我也在preventDefault之前嘗試過stopPropagation,但沒有運氣。我不關心用戶粘貼到textarea的值,也不關心單詞換行。建議?

分居回調:

 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

分離成單獨的回調,使用輸入現在再打,仍然進入時最大的行達到或超過新的生產線。輸入回調中的if語句被正確執行。當我按下回車鍵並達到最大行數時,我能夠在控制檯中顯示一條消息。 –

回答

0

UPDATE

有機會與修訂者玩一圈,發現,當我按回車鍵,沒有<br>插入,而是,創建新<p>標籤。一個空的段落將包含<p><br></p>。所以實際textarea的值是一樣的東西:

<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) 
    { 
     // 
    } 
}); 

概念的最小證明我不知道但如果用新行分割爲多個可靠比通過關閉標籤如this.code.get().split(/<\/(p|h[1-6])>/)來分割。

我會更新self.numberOfRows函數內部的正則表達式要麼由新線或關閉標籤


原來的答案

你檢查自己的docs分裂? 有似乎是enterkeyup 2個獨立的回調:

您可以在此回調,以防止從主編處理 輸入/返回鍵輸入返回false。它允許您爲此事件開發定製的 處理程序。

$('#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

我將linebreaks設置爲true,只要用戶按下Enter鍵而不是使用段落標記,就會插入
。我把它拿出來,現在通過關閉標籤來分割。它工作得更好。現在剩下的唯一問題是用戶可以在輸入任何文本之前輸入多個空行,然後返回並填充它們。當達到最大值時,它會停止輸入新行,但如果他們在開始輸入之前輸入的值超過了最大值,則可以解決此問題。 –