Подсчитать количество промежутков до пролета с определенным идентификатором

0

как я могу подсчитать количество пролетов до диапазона с определенным идентификатором.

например:

до span с id = "a5" является 6-м пролетом.

<table border="3">
    <tr>
        <td><span id="a2" class="arrow_icon a6" isClicked="0"></span></td>
        <td><span id="a1" class="arrow_icon a1" isClicked="0"></span></td>
        <td><span id="a3" class="arrow_icon a11" isClicked="0"></span></td>
        <td><span id="a4" class="arrow_icon a16" isClicked="0"></span></td>
        <td><span id="a6" class="arrow_icon a2" isClicked="0"></span></td>
    </tr>
    <tr>
        <td><span id="a5" class="arrow_icon a21" isClicked="0"></span></td>
        <td><span id="a7" class="arrow_icon a7" isClicked="0"></span></td>
        <td><span id="a8" class="arrow_icon a12" isClicked="0"></span></td>
        <td><span id="a9" class="arrow_icon a17" isClicked="0"></span></td>
        <td><span id="a10" class="arrow_icon a22" isClicked="0"></span></td>
    </tr>
</table>

Я попробовал что-то вроде:

var count = 0;
$("span:first").nextUntil("#a5").andSelf().each(function(index) {
     count++;
});
alert(count); // should alert '6'

любая помощь ценится!

Теги:

5 ответов

1
Лучший ответ

Прежде всего, ваш первоначальный выбор содержит только один элемент span в первом <td>...</td>. Поэтому вы должны изменить его на довольно $("span")...

Во-вторых, функция nextUntil ищет среди братьев и сестер выбранных элементов, просто посмотрите на документы jQuery, чтобы подтвердить, что:

nextUntil спецификация

Это означает, что ваша коллекция интервалов меняется на... ноль. Зачем? Их прямыми родителями являются теги <td>...</td>, которые содержат только один диапазон, поэтому ни у кого из них нет ни одного брата и сестры.

Средство довольно просто:

var count = 0;

$("span").each(function(i, e){
    if(!$(this).is("#a5"))
        count++; //count it up
    else
        return false; //exit the each function
});

alert(count); //alerts '5', as it should

Основная причина, по которой он работает, заключается в том, что выбор уже отсортирован так, как они представлены в DOM. В противном случае было бы очень сложно что-либо сделать с этим.

ура

2

Вы не можете использовать .nextUntil(), потому что это касается братьев и сестер, и не все элементы span в вашем примере являются братьями и сестрами. Помещение селектора в $(...) должно приводить к созданию объекта jQuery, который соблюдает порядок элементов в DOM, поэтому, может быть, просто:

var count = 0;
$("span").each(function(i) {
    count++;
    if (this.id === "a5") {return false;} // breaks out of loop when the id is found
});

console.log(count);
1

Вы не можете использовать nextUntil(), потому что они не братья и сестры. Это лучший способ, о котором я могу думать.

var a5index;
$('table span').each(function(idx){
  if( $(this).is('#a5')){
    a5Index = idx;
    return true; // No reason to keep going after we find it...
  }
});
1

Просто .each() все промежутки с .each() и используйте индекс (число итераций цикла) в качестве счетчика:

var c;
$("span").each(function(index, element) {
    if(element.id == "a5") {
        c = index; // set counter to current index value
        return false; // break the each loop
    }
});
alert(c);

http://jsfiddle.net/8rPcN/

0

Используйте return false, чтобы выйти из цикла.each раньше

var count = 0;
var toId = "a5";
$("span").each(function(){
   count++;
   if(this.id == toId) {
      return false;
   }
});
console.log(count);

или используйте одну строку с использованием .index

console.log( $("span").index($("#a5")) );
  • 0
    поместить this в $(...) просто так, чтобы вы могли получить атрибут id, - это пустая трата. Просто используйте this.id
  • 0
    да делал что-то еще с этим и нуждался в упаковке и просто не думал, чтобы развернуть это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню