Schaltfläche zum Deaktivieren / Aktivieren der Übermittlung von jQuery

811

Ich habe diesen HTML:

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

Wie kann ich so etwas machen:

  • Wenn das Textfeld leer ist, sollte die Übermittlung deaktiviert sein (disabled = "disabled").
  • Wenn etwas in das Textfeld eingegeben wird, um das deaktivierte Attribut zu entfernen.
  • Wenn das Textfeld wieder leer wird (der Text wird gelöscht), sollte die Senden-Schaltfläche wieder deaktiviert werden.

Ich habe so etwas versucht:

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

… Aber es funktioniert nicht. Irgendwelche Ideen?

kmunky
quelle
2
Verwenden Sie removeAttr ('disabled') nicht so. Verwenden Sie prop (), um den Status umzuschalten. Siehe meine Antwort oder die offizielle Dokumentation .
basic6

Antworten:

1195

Das Problem ist, dass das Änderungsereignis nur ausgelöst wird, wenn der Fokus von der Eingabe wegbewegt wird (z. B. wenn jemand auf die Eingabe klickt oder sie aus den Registerkarten entfernt). Versuchen Sie stattdessen, keyup zu verwenden:

$(document).ready(function() {
     $(':input[type="submit"]').prop('disabled', true);
     $('input[type="text"]').keyup(function() {
        if($(this).val() != '') {
           $(':input[type="submit"]').prop('disabled', false);
        }
     });
 });
Eric Palakovich Carr
quelle
2
ok, aber das Problem ist, wenn ich den letzten Buchstaben lösche, muss ich noch einmal drücken, um den leeren Wert zu erfassen und meine Schaltfläche zu deaktivieren, denn wenn ich die Rücktaste drücke, um den letzten Buchstaben zu löschen, ist mein Feld immer noch gefüllt, also mein Tastendruck wird erfasst und dann wird der Brief gelöscht. Also ... wie soll ich es richtig machen?
kmunky
1
Oh, ich entschuldige mich dafür, dass ich den Code nicht zuerst getestet habe. Wenn Sie den Tastendruck durch einen Tastendruck ersetzen, hilft das?
Eric Palakovich Carr
4
Was ist, wenn Sie den Wert des Feldes ohne Verwendung der Tastatur ändern?
Nathan
1
Dies funktioniert, scheint aber die CSS wegzulassen. Zum Beispiel $ ("# loginButton") aufrufen. Button (); on input id="loginButton" type="submit" name="Submit" value="Login" disabled>zeigt eine deaktivierte Schaltfläche mit deaktivierten CSS-Klassen an.
Gaʀʀʏ
39
Die Methode prop ('disabled', true) sollte gegenüber der Methode attr ('disabled', 'disabled') verwendet werden ( siehe Dokumentation zu prop ()
Martin,
129
$(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");
  }
}
Cletus
quelle
4
yap es funktioniert! aber ... eine Frage ... können Sie dies erklären: $ (": text"). keypress (check_submit) .each (function () {check_submit ();}); danke
kmunky
1
Das Problem bei diesem ist, dass das Tastendruckereignis von jQuery nicht konsistent ausgelöst wird, wenn die Rücktaste oder die Löschtaste gedrückt werden. Dies bedeutet, dass der Benutzer den Text zurücksetzen kann und die Funktion nicht aufgerufen wird, was ein UX-Fehler ist. Ich sehe Keyup als das Mittel, das die meisten Leute benutzen. Ich mag es nicht ganz; Ich möchte, dass das Feedback zu Keydown erfolgt, aber es ist ein bisschen schwierig, es durchzuziehen.
BobRodes
79

Diese Frage ist 2 Jahre alt, aber es ist immer noch eine gute Frage und es war das erste Google-Ergebnis ... In allen vorhandenen Antworten wird empfohlen , das HTML- Attribut (removeAttr ("disabled")) "disabled" festzulegen und zu entfernen , was nicht der Fall ist der richtige Ansatz. Es gibt viel Verwirrung in Bezug auf Attribut und Eigentum.

HTML

Das "deaktiviert" im <input type="button" disabled>Markup wird vom W3C als boolesches Attribut bezeichnet .

HTML vs. DOM

Zitat:

Eine Eigenschaft befindet sich im DOM. Ein Attribut befindet sich im HTML-Code, der im DOM analysiert wird.

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

JQuery

Verbunden:

