web-dev-qa-db-ja.com

送信ボタンを無効/有効にするjQuery

私はこのHTMLを持っています:

<input type="text" name="textField" />
<input type="submit" value="send" />

どうすればこのようなことができますか。

  • テキストフィールドが空の場合は、送信を無効にする必要があります(disabled = "disabled")。
  • 無効な属性を削除するためにテキストフィールドに何かを入力したとき。
  • テキストフィールドが再び空になった(テキストが削除された)場合は、送信ボタンを再び無効にする必要があります。

私はこのようなことを試しました:

$(document).ready(function(){
    $('input[type="submit"]').attr('disabled','disabled');
    $('input[type="text"]').change(function(){
        if($(this).val != ''){
            $('input[type="submit"]').removeAttr('disabled');
        }
    });
});

…でもうまくいきません。何か案は?

749
kmunky

問題は、フォーカスが入力から離れたとき(たとえば、誰かが入力をクリックしたり、タブからタブを離したとき)にのみchangeイベントが発生することです。代わりにkeyupを使ってみてください。

$(document).ready(function() {
     $(':input[type="submit"]').prop('disabled', true);
     $('input[type="text"]').keyup(function() {
        if($(this).val() != '') {
           $(':input[type="submit"]').prop('disabled', false);
        }
     });
 });
1098
$(function() {
  $(":text").keypress(check_submit).each(function() {
    check_submit();
  });
});

function check_submit() {
  if ($(this).val().length == 0) {
    $(":submit").attr("disabled", true);
  } else {
    $(":submit").removeAttr("disabled");
  }
}
121
cletus

この質問は2歳ですが、それはまだ良い質問であり、Googleの最初の結果でした...しかし、既存の答えはすべて設定とremovingを推奨していますHTMLattribute(removeAttr( "disabled")) "disabled"、これは正しいアプローチではありません。属性とプロパティに関して多くの混乱があります。

HTML

マークアップの<input type="button" disabled>の「無効」 W3Cではboolean属性と呼ばれます

HTMLとDOM

見積もり:

プロパティはDOMにあります。属性はHTMLにあり、DOMに解析されます。

https://stackoverflow.com/a/7572855/664132

JQuery

関連:

それでも、checked属性について覚えておくべき最も重要な概念は、checkedプロパティに対応しないということです。 attributeは実際にdefaultCheckedプロパティに対応し、は初期値を設定するためだけに使用する必要がありますチェックボックスの。 checked属性値はチェックボックスの状態によって変化しませんが、checkedプロパティは変化します。したがって、チェックボックスがチェックされているかどうかを判断するクロスブラウザ互換の方法は、プロパティを使用することです...

関連:

一般に、プロパティは、シリアル化されたHTML属性を変更することなく、DOM要素の動的状態に影響します。例には、入力要素のvalueプロパティ、入力およびボタンのdisabledプロパティ、またはチェックボックスのチェックされたプロパティが含まれます。 .att()メソッドの代わりに、.prop()メソッドを使用して無効およびチェックを設定する必要があります。

$( "input" ).prop( "disabled", false );

概要

[...]フォーム要素の[...]無効状態などのDOMプロパティを変更するには、 。prop() メソッドを使用します。

http://api.jquery.com/attr/


質問の変更部分での無効化に関しては、「input」というイベントがありますが、 ブラウザサポートは制限されています であり、jQueryイベントではないため、jQueryは機能しません。 changeイベントは確実に機能しますが、要素がフォーカスを失うと発生します。そのため、この2つを組み合わせることができます(一部の人はキーアップと貼り付けを聞いています)。

ここに、私が意味することを示すためのテストされていないコードを示します。

$(document).ready(function() {
    var $submit = $('input[type="submit"]');
    $submit.prop('disabled', true);
    $('input[type="text"]').on('input change', function() { //'input change keyup paste'
        $submit.prop('disabled', !$(this).val().length);
    });
});
76
basic6

または、あらゆる小さなことにjQを使用したくない私たちにとっては:

document.getElementById("submitButtonId").disabled = true;
36
Paul

無効な属性の使用を削除するには、

 $("#elementID").removeAttr('disabled');

無効な属性の使用を追加する

$("#elementID").prop("disabled", true);

楽しい :)

35
Umesh Patil

