0

私は評価システムに取り組んでいます。ページには多くの「questionItem」ブロックがあります。目標は、answers [2].SetAnswerまたはanswers[2].Answerが空の文字列または?に設定されているものを特定することです。タイトル(アイテム)を強調表示します。ユーザーが質問を変更したら、ハイライトを削除します。

それはうまくいきます、私はそれをどのように改善できるかを単に探しています。これが1つのブロックです:

$<div class="questionItem">
    <input data-val="true" data-val-number="The field MappingId must be a number." data-val-required="The MappingId field is required." id="answers_2__MappingId" name="answers[2].MappingId" type="hidden" value="24" />
    <input id="answers_2__Item" name="answers[2].Item" type="hidden" value="B0300" />
    <input id="answers_2__OldAnswer" name="answers[2].OldAnswer" type="hidden" value="^" />
    <input id="answers_2__SetAnswer" name="answers[2].SetAnswer" type="hidden" value="^" />
    <h3 class="item">B0300</h3>
    Hearing aid<br/>
    <select class="hyperSwap" id="answers_2__Answer" name="answers[2].Answer">
        <option selected="selected" value="?">(select item)</option>
        <option value="0">(0) No</option>
        <option value="1">(1) Yes</option>
        <option value="-">(-) Not assessed</option>
    </select>
</div>

<div class="questionItem">
    <input data-val="true" data-val-number="The field MappingId must be a number." data-val-required="The MappingId field is required." id="answers_11__MappingId" name="answers[11].MappingId" type="hidden" value="228" />
    <input id="answers_11__Item" name="answers[11].Item" type="hidden" value="C0900A" />
    <input id="answers_11__OldAnswer" name="answers[11].OldAnswer" type="hidden" value="0" />
    <input id="answers_11__SetAnswer" name="answers[11].SetAnswer" type="hidden" value="?" />
    <h3 class="item">C0900A</h3>
    Staff asmt mental status: recall current season <br/>
    <div class="questionCheckbox"><input id="C0900A_0" name="answers[11].Answer" type="radio" value="0" /> (0) Not checked (No)</div>
    <div class="questionCheckbox"><input id="C0900A_1" name="answers[11].Answer" type="radio" value="1" /> (1) Checked (Yes)</div>
    <div class="questionCheckbox"><input id="C0900A_-" name="answers[11].Answer" type="radio" value="-" /> (-) Not assessed</div>
</div>

そして、これが私が思いついたjQueryコードです:

$function highlightUnanswered() {
    var coll = $(".questionItem").filter(function () {
        return $(this).find(":input").filter(function () {
            return (/^answers\[\d+\]\.SetAnswer$/.test(this.name) && this.value == "?") ||
                           ((/^answers\[\d+\]\.Answer$/.test(this.name) && this.value == "?") &&
                            (/^answers\[\d+\]\.Answer$/.test(this.name) && this.value == ""));
        }).length > 0;
    });

    coll.find(".item").addClass("unanswered");
    coll.find(":input").change(function (e) { $(this).parent().find(".item").removeClass("unanswered"); });
}

2つの質問があります:

Q1:最後の行、私が間違っていなければ、ハンドラーは非表示の入力を含むすべての入力に追加されています。答えに接続するにはどうすればよいですか[#]。答えの入力?

Q2:このフォームの誰かが、別の機能の最初のコレクションを思い付く最初のクエリをくれました。私はそれが何をしているのか理解していますが、その方法がわかりません:/^answers[\d+].Answer$/.test(this.name)はどうなっていますか?最後に.length()> 0があるのはなぜですか?

4

1 に答える 1

1

Q1:

coll.find(":input").filter(function(){
  return (/^answers\[\d+\]\.Answer$/.test(this.name);
}).addClass('unanswered');

Q2:

http://api.jquery.com/filter/は次のように述べています。「各要素について、関数がtrue(または「真の」値)を返す場合」、したがって、フィルター関数は単純に次を返すことができます.length:0は偽であり、他の数値は真です。

/^answers[\d+].Answer$/正規表現です:

https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

.test(this.name)現在処理されている入力の名前が必要な形式と一致するかどうかを確認します。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test

于 2012-06-29T14:58:30.203 に答える