使用最接近的表单对象

Using closest for getting form object

提问人:Akash KC 提问时间:1/30/2014 最后编辑:Akash KC 更新时间:1/30/2014 访问量:230

问:

最近,我正在审查另一位程序员编写的客户端代码。我对用于获取表单对象的代码感到惊讶。

用于登录表单的 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");

在上述场景中,是否有任何理由使用最接近的获取表单对象?

我真的很想知道是否有任何性能问题。

JavaScript jQuery 性能 DOM 客户端

评论

0赞 Steven Wexler 1/30/2014
无论哪种方式,您都不应该注意到性能问题。它们都很快。 可能稍快一些。$("#frm_login")
0赞 Deepak Ingole 1/30/2014
当你有ID选择器时,为什么最接近..
0赞 Akash KC 1/30/2014
我对我的方法更有信心,但我只想知道他为什么使用这种方法。
1赞 Satpal 1/30/2014
一种可能性是,最初形式没有 id,因此他使用了 closest。我觉得应用程序是逐渐演变的。有一件事是肯定的,如果他如何使用 closest(),他肯定知道如何使用 id-selector
1赞 Subek Shakya 1/30/2014
壁橱主要在动态生成表单/元素而不是使用 id 时有用。

答:

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。