eric、ユーザーがテキストを入力してからすべてのテキストを削除しても、あなたのコードは私にはうまくいかないようです。誰もが同じ問題を経験した場合私は別のバージョンを作成しました。ここで人々が行く:

$('input[type="submit"]').attr('disabled','disabled');
$('input[type="text"]').keyup(function(){
    if($('input[type="text"]').val() == ""){
        $('input[type="submit"]').attr('disabled','disabled');
    }
    else{
        $('input[type="submit"]').removeAttr('disabled');
    }
})
25
Archie1986

これが ファイル入力フィールド の解決策です。

ファイルが選択されていないときにファイルフィールドの送信ボタンを無効にするには、ユーザーがアップロードするファイルを選択した後に有効にします。

$(document).ready(function(){
    $("#submitButtonId").attr("disabled", "disabled");
    $("#fileFieldId").change(function(){
        $("#submitButtonId").removeAttr("disabled");
    });
});

HTML:

<%= form_tag your_method_path, :multipart => true do %><%= file_field_tag :file, :accept => "text/csv", :id => "fileFieldId" %><%= submit_tag "Upload", :id => "submitButtonId" %><% end %>
12
cider

このようなものを使うこともできます。

$(document).ready(function() {
    $('input[type="submit"]').attr('disabled', true);
    $('input[type="text"]').on('keyup',function() {
        if($(this).val() != '') {
            $('input[type="submit"]').attr('disabled' , false);
        }else{
            $('input[type="submit"]').attr('disabled' , true);
        }
    });
});

こちらが 実例

11
Sonu Sindhu

それはこのように動作します:

$('input[type="email"]').keyup(function() {
    if ($(this).val() != '') {
        $(':button[type="submit"]').prop('disabled', false);
    } else {
        $(':button[type="submit"]').prop('disabled', true);
    }
});

HTMLに 'disabled'属性があることを確認してください

10
H. Yang

ボタン自体がjQueryスタイルのボタン(.button()付き)の場合は、無効な属性を削除または追加した後に正しいクラスが追加または削除されるように、ボタンの状態を更新する必要があります。

$( ".selector" ).button( "refresh" );
8
Tom Chamberlain

フォームログインの場合:

<form method="post" action="/login">
    <input type="text" id="email" name="email" size="35" maxlength="40" placeholder="Email" />
    <input type="password" id="password" name="password" size="15" maxlength="20" placeholder="Password"/>
    <input type="submit" id="send" value="Send">
</form>

Javascript:

$(document).ready(function() {    
    $('#send').prop('disabled', true);

    $('#email, #password').keyup(function(){

        if ($('#password').val() != '' && $('#email').val() != '')
        {
            $('#send').prop('disabled', false);
        }
        else
        {
            $('#send').prop('disabled', true);
        }
    });
});
8
alditis

上記の回答では、メニューベースのカット/ペーストイベントのチェックも行っていません。以下は両方を実行するために使用するコードです。カットと過去のイベントは実際には変更が発生する前に発生するので、実際にはアクションはタイムアウトで発生します。タイムアウトはそれが発生するまで少し時間がかかります。

$( ".your-input-item" ).bind('keyup cut paste',function() {
    var ctl = $(this);
    setTimeout(function() {
        $('.your-submit-button').prop( 'disabled', $(ctl).val() == '');
    }, 100);
});
7
zippy

