2012-06-29 2 views
0

Я работаю над системой оценки. На странице есть много блоков «questionItem». цель состоит в том, чтобы идентифицировать те, в которых ответы [2] .SetAnswer или ответы [2]. Ответы заданы либо пустой строкой, либо? и загорайте заголовок (пункт). Когда пользователь меняет вопрос, удалите подсветку.с помощью jQuery для поиска определенного ввода

Это работает, я просто ищу, как я могу его улучшить. Вот один блок:

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

Есть два вопроса:

Q1: самая последняя строка, если я не ошибаюсь, обработчик добавляется ко всем входам, включая скрытые. Как просто подключить его к ответам [#]. Ответ на ввод?

Q2: Кто-то из этой формы дал мне первый запрос, который содержит первоначальную коллекцию для другой функции. Я понимаю, что он делает, но я не понимаю, как: Что случилось с /^answers[\d+].Answer$/.test(this.name)? Почему в конце есть .length()> 0?

ответ

1

Q1:

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

Q2:

http://api.jquery.com/filter/ говорит: "Для каждого элемента, если функция возвращает истину (или "truthy" значение)", поэтому функция фильтра может просто вернуть .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

Смежные вопросы