85

私はaspを使用しようとしています:

<asp:TextBox ID="txtInput" runat="server" TextMode="MultiLine"></asp:TextBox>

プロパティを指定する方法が必要ですmaxlengthが、どうやらmultiline textbox. onkeypressイベントにJavaScriptを使用しようとしています:

onkeypress="return textboxMultilineMaxNumber(this,maxlength)"

function textboxMultilineMaxNumber(txt, maxLen) {
    try {
        if (txt.value.length > (maxLen - 1)) return false;
    } catch (e) { }
    return true;
}

この JavaScript 関数の問題点は、文字を書き込んだ後にそれらを削除したり置き換えたりすることができず、その動作が望ましくないことです。

それを回避するために上記のコードで何を変更できるか、またはそれを回避する他の方法について何か考えはありますか?

4

19 に答える 19

75

代わりに正規表現バリデーターを使用してください。これは、JavaScript を使用するクライアント側で機能しますが、JavaScript が無効になっている場合にも機能します (長さチェックはサーバーでも実行されるため)。

次の例では、入力された値の長さが 0 ~ 100 文字であることを確認します。

<asp:RegularExpressionValidator runat="server" ID="valInput"
    ControlToValidate="txtInput"
    ValidationExpression="^[\s\S]{0,100}$"
    ErrorMessage="Please enter a maximum of 100 characters"
    Display="Dynamic">*</asp:RegularExpressionValidator>

もちろん、目的により適した、より複雑な正規表現を使用できます。

于 2012-01-04T04:40:47.370 に答える
44

このJavaScriptを試してください:

function checkTextAreaMaxLength(textBox,e, length)
{

        var mLen = textBox["MaxLength"];
        if(null==mLen)
            mLen=length;

        var maxLength = parseInt(mLen);
        if(!checkSpecialKeys(e))
        {
         if(textBox.value.length > maxLength-1)
         {
            if(window.event)//IE
              e.returnValue = false;
            else//Firefox
                e.preventDefault();
         }
    }   
}
function checkSpecialKeys(e)
{
    if(e.keyCode !=8 && e.keyCode!=46 && e.keyCode!=37 && e.keyCode!=38 && e.keyCode!=39 && e.keyCode!=40)
        return false;
    else
        return true;
}

コントロールで、次のように呼び出します。

<asp:TextBox Rows="5" Columns="80" ID="txtCommentsForSearch" MaxLength='1999' onkeyDown="checkTextAreaMaxLength(this,event,'1999');"  TextMode="multiLine" runat="server"> </asp:TextBox>

また、checkSpecialKeys 関数を使用して、JavaScript 実装の入力を検証することもできます。

于 2009-08-26T12:29:53.823 に答える
22

あなた自身のロール:

function Count(text) 
{
    //asp.net textarea maxlength doesnt work; do it by hand
    var maxlength = 2000; //set your value here (or add a parm and pass it in)
    var object = document.getElementById(text.id)  //get your object
    if (object.value.length > maxlength) 
    {
        object.focus(); //set focus to prevent jumping
        object.value = text.value.substring(0, maxlength); //truncate the value
        object.scrollTop = object.scrollHeight; //scroll to the end to prevent jumping
        return false;
    }
    return true;
}

次のように呼び出します。

<asp:TextBox ID="foo" runat="server" Rows="3" TextMode="MultiLine" onKeyUp="javascript:Count(this);" onChange="javascript:Count(this);" ></asp:TextBox>
于 2011-03-31T14:53:41.447 に答える
5

カスタム属性 maxsize="100" を使用

<asp:TextBox ID="txtAddress" runat="server"  maxsize="100"
      Columns="17" Rows="4" TextMode="MultiLine"></asp:TextBox>
   <script>
       $("textarea[maxsize]").each(function () {
         $(this).attr('maxlength', $(this).attr('maxsize'));
         $(this).removeAttr('maxsize'); 
       });
   </script>

これはこのようにレンダリングされます

<textarea name="ctl00$BodyContentPlac
eHolder$txtAddress" rows="4" cols="17" id="txtAddress" maxlength="100"></textarea>
于 2014-05-07T07:22:27.690 に答える
4

