-1

好的,所以我真的不认为我正确地构建了我的 JS,并希望有人能指出我正确的方向。我不认为按顺序命名每个列表项的类是实现此目的的有效或正确方法。

我有一个复选框列表,单击时需要执行两个操作:

1) 切换位于其正下方的 div 的类名。

2) 通过 AJAX 发布状态。

这是我当前的标记:

<ol class="toolkitList">
<li>
            <label><input class="inlineCheckers" type="checkbox" id="checkers" onchange="setCheck();" /><b id="grayTitle">List Title 1</b></label>
                <i id="hiddenDiv">Div content can go here.</i>
        </li>

        <li>
            <label><input class="inlineCheckers" type="checkbox" id="checkers2" onchange="setCheck2();" /><b id="grayTitle2">List title 2</b></label>
                <i id="hiddenDiv2">Div content can go here.</i>
        </li>

        <li>
            <label><input class="inlineCheckers" type="checkbox" id="checkers3" onchange="setCheck3();" /><b id="grayTitle3">List title 3</b></label>
                <i id="hiddenDiv3">Div content can go here.</i>
        </li>

        <li>
            <label><input class="inlineCheckers" type="checkbox" id="checkers4" onchange="setCheck4();" /><b id="grayTitle4">List Title 4</b></label>
                <i id="hiddenDiv4">Div content can go here.</i>
        </li>
    </ol>

这是我当前的 JS:

function setCheck() {
var el = document.getElementById("checkers");

if (el.checked) {
    document.getElementById("hiddenDiv").className = "main";
    document.getElementById("grayTitle").className = "titleGray";
 } else {
    document.getElementById("hiddenDiv").className = "";
    document.getElementById("grayTitle").className = "";
 }
}

function setCheck2() {
var el2 = document.getElementById("checkers2");

if (el2.checked) {
    document.getElementById("hiddenDiv2").className = "main";
    document.getElementById("grayTitle2").className = "titleGray";
 } else {
    document.getElementById("hiddenDiv2").className = "";
    document.getElementById("grayTitle2").className = "";
 }
}

function setCheck3() {
var el3 = document.getElementById("checkers3");

if (el3.checked) {
    document.getElementById("hiddenDiv3").className = "main";
    document.getElementById("grayTitle3").className = "titleGray";
 } else {
    document.getElementById("hiddenDiv3").className = "";
    document.getElementById("grayTitle3").className = "";
 }
}

function setCheck4() {
var el4 = document.getElementById("checkers4");

if (el4.checked) {
    document.getElementById("hiddenDiv4").className = "main";
    document.getElementById("grayTitle4").className = "titleGray";
 } else {
    document.getElementById("hiddenDiv4").className = "";
    document.getElementById("grayTitle4").className = "";
 }
}

我意识到我还没有这个设置的 AJAX 部分,但我想让这个要求知道,因为我很快就会将该部分添加到代码中。感谢您提供的任何指导!

4

4 回答 4

3

我会这样做:

$toolkitlist.on( 'change', '.inlineCheckers', function () {
    $( this ).closest( 'li' ).toggleClass( 'checked', this.checked );
});

其中$toolkitlist是一个包含 OL 元素的 jQuery 对象。请注意我是如何在 LI 元素上设置类的,因为它是代表选中项的最外层元素。您可以使用这些选择器来设置“选中”状态的样式:

/* how they look like initially */
.grayTitle { ... }
.hiddenDiv { ... }

/* how they look like when their check-box is checked */
li.checked .grayTitle { ... }
li.checked .hiddenDiv { ... }
于 2013-01-17T20:16:51.167 回答
2

使用 jQuery 的addClass

$('#grayTitle3').addClass('titleGray');

更新,使用^=

$('[id^=grayTitle]').addClass('titleGray');
于 2013-01-17T20:09:18.930 回答
1

删除内联 .onchange.. 并将更改事件绑定到您的类.inlineCheckers - then you can usethis`,这样您就不必为每个集合创建多个函数

$('.inlineCheckers').on('change', function {
  $el = $(this);
  var $hd = $el.closest('label').next('i'); 
  var $gt = $el.next('b');
  $hd.toggleClass('main', $el[0].checked);
  $gt.toggleClass('checkers', $el[0].checked);
}

http://jsfiddle.net/KYzgB/

于 2013-01-17T20:20:48.033 回答
1

您还可以将该类应用于外部 div

CSS:

.selected label b {
    color:blue
}
.selected i {
    color:red
}

JS:

$(".inlineCheckers").on('click',function(){
    $(this).parents("li").toggleClass('selected',$(this).is(":checked"));
})

jsfiddle:http: //jsfiddle.net/y2rHF/3/

于 2013-01-17T20:40:09.460 回答