Читая между строк, мне кажется, что следующее даст желаемый результат без JS:
<li>
<input id="cb1" type="checkbox">
<div>
<div>Some Other Content</div>
<label for="cb1">Click to Pledge</label>
</div>
</li>
http://jsfiddle.net/nnnnnn/VqmBb/
Это отображает «Некоторое другое содержимое» и «Click to Pledge» рядом с флажком, но, как вы можете видеть из моей демонстрации, только часть «Click to Pledge» ставит / снимает флажок при нажатии.
Я поменял вашу метку и div "pledge" и использовал атрибут for
метки, чтобы связать его с флажком, чтобы он автоматически проверял / снимал флажок. (Хотя теперь внешний div на самом деле ничего не делает и может быть удален, если вам это не нужно для стилизации.)
Что касается вашего JS, в следующей строке есть некоторые проблемы:
$("input[for=checkboxlabel]").attr('checked', !$checkbox.attr('checked'));
Во-первых, ваш селектор "input[for=checkboxlabel]"
, похоже, пытается использовать переменную checkboxlabel
, объявленную в строке ранее, но на самом деле вы просто включили строку, в которую входит текст "checkboxlabel". Так что это не выберет никаких элементов в вашем html, потому что у вас нет элемента «input» с атрибутом «for», равным строке «checkboxlabel». Также у вас есть переменная $checkbox
, которая нигде не определена.
ОБНОВЛЕНИЕ: ОК, следующее должно работать для вашего обновленного HTML (это работало для меня). Проблема с вашим существующим JS-кодом, за исключением того факта, что вы пытаетесь использовать переменную $checkbox
, которая не объявлена, заключается в том, что вы пытаетесь привязать свой обработчик кликов к элементу "pledge", что означает, что вы ничего не сделал для обработки кликов на других частях этикетки. Учитывая, что вы специально хотите прекратить клики на других частях ярлыка, я бы посоветовал вам присоединить обработчик .click()
к ярлыку - щелчки на дочерних элементах ярлыка будут пузыриться до обработчика щелчков ярлыка, так что тогда вы можете проверить, был ли элемент, по которому щелкнули, тот, у которого был класс "залог". Если нет, верните false
, чтобы отменить поведение по умолчанию для клика по метке, но если оно равно , элемент "pledge" ничего не делает и допускает выполнение по умолчанию:
$("div.pledge").parent("label").click(function(e) {
if (!$(e.target).hasClass("pledge"))
return false;
});
(Обратите внимание, что я выбираю родителя для "div.pledge", а не просто говорю $("label").click()
, чтобы эта обработка не привязывалась к всем меткам.)
Если вам не нравится это, я думаю, что ответ mgibsonbr - хорошая альтернатива.