2013-10-04 3 views
1

При использовании метода .map() я возвращаю массив с двумя узлами, которые, как я думаю (не объект jQuery/сопоставленный набор). Я хочу применить класс к этому набору, но ничего не происходит.jQuery .map() возвращает массив, а не соответствующий набор (объект jQuery)

$('input#substance, input[name="atc_code"]').map(function() {return $(this).prevAll('label:first')}); 

Возвращает:

[x.fn.x.init[1], x.fn.x.init[1]] 

[ 
x.fn.x.init[1] 
0: label 
context: input#substance.ui-autocomplete-input 
length: 1 
prevObject: x.fn.x.init[1] 
__proto__: Object[0] 
, 
x.fn.x.init[1] 
0: label 
context: input.small ui-autocomplete-input 
length: 1 
prevObject: x.fn.x.init[1] 
__proto__: Object[0] 

Это правильно выбирает, но почему я не могу использовать этот массив? Почему это не объект jQuery?

HTML-:

<div class="fieldset-container"> 
    <label>Substance</label> 
    <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span> 
    <input type="text" name="substance" id="substance" maxlength="22" autocomplete="off" spellcheck="false" autofocus="autofocus" class="ui-autocomplete-input"> 

    <label title="Required field">ATC code<span class="ma">*</span></label> 
    <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span><input type="text" class="small ui-autocomplete-input" name="atc_code" maxlength="7" autocomplete="off" spellcheck="false"> 

    <label>Year</label> 
    <div class="small"> 
     <select name="year">...</select> 
    </div> 
</div> 

ответ

0

Он выбирает правильно, но почему я не могу использовать этот массив? Почему это не объект jQuery?

Это, но это один из тех запутанных раз, когда элементы в пределах объекта JQuery являются сами объекты JQuery. 99.999% времени, набор jQuery содержит элементы DOM, но возможно , чтобы иметь набор jQuery, содержащий другие вещи. В частности, когда вы используете .map, результирующий объект jQuery содержит возвращаемую неизменную функцию отображения. В вашем случае вы возвращаете объекты jQuery из своей функции сопоставления, и именно это было в вашем результирующем наборе jQuery. (И если это не достаточно запутанным, JQuery также имеет два различных map методов: one that's specific to instances и который возвращает объект JQuery, который является тот, который вы использовали, и тот, который not specific to an instance и возвращает массив.)

Вы можете решить эту проблему, имея свои картографические функции возврата необработанных элементов DOM:

$('input#substance, input[name="atc_code"]').map(function() {return $(this).prevAll('label:first')[0]}); 
// The new bit -----------------------------------------------------------------------------------^^^ 

Live Example | Live Source

В качестве альтернативы, вы можете сделать это без .map:

$('input#substance').prevAll('label').first().add(
    $('input[name="atc_code"]').prevAll('label').first() 
); 

Live Example | Live Source

+0

Я уже пробовал это, это не сработает. Эти два элемента являются братьями и сестрами, а 'prevAll ('label: first')' будет возвращать только один элемент *, тогда как мне нужно два. Вот почему мне приходится прибегать к '.map()'. – silkfire

+0

Совсем нет, TJ Crowder. По моей консоли я вижу, что он выбирает два (разных) элемента, которые я хочу. Но он помещает их в массив = ( – silkfire

+0

Добавлен HTML сейчас :) – silkfire

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