2009-09-07 5 views
52

Sagen wir, ich habe folgendes:ein Ereignis mehrere Elemente an einem Anbringen gehen

var a = $("#a"); 
var b = $("#b"); 

//I want to do something as such as the following : 

$(a,b).click(function() {/* */}); // <= does not work 

//instead of attaching the handler to each one separately 

Offensichtlich ist die oben nicht, weil in der $ Funktion nicht funktioniert, ist das zweite Argument der context, nicht ein weiteres Element.

Wie kann ich das Ereignis auf einmal an beide Elemente anhängen?


[Update]

peirix veröffentlichte einen interessanten Schnipsel, in dem er Element mit dem & Zeichen kombiniert; Aber etwas bemerkte ich diese:

$(a & b).click(function() { /* */ }); // <= works (event is attached to both) 

$(a & b).attr("disabled", true); // <= doesn't work (nothing happens) 

Von dem, was Sie oben sehen können, offenbar, die Kombination mit dem & Zeichen funktioniert nur, wenn Ereignisse Anbringen ...?

+0

funktionierte nicht mit jquery 1,7 – drogon

+0

Was nicht? Die Schnipsel, die ich in meiner Frage habe, sind alle ungültig. Werfen Sie einen Blick auf Gareths Antwort auf die richtige Antwort. –

Antwort

88

Die jQuery add method ist, was Sie wollen:

mehr Elemente fügt, um den gegebenen Ausdruck abgestimmt, auf den Satz von abgestimmten Elementen

var a = $("#a"); 
var b = $("#b"); 
var combined = a.add(b) 
+7

Wollte mehr als 1 Element hinzufügen, also habe ich varcombined = a.add (b, c, d) es funktioniert nicht, du musst ein tun. add (b) .add (c) .add (d) –

8

Sie könnten nur sie in einem Array setzen:

$.each([a, b], function() 
{ 
    this.click(function() { }); 
}); 
+0

Hoppla, mischte die Syntax mit der jeweils anderen() - probiere jetzt – Greg

0

versuchen Sie das: süß und einfach.

var handler = function() { 
    alert('hi!'); 
} 
$.each([a,b], function() { 
    this.click(handler); 
} 

Übrigens ist diese Methode das Problem nicht wert.

Wenn Sie bereits wissen, dass es nur zwei dieser Methoden sind, dann denke ich, die beste Wette

a.click(handler); 
b.click(handler); 

Prost sein würde!

2

Ich habe gerade versucht, mit diesem Herumspielen und fand etwas sehr cool:

$(a & b).click(function() { /* WORKS! */ }); 

supersweet!

Edit: Jetzt fühle ich mich wirklich peinlich dafür, dies nicht richtig zu testen. Was das tat, war eigentlich, das Click-Ereignis auf alles alles zu setzen ... Nicht sicher, warum es das tut, obwohl ...

+0

peirix, siehe meinen aktualisierten Beitrag –

+0

@peirix: '&' ist für bitweises Arbeiten mit Zahlen. –

+0

Aber das erklärt nicht, warum die ganze Seite das Click Event bekommen hat? Es sollte einfach nicht hinzugefügt werden, oder? – peirix

38

Vergessen Sie nicht, dass entweder jQuery Selektoren die CSS-Kommasyntax unterstützen. Wenn Sie zwei beliebige Sammlungen kombinieren müssen, sind alle anderen Vorschläge auf der Marke, aber wenn es so einfach ist, etwas mit Elementen mit den IDs a und b zu tun, verwenden Sie $('#a,#b').

+3

ja ich weiß darüber, aber mein Problem ist, wenn sie bereits in Variablen sind –

16

hat diese Frage bereits beantwortet, aber ich denke, eine einfachere schlankere Weise das gleiche Ziel zu erreichen, auf die Ähnlichkeiten zwischen jQuery und Wähler Modell CSS und nur das tun, wäre zu verlassen:

$("#a, #b").click(function() {/* */}); 

Ich benutze dies häufig, und habe es noch nie funktioniert (ich kann nicht für jQuery-Versionen vor 1.3.2 sprechen, obwohl ich das dort nicht getestet habe). Hoffentlich hilft das jemandem irgendwann.


UPDATE: Ich las gerade den Faden, und verpasste den Kommentar Sie gemacht, um die Knoten in Frage, die bereits auf Variablen gespeichert ab, aber dieser Ansatz wird immer noch funktionieren, mit einem kleineren tweek. Sie tun möchten:

var a = $("#a"); 
var b = $("#b"); 
$(a.selector+", "+b.selector).click(function() {/* */}); 

Einer der coolen Dinge, dass Jquery tut, ist, dass es ein paar jquery spezifischen Eigenschaften an den Knoten hinzufügt, die es (Selektor zurückgibt, die die ursprüngliche Selektor ist, dass der Knoten zu greifen verwendet ist einer von ihnen). Möglicherweise treten dabei Probleme auf, wenn der von Ihnen verwendete Selektor bereits Kommas enthält. Es ist wahrscheinlich auch fraglich, ob dies einfacher ist, als nur add, aber es ist ein lustiges Beispiel dafür, wie cool jquery sein kann :).

+0

Dieser Ansatz wird Jquery machen, um den gesamten DOM-Baum für den gegebenen Selektor neu zu betrachten. Es ist zusätzlicher Aufwand. –

4

Warum verwenden Sie kein Array? Dies funktioniert auf meiner Seite:

$([item1, item2]).on('click', function() { 
     // your logic 
}); 
+0

Dies funktioniert nur, wenn item1 und item2 DOM-Elemente und keine jQuery-Objekte sind: http://api.jquery.com/jQuery/#jQuery-ElementArray. –

+0

@SteelRat, hmm .. Ich versuche mich zu erinnern, an was ich es getestet habe. Aber es war lange her. Wenn es also ein jQuery-Objekt ist, dann sollte es funktionieren mit: $ ([item1 [0], item2 [0]]) on ('click', function() { // Ihre Logik }); –

2

Sie können auch einen Klassennamen bilden und jedes Element geben, das Sie mit dieser Klasse arbeiten wollen. Dann können Sie das Ereignis an alle Elemente binden, die diese Klasse teilen.

<p><a class="fakeClass" href="#">Click Me!</a></p> 

<p><a class="fakeClass" href="#">No, Click Me!</a></p> 

<div class="fakeClass">Please, Click Me!</div> 

<script type="text/javascript"> 
    $(function() { 
     $(".fakeClass").on("click", function() { 
      alert("Clicked!"); 
     }); 
    }) 
</script> 
0

Beispiel:

$("[name=ONE_FIELD_NAME], [name=ANOTHER_FIELD_NAME]").keypress(function(e){alert(e.which);}); 
Verwandte Themen