Отключение кнопки Отправить, пока все поля не будут иметь значения
Я хочу отключить кнопку отправки, пока все поля не будут иметь значения.. как я могу это сделать?
<html>
<head>
<title></title>
<style type="text/css">
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#register').attr("disabled", true);
});
</script>
</head>
<body>
<form>
Username<br />
<input type="text" id="user_input" name="username" /><br />
Password<br />
<input type="text" id="pass_input" name="password" /><br />
Confirm Password<br />
<input type="text" id="v_pass_input" name="v_password" /><br />
Email<br />
<input type="text" id="email" name="email" /><br />
<input type="submit" id="register" value="Register" />
</form>
<div id="test">
</div>
</body>
</html>
7 ответов:
зацените jsfiddle.
HTML
// note the change... I set the disabled property right away <input type="submit" id="register" value="Register" disabled="disabled" />
JavaScript
(function() { $('form > input').keyup(function() { var empty = false; $('form > input').each(function() { if ($(this).val() == '') { empty = true; } }); if (empty) { $('#register').attr('disabled', 'disabled'); // updated according to http://stackoverflow.com/questions/7637790/how-to-remove-disabled-attribute-with-jquery-ie } else { $('#register').removeAttr('disabled'); // updated according to http://stackoverflow.com/questions/7637790/how-to-remove-disabled-attribute-with-jquery-ie } }); })()
хорошая вещь в этом заключается в том, что не имеет значения, сколько полей ввода у вас есть в вашей форме, он всегда будет держать кнопку отключена, если есть по крайней мере 1, который пуст. Он также проверяет пустоту на
.keyup()
, который я думаю, делает его более удобным для использования.
$('#user_input, #pass_input, #v_pass_input, #email').bind('keyup', function() { if(allFilled()) $('#register').removeAttr('disabled'); }); function allFilled() { var filled = true; $('body input').each(function() { if($(this).val() == '') filled = false; }); return filled; }
JSFiddle с вашим кодом, работает :)
все переменные кэшируются, поэтому событие loop и keyup не должно создавать объект jQuery каждый раз, когда он запускается.
var $input = $('input:text'), $register = $('#register'); $register.attr('disabled', true); $input.keyup(function() { var trigger = false; $input.each(function() { if (!$(this).val()) { trigger = true; } }); trigger ? $register.attr('disabled', true) : $register.removeAttr('disabled'); });
Проверьте рабочий пример в http://jsfiddle.net/DKNhx/3/
для всех решений вместо ".клавиша вверх" ".изменить " следует использовать, иначе кнопка отправки не будет отключена, когда кто-то просто выбирает данные, хранящиеся в файлах cookie для любого из текстовых полей.
DEMO:http://jsfiddle.net/kF2uK/2/
function buttonState(){ $("input").each(function(){ $('#register').attr('disabled', 'disabled'); if($(this).val() == "" ) return false; $('#register').attr('disabled', ''); }) } $(function(){ $('#register').attr('disabled', 'disabled'); $('input').change(buttonState); })
рытье могилы... Мне нравится другой подход:
elem = $('form') elem.on('keyup','input', checkStatus) elem.on('change', 'select', checkStatus) checkStatus = (e) => elems = $('form').find('input:enabled').not('input[type=hidden]').map(-> $(this).val()) filled = $.grep(elems, (n) -> n) bool = elems.size() != $(filled).size() $('input:submit').attr('disabled', bool)
я переработал выбранный ответ здесь и улучшил его. Выбранный ответ работает только при условии, что у вас есть одна форма на странице. Я решил это для нескольких форм на одной странице (в моем случае у меня есть 2 модала на одной странице), и мое решение проверяет только значения в обязательных полях. Мое решение изящно ухудшается, если JavaScript отключен и включает в себя плавную кнопку CSS fade transition.
см. рабочий пример JS fiddle: https://jsfiddle.net/bno08c44/4/
JS
$(function(){ function submitState(el) { var $form = $(el), $requiredInputs = $form.find('input:required'), $submit = $form.find('input[type="submit"]'); $submit.attr('disabled', 'disabled'); $requiredInputs.keyup(function () { $form.data('empty', 'false'); $requiredInputs.each(function() { if ($(this).val() === '') { $form.data('empty', 'true'); } }); if ($form.data('empty') === 'true') { $submit.attr('disabled', 'disabled').attr('title', 'fill in all required fields'); } else { $submit.removeAttr('disabled').attr('title', 'click to submit'); } }); } // apply to each form element individually submitState('#sign_up_user'); submitState('#login_user'); });
CSS
input[type="submit"] { background: #5cb85c; color: #fff; transition: background 600ms; cursor: pointer; } input[type="submit"]:disabled { background: #555; cursor: not-allowed; }
HTML
<h4>Sign Up</h4> <form id="sign_up_user" data-empty="" action="#" method="post"> <input type="email" name="email" placeholder="Email" required> <input type="password" name="password" placeholder="Password" required> <input type="password" name="password_confirmation" placeholder="Password Confirmation" required> <input type="hidden" name="secret" value="secret"> <input type="submit" value="signup"> </form> <h4>Login</h4> <form id="login_user" data-empty="" action="#" method="post"> <input type="email" name="email" placeholder="Email" required> <input type="password" name="password" placeholder="Password" required> <input type="checkbox" name="remember" value="1"> remember me <input type="submit" value="signup"> </form>