Reputation: 49384
I am trying to hide a next button div
until the input in it is populated so I've added this code:
<script>
$(document).ready(function () {
if ($('#myDiv').val().length == 0) {
$('#next_btn').hide();
} else {
$('#next_btn').show();
}
});
</script>
Here is myDiv
<textarea id="myDiv"></textarea>
If hiding the next button div
but when I populate the input in #myDiv
the #next_btn
is not showing up.
Am I doing something wrong here?
Upvotes: 2
Views: 339
Reputation: 105029
You're only initially hiding your next element. You should also recheck on every change to your input value. Try this instead:
$(function(){
// bind a change event handler
$('#myDiv').change(function(){
this.value.length && $('#next_btn').show() || $('#next_btn').hide();
}).change(); // set initial state
});
I haven't used if
statement since you're doing simple one sentence stuff in each case. I've rather replaced it with a boolean expression. Boolean execution of the Javascript engine will ensure that only one jQuery selector will be executed, so there's also no need to cache next button element.
You can of course replace that one-liner with an if
like so:
if (this.value.length)
{
$('#next_btn').show();
}
else
{
$('#next_btn').hide();
}
Attaching a change event isn't everything. You need to set initial state as well when the page loads (or is being ready). My code does that by the last call to .change()
. This means that it first registers the handler and then invokes it as well.
toggle
with Boolean parameterThe whole thing can be replaced by this:
$(function(){
// bind a change event handler
$('#myDiv').change(function(){
$('#next_btn').toggle(!!this.value.length);
}).change(); // set initial state
});
It may not be that change event satisfies your requirements, because it fires after field looses focus. Maybe you should be using keypress
or keyup
events instead. But solution stays as is. Just replace event handler binding.
Upvotes: 4
Reputation: 2206
I'm assuming #myDiv is an input tag? Or there's an input inside the div? Try this:
var textarea = $("#myDiv");
textarea.change(function(){
if(this.value.length == 0)
textarea.hide();
else
textarea.show();
});
That will run the if when the input changes. Its important to rerun the code every time you have a change because the length is changing!
(note, it might be smart to give myDiv a better name because its not really a div but a textarea.)
update to remove extra jquery selections
Upvotes: 3
Reputation: 2029
did you place this piece of code within an onchange function?
$(document).ready(function() {
$('#myDiv').change(function() {
if(this.value.length == 0) {
$('#next_btn').hide();
} else {
$('#next_btn').show();
}
});
});
Does this work?
Upvotes: 1
Reputation: 145388
This is how it can be done it short way.
HTML:
<div id="myDiv">
<input value="Test" />
</div>
<button id="next_btn">Next</button>
JavaScript:
$(function() {
$("#myDiv input").on("keyup", function() {
$("#next_btn").toggle($.trim(this.value).length > 0);
});
});
DEMO: http://jsfiddle.net/LYtbJ/
Upvotes: 1
Reputation: 950
I think you are confusing your DIV (#myDiv
) with your input button:
if( $('#myDiv').find('.my-input-class').val().length == 0 ) {
$('#next_btn').hide();
} else {
$('#next_btn').show();
}
In here, I assume your input has a class 'my-input-class' and use find() to grab it. Also, I assume you have an event to listen for a user typing on your input box. Cheers.
Upvotes: 1
Reputation: 4908
Assusming that the input is directly inside myDiv
, I think what you mean to do is something like:
if ($('#myDiv > input').val().length == 0) {
$('#next_btn').hide();
} else {
$('#next_btn').show();
}
You are trying to check the value of an input rather than a div (which isn't possible anyway as far as I know).
Or you could simplify it some more and do !$('#myDiv > input').val()
instead of $('#myDiv > input').val().length == 0
.
Upvotes: 1