我正在尝试使用 jQuery 来构建一个自制的验证器。我想我在 jQuery 中发现了一个限制:将 jQuery 值分配给 json 变量,然后使用 jQuery 向当前页面添加更多适合该变量查询的 DOM 元素时,似乎没有办法访问那些 DOM添加到适合 json 变量查询的页面的元素。
请考虑以下代码:
var add_form = {
$name_label: $("#add-form Label[for='Name']"),
$name: $("#add-form #Name"),
$description_label: $("#add-form Label[for='Description']"),
$description: $("#add-form #Description"),
$submit_button: $("#add-form input#Add"),
$errors: $("#add-form .error"),
error_marker: "<span class='error'> *</span>"
}
function ValidateForm() {
var isValid = true;
add_form.$errors.remove();
if (add_form.$name.val().length < 1 ) {
add_form.$name_label.after(add_form.error_marker);
isValid = false;
}
if (add_form.$description.val().length < 1) {
add_form.$description_label.after(add_form.error_marker);
isValid = false;
}
return isValid
}
$(function(){
add_form.$submit_button.live("click", function(e){
e.preventDefault();
if(ValidateForm())
{
//ajax form submission...
}
});
})
这里有一个例子:http: //jsfiddle.net/Macxj/3/
首先,我创建了一个 json 变量来表示 html 添加表单。然后,我创建了一个函数来验证表单。最后,我将表单提交按钮的单击事件绑定到验证表单。
请注意,我使用 jQuery after() 方法在表单中的每个无效字段标签之后放置一个包含“*”的跨度。另请注意,在重新验证之前,我从表单中清除了先前提交尝试的星号(这就是失败的原因)。
显然,调用 add_form.$errors.remove(); 不起作用,因为 $errors 变量仅指向在创建时与其查询匹配的 DOM 元素。在那个时间点,所有标签都没有以 error_marker 变量为后缀。
因此,jQuery 变量在尝试删除它们时无法识别其查询的匹配元素,因为在首次分配变量时它们不存在。如果 jQuery 变量有一个eval()方法来重新评估其包含的查询以查看是否有任何新的 DOM 元素匹配它,那就太好了。可惜...
有什么建议么?
提前致谢!