提问人:Akash KC 提问时间:1/30/2014 最后编辑:Akash KC 更新时间:1/30/2014 访问量:230
使用最接近的表单对象
Using closest for getting form object
问:
最近,我正在审查另一位程序员编写的客户端代码。我对用于获取表单对象的代码感到惊讶。
用于登录表单的 HTML
<form id="frm_login" action="">
<input type="text" name="username" id="username">
<input type="password" name="pwd" id="pwd">
</form>
他使用以下代码来获取表单对象
$frm = $("input[type='password']").closest("form");
但是有简单的代码可以获取我更喜欢的表单对象:
$frm = $("#frm_login");
在上述场景中,是否有任何理由使用最接近的获取表单对象?
我真的很想知道是否有任何性能问题。
答:
1赞
Adil
1/30/2014
#1
元素的 id 应该是唯一的。如果页面上有单个表单,则无需使用 nearest 将其与其父表单相关联。如果表单没有 id,那会更有意义。通过 id 获取表单似乎更直接、更快速。
如果有多个形式,并且必须获得元素存在的形式,那么使用最接近的形式是有意义的。这可以通过以下示例来理解。
Html 格式
<form id="frm_login1" action="">
<input type="text" name="username" id="username1" />
<input type="password" name="pwd" id="pwd1">
<table>
<tr>
<td>
<input type="text" class="myInputClass" />
</td>
</tr>
</table>
</form>
<form id="frm_login2" action="">
<input type="text" name="username" id="username2">
<input type="password" name="pwd" id="pwd2">
<table>
<tr>
<td>
<input type="text" class="myInputClass" />
</td>
</tr>
</table>
</form>
Java脚本
$("input[type='password']").closest("form").each(function(){
alert($(this).find('.myInputClass').val());
});
评论
0赞
Akash KC
1/30/2014
尽管如此,对于多个表单中的每个表单,ID 都是唯一的。为什么不将 $(“#frm_id”) 也用于多个表单?
0赞
Akash KC
1/30/2014
谢谢阿迪尔,但事实并非如此。
0赞
Adil
1/30/2014
不客气。您显示的代码是单行代码,没有提供足够的信息,为什么他会使用它。但我向你展示了一个可能的用途。
0赞
Rami.Q
1/30/2014
#2
正如其他人所说,如果你有 ID,就不需要使用 Nearest 来获取父表单。而且使用 ID 更快。
但是,在某些情况下,您需要使用最接近的来获取表单,例如,如果您编写一个通用函数来验证每个表单中的每个密码输入,在这种情况下,您不喜欢通过 ID 获取表单并搜索其子密码字段以防止自动提交,所以我猜是写代码的人, 正在这样做(在提交前验证密码的功能)
$("input[type='password']").each(function(){
$frm = .closest("form");
$frm.submit(function(event){
if( not valid password){
......
return false;
}
});
});
0赞
Govinda Rajbhar
1/30/2014
#3
如果页面上有单个表单,则无需使用 nearest 将其与其父表单相关联。如果表单没有 id,那会更有意义。通过 id 获取表单似乎更直接、更快速。
但是该方法非常酷且非常有用,尤其是当您开始处理事件委派时,其中事件被困在节点树中的级别高于触发事件的元素。Closest()
该方法在 DOM 树中搜索这些元素及其祖先,并从匹配的元素构造一个新的 jQuery 对象。closest()
评论
0赞
Akash KC
1/30/2014
谢谢GovindaRajbhar。我知道最接近的工作方式,但我对他解决上述问题的方法感到困惑。每个表单都有唯一的 ID。
评论
$("#frm_login")