2016-06-29 12 views
2

Ich habe eine Reihe von Spannen der Klasse = "ändern" und jeder hat eine eindeutige ID. Ich habe eine Reihe von diesen Spannweiten mit:Finden Sie den Index eines Elements in einem Array erstellt von toArray in JS/JQuery

var changesArray = $('.change').toArray() 

ich den Index der Spanne in der Anordnung in der Lage sein wollen, wenn ich darauf klicken. Ich habe versucht:

$('.change').click(function(){ 
    var thisChange = $(this).attr('id'); 
    var thisChangeIndex = $.inArray(thisChange,changesArray); 
}); 

Aber alles, was ich bekomme, ist -1 für jede .change ich klicke auf.

Ich bin ein bisschen ein Neuling mit dieser Art von Code. Hilfe?

+0

toArray gibt ein Array von DOM-Knoten zurück. – jcubic

Antwort

4

Die toArray Methode sagt

die alle Elemente in der jQuery Satz enthaltenen Retrieve als Array.

Sie suchen nach einer bestimmten id im Array - das wird nie funktionieren.

Wenn Sie den Index des Elements möchten, können Sie .index()

$('.change').click(function(){ 
 
    var thisChangeIndex = $('.change').index(this); 
 
    console.log(thisChangeIndex); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div> 
 
    <span class="change">change1</span> 
 
    <span class="change">change2</span> 
 
    <span class="change">change3</span> 
 
    <span class="change">change4</span> 
 
</div> 
 
<div> 
 
    <span class="change">change5</span> 
 
    <span class="change">change6</span> 
 
    <span class="change">change7</span> 
 
    <span class="change">change8</span> 
 
</div>

+0

Also brauche ich wirklich kein Array. Huh. Nun, das macht die Dinge ein bisschen einfacher. – JoshWeinstein

+0

Es funktionierte perfekt für meine Bedürfnisse. Vielen Dank! – JoshWeinstein

-1

verwenden Wenn Sie toArray nennen Sie ein Array aller DOM-Knoten erhalten, nicht die jquery Objekte. Sie können auf this statt $(this) suchen:

var changesArray = $('.change').click(function(){ 
    var thisChangeIndex = $.inArray(this,changesArray); 
}).toArray(); 
+0

Ein Kommentar ohne Kommentar. Wie humorvoll. Da der Code selbst funktioniert, wäre es schön, wenn der Wähler sich äußern würde? Diese Version sucht die '.change' Elemente nicht extra und ist so näher an der ursprünglichen Frage. (Natürlich könnte das auch ohne toArray und Pufferung des jQuery-Objekts geschehen, aber das ist neben dem Punkt) –

+0

Ich bin mir nicht sicher, ob ich das brauche, denn wenn ich das richtig lese, erzeugt es nur das Array mit dem Klick Ereignis, oder? Ich brauche das Array für einige andere Funktionen auch unabhängig von diesem bestimmten Klickereignis. – JoshWeinstein

+2

@Josh nein, du täuschst dich - das 'toArray' ist einfach angekettet nach der Erstellung eines 'click'-Ereignisses - also bleibt das Array für den späteren Gebrauch erhalten und wird auch im Event-Handler verwendet – Jamiec

0

Sie nur eine einfache Anordnung von der einzigartigen IDs behalten sollte:

var changesArrayIds = $('.change').toArray().map(function(x) { return x.id; }); 

Dann sollte diese Zeile funktionieren: Wenn

var thisChangeIndex = $.inArray(thisChange, changesArrayIds); 
0

Sie bestehen darauf, .toArray zu verwenden, das funktioniert http://codepen.io/8odoros/pen/JKWxqz

var changesArray = $('.change').toArray(); 
$('.change').click(function(){ 
    var thisChange = $(this).attr('id'); 
    var thisChangeIndex = -1; 
    $.each(changesArray, function(i, val) { 
     if(thisChange==val.id) thisChangeIndex= i; 
    }); 
    console.log(thisChangeIndex); 
}); 
+0

Das hat auch funktioniert! Vielen Dank! – JoshWeinstein

+0

Können Sie erklären, was in der Funktion $ .each passiert? – JoshWeinstein

+1

[Aktivieren Sie diese] (http://api.jquery.com/jquery.each/), iteriert es über die Objekte des Arrays. Ruft zwei Parameter (hier "i" und "val") ab, die den aktuellen Index und das aktuelle Objekt beibehalten. –

Verwandte Themen