2010-10-10 6 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() { 
}); 

et cela aussi:Quelle est la meilleure abréviation de cette instruction jQuery?

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

Par exemple, une abréviation pourrait être:

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

Répondre

0

Essayez:

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

pour la seconde, que vous essayez d'utiliser les deux sur la même page?

2

Je ne changerais pas le premier car il est efficace comme il est. Il peut être plus court en utilisant:

$('[role=submit_action]') 

..mais qui nécessite la traversée de chaque élément DOM qui le ralentit considérablement. Vous pouvez utiliser commence avec le sélecteur dans le second exemple, qui pourrait encore être Allright:

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

Quoi qu'il en soit, si elle est pas cassé, ne le répare pas. :)

+0

C'est lent ............ –

+0

@Cris: Combien de HTML avez-vous exactement ?! J'ai du mal à croire que c'est un goulot d'étranglement. – mpen

+0

c'est bien, mais qu'en est-il INPUT, DIV, SPAN, A ???: $ ('(entrée | span | a | div) [rôle^= soumettre_]') ----> Comme ça ... C'est possible? –

5

J'utilise .delegate() ici pour l'efficacité (pour ne pas traverser tous les éléments DOM exécutant le sélecteur initialement), comme ceci:

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

La différence ici est que, contrairement à .live(), il est beaucoup moins cher sur démarrage, puisque $("role=submit_action]") (même avant un appel .live()) doit itérer sur tous les éléments dans la vérification DOM pour l'attribut role, vous contournerez cette dépense avec .delegate().

Puisque la performance est une préoccupation, ne prenez pas ma parole, testez vous-même ici:
http://jsperf.com/live-vs-delegate-test

+0

C'est lent ............ –

+1

@Cris - C'est * très * rapide, en fait beaucoup plus rapide que toutes les autres approches listées ici, dites-vous que c'est lent parce que vous l'avez déjà fait quelque part ou parce que vous l'avez testé? :) –

+0

Je l'ai testé ... Quoi de plus rapide? $ ('. searchme') ou $ ('[role = searchme]') ??? la deuxième option est plus rapide, vous le savez, mais je pense que c'est plus rapide: $ ('input [role = searchme]') ... qu'en penses-tu? –

2

A condition que pas d'autres éléments peuvent avoir cette role, vous pouvez écrire le sélecteur comme

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

Cependant, je ne voudrais pas, car il fait une recherche assez coûteuse avant de lier la fonction. Utilisez delegate à la place:

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

C'est fonctionnellement équivalent, sauf qu'il ne nécessite pas un coûteux DOM traversal avant de se lier au gestionnaire.

Questions connexes