有没有更好的方法来做这个jQuery选择?

时间:2009-07-23 15:09:04

标签: jquery

有没有更好的方法来进行jQuery选择:

$("p.DynFieldWrapper :input:not(:text):not(textarea)").focus(HideDynamicFormError).click(HideDynamicFormError);
$("p.DynFieldWrapper :text,p.DynFieldWrapper textarea").blur(HideDynamicFormError);

我将我的函数HideDynamicFormError绑定到textboxes和textareas的blur事件以及其他表单输入元素的焦点和单击事件。

这是有效的,但我仍然在jQuery中掌握一些东西,并且想知道是否有更好的方法来做到这一点?

4 个答案:

答案 0 :(得分:1)

第一个可以更简单一点:

$("p.DynFieldWrapper :input:not(:text,textarea)")

除此之外,你做得很好。

答案 1 :(得分:1)

我很想这样做:

$("p.DynFieldWrapper :input").each(function() {
  if ($(this).is(":text") || $(this).is("textarea")) {
    $(this).blur(HideDynamicFormError);
  } else {
    $(this).focus(HideDynamicFormError).click(HideDynamicFormError);
  }
});

我不知道(性能方面)与你正在做的事情相比如何。它可能会更好。情况可能更糟。不过值得测试。

你正在做的事情没有错。我只是不确定所有p找到的速度加上寻找表单元素的所有子树遍历都将是。它可能取决于文档的大小和相关的子树。

答案 2 :(得分:0)

您也可以使用bind()将事件处理程序绑定到多个事件。使用p.DynFieldWrapper作为上下文也可能更快,但您需要对此进行性能测试。

$("input:not(:text,:textarea)", "p.DynFieldWrapper")
    .bind("focus click", HideDynamicFormError); 

答案 3 :(得分:0)

合并上述所有答案+投入使用find的想法,这是怎么回事?

$('p.DynFieldWrapper :input')
    .find(':not(:text, textarea)')
       .bind('focus click', HideDynamicFormError)
    .end()
    .find(':text, textarea')
       .blur(HideDynamicFormError);

修改

另一个想法,只是为了好玩! (虽然我自己也不喜欢)

$('p.DynFieldWrapper :input')
    .bind('focus click blur',
        function(ev)
        {
            if($(this).is(':text, textarea'))
            {
                if(ev.type == 'blur')
                    HideDynamicFormError(ev);
            }
            else
            {
                if(ev.type != 'blur')
                    HideDynamicFormError(ev);
            }

        }
    );