2010-10-10 39 views
0
$("input[role=submit_action], button[role=submit_action], div[role=submit_action], span[role=submit_action], a[role=submit_action]").live( "click", function() { 
}); 

這也太:這個jQuery指令的最佳縮寫是什麼?

$("input[role=submit_action], input[role=submit_require]").live( "click", function() { 
    if ($(this).attr('role') == "submit_action") { 
      // do this... 
    } 
    else { 
      // do this... 
    } 
}); 

例如縮寫可以是:

$("input[role=(submit_action|submit_require)]" 

回答

0

嘗試:

$("[role=submit_action]").live("click", function() { 
//... 
}); 

爲第二個,你想同時使用在同一頁上?

2

我不會改變第一個,因爲它是有效的方式。它可以縮短使用:

$('[role=submit_action]') 

..但是這將需要遍歷DOM中的每個元素,這將顯着減慢它。您可以在第二個例子中使用開始於選擇,這可能仍然是還好吧:

$('input[role^=submit_]')... 

不管怎麼說,如果不破,不解決它。 :)

+0

這很慢............ – 2010-10-10 21:23:59

+0

@Cris:你有多少HTML準確?!我很難相信這是一個瓶頸。 – mpen 2010-10-10 21:30:27

+0

這很好,但是INPUT,DIV,SPAN,A ???:$('(input | span | a | div)[role^= submit_]')---->像這樣......它是可能? – 2010-10-10 21:33:20

5

我會使用.delegate()這裏效率(不遍歷所有的DOM元素開始執行的選擇),就像這樣:

$(document.body).delegate("[role=submit_action]", "click", function() { 
    //do stuff 
}); 

這裏的區別是,不像.live(),它的便宜了很多因爲$("role=submit_action]")(甚至在調用.live()之前)必須遍歷DOM中檢查role屬性的所有元素,所以您繞過.delegate()的這一開銷。

由於性能是一個問題,不要把我的話,你自己在這裏測試:
http://jsperf.com/live-vs-delegate-test

+0

這很慢............ – 2010-10-10 21:24:35

+1

@Cris - 它*非常*快,實際上比這裏列出的其他方法快得多,你是說它很慢,因爲你已經準備好了嗎? ,還是因爲你測試過了? :) – 2010-10-10 21:26:18

+0

我測試了它...什麼更快? $('。searchme')或$('[role = searchme]')???第二個選項更快,你知道,但我認爲它更快:$('input [role = searchme]')...你怎麼看? – 2010-10-10 21:31:12

2

前提是沒有其他元素可以有這個role,你可以選擇寫成

$("[role=submit_action]").live( "click", function() {}); 

但是,我不會,因爲它會在綁定函數之前進行相當昂貴的搜索。使用delegate代替:

$('body').delegate('[role=submit_action]','click',function() {}); 

這是相同的功能,但它不綁定處理程序之前需要昂貴的DOM遍歷。

相關問題