javascript なしでテキストエリア (HTML5) の最大長をサポートするブラウザー (Firefox、Chrome、Safari) でこれを修正する別の方法は、System.Web.UI.WebControls.TextBox クラスのサブクラスを派生させ、Render メソッドをオーバーライドすることです。次に、オーバーライドされたメソッドで、通常どおりレンダリングする前に maxlength 属性を追加します。

protected override void Render(HtmlTextWriter writer)
{
    if (this.TextMode == TextBoxMode.MultiLine
        && this.MaxLength > 0)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, this.MaxLength.ToString());
    }

    base.Render(writer);
}
于 2012-04-05T12:39:37.823 に答える
3
$('#txtInput').attr('maxLength', 100);
于 2011-07-07T17:47:02.387 に答える
2

さまざまなアプローチを試しましたが、どのアプローチにも弱点がありました (つまり、カット アンド ペーストやブラウザーの互換性など)。これは私が現在使用しているソリューションです:

function multilineTextBoxKeyUp(textBox, e, maxLength) {
    if (!checkSpecialKeys(e)) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length) {
            textBox.value = textBox.value.substring(0, maxLength);
        }
    }
}

function multilineTextBoxKeyDown(textBox, e, maxLength) {
    var selectedText = document.selection.createRange().text;
    if (!checkSpecialKeys(e) && !e.ctrlKey && selectedText.length == 0) {
        var length = parseInt(maxLength);
        if (textBox.value.length > length - 1) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            else {
                e.returnValue = false;
            }
        }
    }
}

function checkSpecialKeys(e) {
    if (e.keyCode != 8 && e.keyCode != 9 && e.keyCode != 33 && e.keyCode != 34 && e.keyCode != 35 && e.keyCode != 36 && e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40) {
        return false;
    } else {
        return true;
    }
}

この場合、キーアップで multilineTextBoxKeyUp を呼び出し、キーダウンで multilineTextBoxKeyDown を呼び出しています。

myTextBox.Attributes.Add("onkeyDown", "multilineTextBoxKeyDown(this, event, '" + maxLength + "');");
myTextBox.Attributes.Add("onkeyUp", "multilineTextBoxKeyUp(this, event, '" + maxLength + "');");
于 2013-06-28T14:36:07.647 に答える
1

これを見てください。それを解決する唯一の方法は、あなたが試したようにJavaScriptを使用することです。

編集: イベントを keypressup に変更してみてください。

于 2009-08-26T12:30:49.440 に答える
0

JavaScript/Jquery の次の例はそれを行います-

<telerik:RadScriptBlock ID="RadScriptBlock1" runat="server">
<script type="text/javascript">
     function count(text, event) {

         var keyCode = event.keyCode;

         //THIS IS FOR CONTROL KEY
         var ctrlDown = event.ctrlKey;

         var maxlength = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val().length;

         if (maxlength < 200) {
             event.returnValue = true;
         }
         else {

             if ((keyCode == 8) || (keyCode == 9) || (keyCode == 46) || (keyCode == 33) || (keyCode == 27) || (keyCode == 145) || (keyCode == 19) || (keyCode == 34) || (keyCode == 37) || (keyCode == 39) || (keyCode == 16) || (keyCode == 18) ||
                 (keyCode == 38) || (keyCode == 40) || (keyCode == 35) || (keyCode == 36) || (ctrlDown && keyCode == 88) || (ctrlDown && keyCode == 65) || (ctrlDown && keyCode == 67) || (ctrlDown && keyCode == 86)) 

                  {
                 event.returnValue = true;
                  }

             else {

                 event.returnValue = false;
             }
         }

     }

     function substr(text)
      {
          var txtWebAdd = $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val();
          var substrWebAdd;
          if (txtWebAdd.length > 200) 
          {                 
              substrWebAdd = txtWebAdd.substring(0, 200);                                  
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val('');
              $("#<%=txtMEDaiSSOWebAddress1.ClientID%>").val(substrWebAdd); 

          }
     }                  

于 2012-01-17T13:52:11.433 に答える