Подтвердить что ты не робот

Как переключить атрибут в jQuery

Я пытаюсь использовать изображения как флажки. Следующие будут работать нормально, если бы это были радиостанции, а не флажки, на которые я нацелился, но с флажками проблема заключается в том, что я не могу выбрать элемент, щелкнув его снова после его выбора.

// image checkbox
$('#imageCheckBoxes img').click(function() {
    $(this).parent('span').find('input:checkbox').attr('checked', 'checked');
});
<div id="imageCheckBoxes">
    <ul>
        <li><a href="">Africa</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">Asia/Pacific Islands</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">Australia</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">Central/South America</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">Europe/Russia</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">North America</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
        <li><a href="">United Kingdom</a>  <span><img src="images/checkbox-inactive.png" /><input type="checkbox" name="" value="" /></span>
        </li>
    </ul>
</div>

Мне нужно в основном переключить чек attr().

Как это сделать?

4b9b3361

Ответ 1

Я бы сделал это, передав функцию prop (начиная с jQuery 1.6, attr). Возвращаемое значение этого параметра устанавливается как новое значение свойства.

$(this)
    .closest('li')
        .find('input:checkbox').prop('checked', function(idx, oldProp) {
            return !oldProp;
        });

Ключевым фактом здесь является то, что вы можете передать true или false в prop, чтобы установить свойство checked. oldProp - это существующее значение свойства (которое будет либо true, либо false), поэтому !oldProp - это инверсия: проверенные элементы не отмечены и наоборот.

Обратите внимание, что я также изменил ваш код, чтобы найти ближайший элемент предка li с closest, который должен быть более надежным и эффективны.

Ответ 2

Вы можете добавить довольно базовое расширение jQuery, которое работает так же, как "toggle()" и "toggle (showOrHide)", но для атрибутов - "toggleAttr (атрибут)" и "toggleAttr (attribute, addOrRemove)"

$.fn.toggleAttr = function(a, b) {
    var c = (b === undefined);
    return this.each(function() {
        if((c && !$(this).is("["+a+"]")) || (!c && b)) $(this).attr(a,a);
        else $(this).removeAttr(a);
    });
};

Примечание. Это совместимо с xhtml и предназначено для таких атрибутов, как "отключено", "включено", "проверено", "выбрано" и т.д.

Пример использования (для вашего сценария):

$('#imageCheckBoxes img').click(function() {
    $(this).parent('span').find('input:checkbox').toggleAttr('checked');
}

EDIT - хотя, как указано artlung, ярлык, вероятно, лучше всего подходит для вашего сценария

Ответ 3

Другой возможный подход:

$('#imageCheckBoxes').delegate('img', 'click', function(){
    var $associatedCheckbox = $(this).siblings('input:checkbox');
    if ($associatedCheckbox.is(':checked')){
        $(this).removeClass('checked');
        $associatedCheckbox.removeAttr('checked');
    } else {
        $(this).addClass('checked');
        $associatedCheckbox.attr('checked', 'checked');
    }
});

Я использую delegate(), хотя вы можете так же легко использовать стандартный вызов click() или bind() для добавления функции прослушивания.

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

#imageCheckboxes img {
  border: 2px solid #fff;
}
/* feedback for your users! */
#imageCheckboxes img.checked {
  border: 2px solid #6f6;
}

Теперь мне кажется, что вы также можете избежать JavaScript для этого, и просто поместите теги <label> вокруг своих изображений, а затем привяжите их с помощью своих флажков, чтобы получить тот же эффект. Просто замените <span> на свой html <label>.

Ответ 4

Попробуйте это.

$('#imageCheckBoxes img').click(function() {
    var el = $(this).parent('span').find('input:checkbox');
    if(el.is(':checked'))
        el.attr('checked', '');
    else
        el.attr('checked', 'checked');
});

Ответ 5

Мое решение было немного более умным:

var $formContainer = $(".form-container"),
    $myCheckbox = $formContainer.find(".my-checkbox"),
    $requiredFields = $formContainer.find("input[required], textarea[required], select[required]").removeAttr("required"); // remove the required attribute on all required form inputs
$myCheckbox.change(function () {
    $formContainer.toggle("fast", function() {
        if ($(this).is(":visible")) {
            $requiredFields.attr("required", true);
        }
        else {
            $requiredFields.removeAttr("required");
        }
    });
});