There's a widespread tendency to consider the
value property of a text field as an attribute instead of a simple property whose value is a string. Such property cannot have a primitive null value because the DOM specifications allow only nodes to have such a value. jQuery wraps the value property with its method val() and it uses the same principles. Let's see why an empty value of a text field cannot be null.
value is not an attribute node, but a property whose value is a string (string). So if you test this property against the null value, you won't get what you expect because this value applies to DOM nodes. For example:
<form action="#" method="get" id="test"> <div> <input type="text" name="q" id="q" /> <input type="submit" value="Search" /> </div> </form>
We can run the following test, using both jQuery and the DOM:
$(function() {
$('#test').submit(function(event) {
var $form = $(this);
var value = $('#q', $form).val();
var value2 = document.getElementById('q').value;
console.log(typeof value); // string
console.log(typeof value2); // string
event.preventDefault();
});
});
Either the text field has a value or not, the final result is always a string. So this is the correct check:
if(value == '' || value.length == 0) {
// message
}