2

フォームに文字数制限のあるテキスト領域があり、文字数制限を超えた場合、または文字が入力されていない場合は、送信ボタンを無効にします。ユーザーがいくつかの文字を入力した後、テキスト領域を空のままにしてすべての文字を再度削除すると、チェックが行われているにもかかわらず、送信ボタンが有効のままになります。他のすべては私が期待するように機能します。シンプルなものに違いないけど、見えない…

HTML:

<textarea name="t" id="message-input-field" autofocus="autofocus" placeholder=""></textarea>
<input type="submit" value="Send" id="send-message-button" class="button"/>
<span id="counter"></span>

jQuery:

// Disable by default
$('#send-message-button').prop('disabled', true);

// Do stuff when there is textarea activity
$('#message-input-field').on("propertychange input textInput", function () {
    var charLimit = 140;
    var remaining = charLimit - $(this).val().length;
    if(remaining == charLimit) {
        console.log("disabling");
        // No characters entered so disable the button
        $('#send-message-button').attr('disabled', true);
    } if (remaining < 0) {
        // remaining = 0; // Prevents the counter going into negative numbers
        $('#counter').addClass("over-char-limit").text(remaining);
        $('#send-message-button').attr('disabled', true);
    } else {
        $('#send-message-button').removeAttr('disabled');
        $('#counter').removeClass("over-char-limit").text(remaining);
    }
});

CSS

.over-char-limit {
    color: red;
}

アップデート:

私は今私のためにうまくいく次のコードに落ち着きました。それはおそらくそれを行うための最も効率的でエレガントな方法ではありませんが、私の単純な考えでは、それは非常に明確で読みやすいです。ソリューションを手伝ってくれた@Tats_innitと@gdoronに感謝します。

// Disable the send button by default. Enable only when text entered.
$('#send-message-button').prop('disabled', true);

// Character counter logic on the 'send message' text area. Rules are:
// 1. Counter appears on any input of text (pasting or key strokes).
// 2. Counter can go into negative numbers but changes to red when it does.
// 3. 'Send' button disabled when limit exceeded or no characters entered. 
$('#message-input-field').on("propertychange input textInput", function() {

    var charLimit = 140;

    // Calculate how many characters remain (this could be a negative number)
    var remaining = charLimit - $(this).val().length;

    // Add the counter value to #counter
    $('#counter').text(remaining);

    if (remaining == charLimit) {
       // Disable the button as no characters entered
        $('#send-message-button').prop('disabled', true);
        $('#counter').removeClass("over-char-limit");
    } else if (remaining < 0) {
        // Disable the button as too many characters entered
        // remaining = 0; // Prevents the counter going into negative numbers
        $('#send-message-button').prop('disabled', true);
        $('#counter').addClass("over-char-limit");
    } else {
        // Happy case: characters have been entered but do not exceed limit
        $('#send-message-button').prop('disabled', false);
        $('#counter').removeClass("over-char-limit");
    }
});
4

4 に答える 4

3

動作デモ http://jsfiddle.net/M3WgK/1/ または http://jsfiddle.net/M3WgK/12/ (完全な動作を示すために 10 文字を使用) :)

カウンターを使用したさらなるデモ http://jsfiddle.net/M3WgK/15/

API の使用: http://api.jquery.com/prop/

また、2 つのブロックが必要な場合があることに注意してifください。これは、ロジックがデフォルトである===<、そうでない場合に 2 つ必要になる場合があるためです。

これが役に立ち、@Gdoronsの説明が有効で、.propここでよく読んでください: .prop() vs .attr()

コード

// Disable by default
$('#send-message-button').prop('disabled', true);

// Do stuff when there is textarea activity
$('#message-input-field').on("propertychange input textInput", function() {
    var charLimit = 140;
    var remaining = charLimit - $(this).val().length;

    if (remaining === charLimit) {
       // No characters entered so disable the button
        $('#send-message-button').prop('disabled', true);

    } else if (remaining < 0) {
        // remaining = 0; // Prevents the counter going into negative numbers
        $('#counter').addClass("over-char-limit").text(remaining);
        $('#send-message-button').prop('disabled', true);
    } else {
        $('#send-message-button').removeAttr('disabled');
        $('#counter').removeClass("over-char-limit").text(remaining);
    }
});​
于 2012-06-22T08:17:18.840 に答える
2

変化する:

$('#send-message-button').removeAttr('disabled');

に:

$('#send-message-button').prop('disabled', false);

属性を設定していません。次を変更しましたproperty:

$('#send-message-button').prop('disabled', true);

そして変更:

$('#send-message-button').attr('disabled', true);

に:

$('#send-message-button').prop('disabled', true);
于 2012-06-22T08:02:59.023 に答える
0

もっと単純なコードではないのはなぜですか?

$("#message-input-field").keyup(function() {
    var c = $(this).val().length;
    var ok = (c>0 && c<140);
    var button = $("#send-message-button");
    ok ? button.removeAttr('disabled') : button.attr("disabled",true);
    $("#counter").toggleClass("over-char-limit", !ok); // toggles class, easy way
} );​​​​​​​​​​​​​​​​​​

補足: ボタンは既に無効になっている状態から開始する必要があります (入力がないため)。また、クラスの変更とカウンターのコードを含める必要がありますが、それは簡単なはずです。必要な場合は助けを求めてください:)

于 2012-06-22T08:20:01.930 に答える
0

コードに問題はありません。ここでこれを見逃しているだけです::

if(remaining == charLimit) {.......} else if (remaining < 0) {

それで全部です。

if を使用したくない場合は、下に移動することをお勧めします。

if(remaining == charLimit) {}

if else ステートメントの下部に。

于 2012-06-22T08:24:55.280 に答える