&else .ifあなたの入力が空であると仮定すれば、我々は単純に持つことができます。

  if($(#name).val() != '') {
                $('input[type="submit"]').attr('disabled' , false);
            }

そうでなければ、falseをtrueに変えることができます

5
Ajai

バニラJSソリューション。これは1つの入力だけではなくフォーム全体に対して機能します。

問題のJavaScriptタグを選択しました。

HTMLフォーム:

var form = document.querySelector('form')
    var inputs = form.querySelectorAll('input')
    var required_inputs = form.querySelectorAll('input[required]')
    var register = document.querySelector('input[type="submit"]')
    form.addEventListener('keyup', function(e) {
        var disabled = false
        inputs.forEach(function(input, index) {
            if (input.value === '' || !input.value.replace(/\s/g, '').length) {
                disabled = true
            }
        })
        if (disabled) {
            register.setAttribute('disabled', 'disabled')
        } else {
            register.removeAttribute('disabled')
        }
    })
<form action="/signup">
        <div>
            <label for="username">User Name</label>
            <input type="text" name="username" required/>
        </div>
        <div>
            <label for="password">Password</label>
            <input type="password" name="password" />
        </div>
        <div>
            <label for="r_password">Retype Password</label>
            <input type="password" name="r_password" />
        </div>
        <div>
            <label for="email">Email</label>
            <input type="text" name="email" />
        </div>
        <input type="submit" value="Signup" disabled="disabled" />
    </form>

いくつかの説明:

このコードでは、HTMLフォームにkeyupイベントを追加し、キーを押すたびにすべての入力フィールドをチェックします。少なくとも1つの入力フィールドが空であるかスペース文字のみを含む場合、無効な変数にtrueの値を割り当て、送信ボタンを無効にします。

必要な入力フィールドがすべて入力されるまで送信ボタンを無効にする必要がある場合は、次のように置き換えます。

inputs.forEach(function(input, index) {

と:

required_inputs.forEach(function(input, index) {

required_inputsは、必須入力フィールドのみを含む配列としてすでに宣言されています。

3
Alouani Younes

送信ボタンを有効または無効にするには、以下のコードを参照してください

名前フィールドと市フィールドに値がある場合は、送信ボタンのみが有効になります。

<script>
  $(document).ready(function() {
    $(':input[type="submit"]').prop('disabled', true);

    $('#Name').keyup(function() {
      ToggleButton();
    });
    $('#City').keyup(function() {
      ToggleButton();
    });

  });

function ToggleButton() {
  if (($('#Name').val() != '') && ($('#City').val() != '')) {
    $(':input[type="submit"]').prop('disabled', false);
    return true;
  } else {
    $(':input[type="submit"]').prop('disabled', true);
    return false;
  }
} </script>
<form method="post">

  <div class="row">
    <div class="col-md-4">
      <h2>Getting started</h2>
      <fieldset>
        <label class="control-label text-danger">Name</label>
        <input type="text" id="Name" name="Name" class="form-control" />
        <label class="control-label">Address</label>
        <input type="text" id="Address" name="Address" class="form-control" />
        <label class="control-label text-danger">City</label>
        <input type="text" id="City" name="City" class="form-control" />
        <label class="control-label">Pin</label>
        <input type="text" id="Pin" name="Pin" class="form-control" />
        <input type="submit" value="send" class="btn btn-success" />
      </fieldset>
    </div>
  </div>
</form>
2
Nitin Khachane

私はこれが私のユースケースに合うようにするために少し努力しなければなりませんでした。

送信前にすべてのフィールドに値が必要なフォームがあります。

これが私がしたことです:

  $(document).ready(function() {
       $('#form_id button[type="submit"]').prop('disabled', true);

       $('#form_id input, #form_id select').keyup(function() {
          var disable = false;

          $('#form_id input, #form_id select').each(function() {
            if($(this).val() == '') { disable = true };
          });

          $('#form_id button[type="submit"]').prop('disabled', disable);
       });
  });

ここに答えてくれてありがとう。

2
ringe

Alタイプの溶液が供給されています。だから私は別の解決策を試してみたい。入力フィールドにid属性を追加した方が簡単です。

<input type="text" name="textField" id="textField"/>
<input type="submit" value="send" id="submitYesNo"/>

今ここにあなたのjQueryがあります

$("#textField").change(function(){
  if($("#textField").val()=="")
    $("#submitYesNo").prop('disabled', true)
  else
    $("#submitYesNo").prop('disabled', false)
});
1
gdmanandamohon

私のプロジェクトからのこのスニペットを見てください

 $("input[type="submit"]", "#letter-form").on("click",
        function(e) {
             e.preventDefault();


$.post($("#letter-form").attr('action'), $("#letter-form").serialize(),
                 function(response) {// your response from form submit
                    if (response.result === 'Redirect') {
                        window.location = response.url;
                    } else {
                        Message(response.saveChangesResult, response.operation, response.data);
                    }
});
$(this).attr('disabled', 'disabled'); //this is what you want

操作が実行された後にボタンを無効にするだけです

$(this).attr('disabled', 'disabled');

1

無効にする:$('input[type="submit"]').prop('disabled', true);

有効にする:$('input[type="submit"]').removeAttr('disabled');

上記の有効化コードは、以下よりも正確です。

$('input[type="submit"]').removeAttr('disabled');

両方の方法を使用できます。

1