jQuery .map()返回数组,而不是匹配的集合(jQuery对象)

时间:2013-10-04 09:04:22

标签: 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>

1 个答案:

答案 0 :(得分: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