Das wichtigste Konzept für das überprüfte Attribut ist jedoch, dass es nicht der überprüften Eigenschaft entspricht. Das Attribut entspricht tatsächlich der Eigenschaft defaultChecked und sollte nur zum Festlegen des Anfangswertes des Kontrollkästchens verwendet werden. Der aktivierte Attributwert ändert sich nicht mit dem Status des Kontrollkästchens, während dies bei der überprüften Eigenschaft der Fall ist. Daher ist die browserübergreifende Methode, um festzustellen, ob ein Kontrollkästchen aktiviert ist, die Verwendung der Eigenschaft ...

Relevant:

Eigenschaften wirken sich im Allgemeinen auf den dynamischen Status eines DOM-Elements aus, ohne das serialisierte HTML-Attribut zu ändern. Beispiele sind die value-Eigenschaft von Eingabeelementen, die deaktivierte Eigenschaft von Eingaben und Schaltflächen oder die aktivierte Eigenschaft eines Kontrollkästchens. Die Methode .prop () sollte verwendet werden, um deaktiviert und aktiviert anstelle der Methode .attr () zu setzen.

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

Zusammenfassung

Verwenden Sie die Methode .prop () , um [...] DOM-Eigenschaften wie den [...] deaktivierten Status von Formularelementen zu ändern .

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


Was den Teil zum Deaktivieren bei Änderung betrifft: Es gibt ein Ereignis namens "Eingabe", aber die Browserunterstützung ist begrenzt und es handelt sich nicht um ein jQuery-Ereignis, sodass jQuery nicht funktioniert. Das Änderungsereignis funktioniert zuverlässig, wird jedoch ausgelöst, wenn das Element den Fokus verliert. Man könnte also beide kombinieren (einige Leute hören auch auf Keyup und Paste).

Hier ist ein ungetesteter Code, der zeigt, was ich meine:

$(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);
    });
});
basic6
quelle
1
Vielen Dank für diese Informationen, aber es heißt nicht, ob die Verwendung des Attributs ein Problem verursacht, z. B. einen Verlust der browserübergreifenden Kompatibilität. Verursacht die Verwendung des Attributs tatsächlich ein Problem?
ChrisJJ
Upvoted, aber ich wäre auch interessiert, bestimmte Fälle zu kennen, in denen das Ändern des Attributs zu Problemen führt, wie @ChrisJJ erwähnte.
Armfoot
40

Um die Verwendung deaktivierter Attribute zu entfernen,

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

und um die Verwendung deaktivierter Attribute hinzuzufügen,

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

Genießen :)

Umesh Patil
quelle
35

oder für uns, die jQ nicht für jede Kleinigkeit verwenden möchten:

document.getElementById("submitButtonId").disabled = true;
Paul
quelle
55
Es ist großartig, dass Sie ein Javascript-Vegetarier sind und alles, aber das beantwortet die Frage überhaupt nicht .
Michelle
6
Diese Antwort mit 25 Upvotes erklärt viel beschissenen Code auf der ganzen Welt: /
o0 '.
26

Eric, Ihr Code schien für mich nicht zu funktionieren, wenn der Benutzer Text eingibt und dann den gesamten Text löscht. Ich habe eine andere Version erstellt, wenn jemand das gleiche Problem hatte. Hier geht's Leute:

$('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');
    }
})
Archie1986
quelle
14

Es wird so funktionieren:

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

Stellen Sie sicher, dass Ihr HTML-Code ein Attribut "deaktiviert" enthält

H. Yang
quelle
12

Hier ist die Lösung für das Dateieingabefeld .

So deaktivieren Sie eine Senden-Schaltfläche für ein Dateifeld, wenn keine Datei ausgewählt ist, und aktivieren Sie diese Option, nachdem der Benutzer eine Datei zum Hochladen ausgewählt hat:

$(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 %>
Apfelwein
quelle
11

Sie können auch so etwas verwenden:

$(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);
        }
    });
});

Hier ist ein Live-Beispiel

Sonu Sindhu
quelle
Dies ist derjenige, der für mich funktioniert. Ich habe die oben genannten getestet, aber es gab ein Problem mit ihnen. Danke Sonu!
Geeocode
10

Für die Formularanmeldung:

<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);
        }
    });
});
Alditis
quelle
8

Wenn es sich bei der Schaltfläche selbst um eine Schaltfläche im jQuery-Stil handelt (mit .button ()), müssen Sie den Status der Schaltfläche aktualisieren, damit die richtigen Klassen hinzugefügt / entfernt werden, sobald Sie das deaktivierte Attribut entfernt / hinzugefügt haben.

