Улавяне на промени в полето за отметка и индексиране за превключване на светодиодите

Бих искал да уловя промяна в квадратчето за отметка и също така да уловя индекса на избраното или премахнатото квадратче за отметка. Чудя се дали това може да е добре.

$("input[type='checkbox']").change(function () {
  $("input[type='checkbox']").each(function (i) {
    //my code here
    switch (i) {
      case 0:
        break;
      case 1:
        break;
          .
          .
    }
  });
});

Моят html е нещо подобно:

<table>
<tr>
<td id='led' bgcolor=#cccccc>OFF</td>
<td><input type='checkbox' name='' value='' ></td>
</tr>
<tr>
<td id='led' bgcolor=#cccccc>OFF</td>
<td><input type='checkbox' name='' value='' ></td>
</tr>
<tr>
<td id='led' bgcolor=#cccccc>OFF</td>
<td><input type='checkbox' name='' value='' ></td>
</tr>
<tr>
</table>

Така че бих искал да открия какво поле е избрано и след това да променя светодиода на ВКЛ. и на червен фонов цвят. От друга страна, ако квадратчето не е избрано, искам да върна светодиода на ИЗКЛЮЧЕН и да променя цвета на #cccccc


person electronixG    schedule 06.04.2013    source източник
comment
Има няколко синтактични грешки във вашия код, )}; трябва да бъде });.   -  person undefined    schedule 06.04.2013
comment
можете да получите достъп до вашето отметнато/неотметнато квадратче, като използвате $(this) във вашия $("input[type='checkbox']").change(function() {});   -  person Ejaz    schedule 06.04.2013
comment
Какъв е вашият HTML? И на второ място charlieftl, без да знаем вашата цел, не можем да предоставим последователен/разумен отговор или предложения.   -  person David says reinstate Monica    schedule 06.04.2013
comment
какво е обективно? има много по-лесни подходи. Предоставете повече подробности за случая на употреба и какво искате да знаете за квадратчетата за отметка. Демонстрация в jsfiddle.net винаги помага да получите по-добри отговори   -  person charlietfl    schedule 06.04.2013


Отговори (2)


Без допълнителни подробности, това е най-общият код, който мога да предложа (с повече информация идват страхотни, ъъъъ, отговори):

$('input:checkbox').change(function(){
    // caching the $(this) jQuery object, since we're using it more than once:
    var that = $(this),
         // index of element with regard to its sibling elements:
        index = that.index(),
        // index with regard to other checkbox elements:
        checkboxIndex = that.index('input:checkbox');

        if (this.checked){ // this.checked evaluates to a Boolean (true/false)
            // this block executed only if the checkbox *is* checked
        } else {
            // this block executed only if the checkbox is *not* checked
        }
});

Редактирано за справяне с изискванията в (редактиран/изяснен) въпрос:

$('input:checkbox').change(function () {
    var that = this,
        $that = $(that),
        led = $that.closest('tr').find('td:first-child');
    led.removeClass('on off').addClass(function(){
        return that.checked ? 'on' : 'off';
    });
});

Демонстрация на JS Fiddle.

Свързване на горния jQuery със следния CSS:

.led,
.led.off {
    background-color: #ccc;
}

.led.on {
    color: #000;
    background-color: #f00;
}

И HTML:

<table>
    <tr>
        <td class='led'>OFF</td>
        <td>
            <input type='checkbox' name='' value='' />
        </td>
    </tr>
    <tr>
        <td class='led'>OFF</td>
        <td>
            <input type='checkbox' name='' value='' />
        </td>
    </tr>
    <tr>
        <td class='led'>OFF</td>
        <td>
            <input type='checkbox' name='' value='' />
        </td>
    </tr>
</table>

Обърнете внимание, че замених id="led" с class="led", тъй като id трябва да е уникален в рамките на документа. Това е важно, когато става въпрос за валидността на JavaScript и HTML.

Препратки:

person David says reinstate Monica    schedule 06.04.2013
comment
+1; Въпреки това, за да сте сигурни, че сте наясно, най-големият проблем е, че създавате една локална променлива (that) и две глобални променливи (index и checkboxIndex). Освен това, ако изберете опцията за опаковане на this в jQuery обект, можете също да го използвате вместо this.checked (напр. that.prop('checked'), за да сте сигурни, че this не е променен някъде другаде. - person vol7ron; 06.04.2013
comment
Къде създавам глобални променливи? Всички променливи следват декларацията var в локалния обхват. Или пропускам/не разбирам нещо? И не обичам да използвам that.is(':checked') и that.prop('checked'), просто защото е ненужно скъпо (въпреки че не съм кеширал this възела). - person David says reinstate Monica; 06.04.2013
comment
Да, всички те са локални променливи - person electronixG; 06.04.2013
comment
@electronixG: не, не всички са локални променливи -- var a=1,b=2,c=3; не е същото като var a=1;var b=2;var c=3; вижте stackoverflow.com/a/7384541/183181 - person vol7ron; 06.04.2013
comment
@DavidThomas: въпросът е, че ако ще опаковате this в jQuery обект, тогава е по-лесно да поддържате този код, ако използвате jQuery обекта другаде, да, по-скъпо е, но обърквате някой, който идва зад вас, като използвайки that,this и $(this) навсякъде и вече сте създали по-голямата част от режийните (разходите), когато сте избрали да използвате jQuery на първо място. - person vol7ron; 06.04.2013

Можете да направите, ако има отметка в квадратчето или не, като използвате това във всеки код на вашата функция:

if ( $(this).is(':checked') ) {
  // ...
} else {
  // ...
}
person IndoKnight    schedule 06.04.2013
comment
защо дори да създавате нова променлива? if(this.checked){...} - person vol7ron; 06.04.2013
comment
Съжалявам, къде е новата променлива тук? - person IndoKnight; 06.04.2013
comment
Мисля, че той/тя има предвид използването на обвития в jQuery $(this), вместо да използва this; тъй като this.checked връща същата булева стойност като $(this).is(':checked'). Но, честно казано, предполагам. - person David says reinstate Monica; 06.04.2013
comment
Добре, моля да ме извините за грешния избор на думи. $(this) създава нов обект, технически има функции/променливи в този обект, но не това имах предвид. Просто стигах до факта, че this.checked е много по-евтин от $(this).prop('checked') - person vol7ron; 06.04.2013
comment
Съгласен. Благодаря за приноса! - person IndoKnight; 06.04.2013