2009-07-23 87 views
2

是否有更好的方法來做到這一點jQuery的選擇:有沒有更好的方法來做這個jQuery選擇?

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

我結合我的功能,HideDynamicFormError,爲文本框和文本域和焦點模糊事件,然後單擊其他表單輸入元素的事件。

這是行得通的,但我仍然在jQuery中弄到東西,並想知道是否有更好的方法來做到這一點?

+0

我只是不得不發表評論,並說我愛你的名字/頭像組合。另外值得一提的是,如果你不得不通過大量的代碼,這會大大減緩一切。 – Sneakyness 2009-07-23 22:08:40

+0

@Sneakyness - 謝謝!你會做什麼呢?我還應該指出,DynFieldWrapper類適用於動態生成的表單域。通常不會在頁面上的許多字段,但它是可能的。我爲性能所做的另一件事是,當調用HideDynamicError時,我調用$(this).unbind,以便它不會被再次調用該特定元素。 – 2009-07-24 12:46:16

回答

1

第一個可以稍微簡單:

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

其他,你做得很好。

1

我會忍不住要做到這一點:

我不知道(性能明智)如何與此相比,你在做什麼。它可能會更好。它可能更糟。這值得測試。

你在做什麼沒有問題。我只是不確定所有p發現有多快,加上尋找表單元素的所有子樹遍歷。它可能很大程度上取決於文檔和相關子樹的大小。

0

您也可以使用bind()將事件處理程序綁定到多個事件。使用p.DynFieldWrapper作爲上下文可能會更快,但您需要進行性能測試。

$("input:not(:text,:textarea)", "p.DynFieldWrapper") 
    .bind("focus click", HideDynamicFormError); 
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); 
      } 

     } 
    ); 
相關問題