$( ".selector" ).button( "refresh" );
Tom Chamberlain
quelle
3
@The_Black_Smurf Ich habe es hinzugefügt, falls es jemandem in der Zukunft hilft - was ist der Schaden daran?
Tom Chamberlain
Beeindruckend. Leider funktioniert die automatische Aktualisierung von jQuery hier nicht. Vielen Dank!
ChrisJJ
7

In den obigen Antworten wird nicht auch nach menübasierten Ausschneide- / Einfügeereignissen gesucht. Unten ist der Code, mit dem ich beides mache. Beachten Sie, dass die Aktion tatsächlich mit einer Zeitüberschreitung ausgeführt wird, da der Schnitt und vergangene Ereignisse tatsächlich ausgelöst werden, bevor die Änderung vorgenommen wurde. Die Zeitüberschreitung gibt also etwas Zeit dafür.

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

Vanilla JS-Lösung. Es funktioniert für ein ganzes Formular, nicht nur für eine Eingabe.

In Frage ausgewähltes JavaScript-Tag.

HTML-Formular:

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>

Einige Erklärungen:

In diesem Code fügen wir ein Keyup-Ereignis im HTML-Formular hinzu und überprüfen bei jedem Tastendruck alle Eingabefelder. Wenn mindestens ein Eingabefeld leer ist oder nur Leerzeichen enthält, weisen wir der deaktivierten Variablen den wahren Wert zu und deaktivieren die Schaltfläche zum Senden.

Wenn Sie die Schaltfläche "Senden" deaktivieren müssen, bis alle erforderlichen Eingabefelder ausgefüllt sind, ersetzen Sie:

inputs.forEach(function(input, index) {

mit:

required_inputs.forEach(function(input, index) {

Dabei ist required_inputs bereits als Array deklariert, das nur erforderliche Eingabefelder enthält.

Alouani Younes
quelle
6

Wir können einfach haben, wenn & sonst. Wenn Ihre Eingabe leer ist, können wir haben

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

sonst können wir falsch in wahr verwandeln

Guvaliour
quelle
4

Deaktivieren: $('input[type="submit"]').prop('disabled', true);

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

Der obige Aktivierungscode ist genauer als:

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

Sie können beide Methoden verwenden.

Dharmendra Patel
quelle
Verwenden Sie zum Aktivieren einfach .prop ('disabled', false).
rahim.nagori
2

Ich musste ein bisschen arbeiten, um dies an meinen Anwendungsfall anzupassen.

Ich habe ein Formular, in dem alle Felder vor dem Absenden einen Wert haben müssen.

Folgendes habe ich getan:

  $(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);
       });
  });

Vielen Dank an alle für ihre Antworten hier.

klingeln
quelle
2

Bitte beachten Sie den folgenden Code, um die Schaltfläche Senden zu aktivieren oder zu deaktivieren

Wenn die Felder Name und Stadt einen Wert haben, wird nur die Schaltfläche Senden aktiviert.

<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>

Nitin Khachane
quelle
Um nicht wählerisch zu sein, sollten Sie nicht bis (mindestens) zum 2. Zeichen warten, bevor Sie die Schaltfläche aktivieren? ;-)
Chris Pink
1

Schauen Sie sich diesen Ausschnitt aus meinem Projekt an

 $("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

Deaktivieren Sie einfach die Schaltfläche, nachdem Ihre Operation ausgeführt wurde

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

Basheer AL-MOMANI
quelle
1

Alle Arten von Lösungen werden mitgeliefert. Ich möchte also eine andere Lösung suchen. Es ist einfach einfacher, wenn Sie idIhren Eingabefeldern ein Attribut hinzufügen .

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

Jetzt ist hier dein jQuery

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

Ich hoffe, dass der folgende Code jemandem hilft .. !!! :) :)

jQuery(document).ready(function(){

    jQuery("input[type=submit]").prop('disabled', true);

    jQuery("input[name=textField]").focusin(function(){
        jQuery("input[type=submit]").prop('disabled', false);
    });

    jQuery("input[name=textField]").focusout(function(){
        var checkvalue = jQuery(this).val();
        if(checkvalue!=""){
            jQuery("input[type=submit]").prop('disabled', false);
        }
        else{
            jQuery("input[type=submit]").prop('disabled', true);
        }
    });

}); /*DOC END*/
Mehul Soni
quelle