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");
        };
    };
});

ボタンをクリックするとスクリプトが起動します。チェックボックスがオンになっていない場合、すべてのラベルにエラーが追加されます。これは正しいことです。ただし、1つのボックスをオンにすると、ラベルにエラーが発生することはありません。これは正しくありません。最初のグループのチェックボックスをオンにしても、ラジオボタンをオフのままにすると、そのラジオボタンはエラーとしてマークされます。

注:このスクリプトはまだ入力名を考慮していないことを知っています(したがって、同じ名前の1つのチェックボックスがオンになっている場合、もう1つは現在エラーを表示します)、先に進む前に彼のバグを解決しようとしています。

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を持つ要素と一致しますが、これはほぼ確実に必要なものではなく、要素と一致しない可能性が非常に高くなります。実際、なぜこれが機能するのかわかりません。は有効なセレクターであり、機能している(ただし、おそらく無効です-jQueryのバグですか?)セレクターですが、無効なセレクターであり、エラーが発生しますobjectSomething[object][object Something]:checkbox[object Something]
  3. $("...)要素が一致したかどうかに関係なく、常に0個以上の要素を持つjQueryオブジェクトが生成されますが、これは常に真実です。の代わりにif ($(...)) {、チェックする必要がありますif ($(...).length > 0)

要約すると、(jQueryのいくつかの癖によって)エラーを発生させないが、完全に偽の結果を返す無効なセレクターを生成しています。

于 2013-01-18T17:18:55.497 に答える