0

为什么此脚本为页面上的每个单选按钮和复选框标签添加一个类,而不仅仅是为每个单独的复选框/单选按钮添加一个类?

例如,我有这些按钮:

<input class="required" id="Example31" name="Example3" type="checkbox" />
<label for="Example31">Example Input 3 Option 1</label>

<input class="required" id="Example32" name="Example3" type="checkbox" />
<label for="Example32">Example Input 3 Option 2</label>

<input class="required" id="Example4" name="Example4" type="radio" />
<label for="Example4">Example Input 4</label>

这个脚本:

$("input.required").each(function() {
    if ($(this + ":checkbox") || $(this + ":radio")) {
        if (!$(this + ":checked").val()) {
            var inputId = $(this).attr("id");
            $("label[for=" + inputId + "]").addClass("error");
        };
    };
});

当我单击一个按钮时,脚本会触发。如果没有选中任何框,则每个标签都会添加一个错误,这是正确的。但是,如果选中一个框,则没有任何标签出现错误,这是不正确的。如果我选中第一组中的复选框,但未选中单选按钮,则该单选按钮应标记为错误。

注意:我知道这个脚本还没有考虑到输入名称(所以如果选中了一个具有相同名称的复选框,另一个复选框当前会显示错误),我正在尝试在继续之前解决他的错误.

4

1 回答 1

1

这些代码行完全是胡说八道,它们不能做任何有用或理智的事情:

if ($(this + ":checkbox") || $(this + ":radio")) {
    if (!$(this + ":checked").val()) {

我怀疑你试图做...

if ($(this).is(":checkbox") || $(this).is(":radio")) {
    if (!$(this).is(":checked")) {

通过解释,

  1. this + ":checkbox"始终生成一个选择器,如[object Something]:checkbox,其中Something将根据this
  2. 这将匹配具有属性:checkbox, 的元素(请参阅Has Attribute selector,这几乎肯定不是您想要的,并且很可能不匹配任何元素;实际上我不确定为什么会这样。是一个有效的选择器,并且是一个有效的(但可能是无效的 - jQuery 错误?)选择器,但它是一个无效的选择器并引发错误objectSomething[object][object Something]:checkbox[object Something]
  3. 无论元素是否匹配$("...),都会产生一个包含 0 个或更多元素的 jQuery 对象,这始终真实的。而不是if ($(...)) {,您需要检查if ($(...).length > 0)

总而言之,您正在生成一个无效的选择器,它(通过 jQuery 的一些怪癖)不会引发错误,但会返回完全虚假的结果。

于 2013-01-18T17:18:55.497 回答