2016-06-29 3 views
2

У меня есть пучок пролетов класса = «изменение», и каждый из них имеет уникальный идентификатор. Я создал массив этих пролетов с использованием:Найти индекс элемента в массиве, созданный toArray в JS/JQuery

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

Я хочу, чтобы иметь возможность получить индекс пролета в массиве, когда я нажимаю на него. Я пробовал:

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

Но все, что я получаю, равно -1 для каждого .change Я нажимаю.

Я немного новичок с этим типом кода. Помогите?

+0

toArray возвращает массив узлов DOM. – jcubic

ответ

4

Метод toArray говорит

Получить все элементы, содержащиеся в наборе JQuery, как массив.

Вы ищете конкретный id в массиве - это никогда не сработает.

Если вы хотите, чтобы индекс элемента, который вы можете использовать .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

Так что мне совсем не нужен массив. Да. Ну, это делает вещи немного проще. – JoshWeinstein

+0

Он отлично работал для моих нужд. Благодаря! – JoshWeinstein

-1

Когда вы звоните toArray, вы получите массив всех DOM узлов, а не JQuery объектов. Вы можете осуществлять поиск по this вместо $(this):

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

Слайд без комментария. Как смешно. Поскольку сам код работает, было бы неплохо, если бы избиратель хотел бы прокомментировать? Эта версия не делает дополнительного поиска элементов '.change' и таким образом ближе к исходному вопросу. (Конечно, то же самое можно было бы сделать без toArray и буферизации объекта jQuery, но это не так) –

+0

Я не уверен, что это то, что мне нужно, потому что, если я читаю это правильно, он создает только массив с щелкните событие, правильно? Мне нужен массив для некоторых других функций, а также независимо от этого конкретного события click. – JoshWeinstein

+2

@ Josh нет, вы ошибаетесь - «toArray» просто привязан после создания события «click», поэтому массив сохраняется для использования позже, а также используется в обработчике событий. – Jamiec

0

Вы должны держать простой массив уникальные идентификационный только:

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

Затем эта линия должна работать нормально:

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

Если вы настаиваете на использовании .toArray, который работает 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

Это также сработало! Благодаря! – JoshWeinstein

+0

Можете ли вы объяснить, что происходит в функции $ .each? – JoshWeinstein

+1

[Проверить это] (http://api.jquery.com/jquery.each/), он выполняет итерацию по объектам массива. Получает два параметра (здесь 'i' и' val'), которые сохраняют текущий индекс и текущий объект. –

Смежные вопросы