【问题标题】:Why can't .each() find the child elements?为什么 .each() 找不到子元素?
【发布时间】:2013-07-06 22:24:01
【问题描述】:

e.target 指向一个表单元素。我正在尝试遍历每个输入元素并收集名称和值,以便可以将它们作为参数传递给a .load().each() 迭代器永远找不到 <input> 元素,因此不处理任何内容就退出。该表单包含一个包含输入的div 元素。

var formData = {};
$(e.target).has(":input").each(function(){
    formData[$(this).name] = $(this).value;
});

表单html:

<div id="partner-settings-form" class="ui-dialog-content ui-widget-content" scrolltop="0" scrollleft="0" style="display: block; width: auto; min-height: 67.6875px; height: auto;">         
<article class="sign_in form-dialog clearfix">
      <div class="bg-form-dlg">
        <div class="col_100 clearfix">
<h2>UPS Shipping Information</h2>
<form enctype="application/x-www-form-urlencoded" class="sign_in_form sign_up_form" action="" method="post"><div class="zend_form">

<input type="hidden" name="partnerId" value="2" id="partnerId">
<div class="shippingdetails"><fieldset id="fieldset-account">
<div id="key-label" class="formlabel"><label for="key" class="required">Access Key: *</label></div>
<div id="key-element" class="formcontent">
<input type="text" name="key" id="key" value="..."></div>
<div id="id-label" class="formlabel"><label for="id" class="required">User ID: *</label></div>
<div id="id-element" class="formcontent">
<input type="text" name="id" id="id" value="..."></div>
<div id="password-label" class="formlabel"><label for="password" class="required">Password: *</label></div>
<div id="password-element" class="formcontent">
<input type="text" name="password" id="password" value="..."></div>
<div id="account_number-label" class="formlabel"><label for="account_number" class="required">Account Number: *</label></div>
<div id="account_number-element" class="formcontent">
<input type="text" name="account_number" id="account_number" value="..."></div>
<div id="address1-label" class="formlabel"><label for="address1" class="required">Address1: *</label></div>
<div id="address1-element" class="formcontent">
<input type="text" name="address1" id="address1" value="..."></div>
<div id="address2-label" class="formlabel"><label for="address2" class="optional">Address2:</label></div>
<div id="address2-element" class="formcontent">
<input type="text" name="address2" id="address2" value=""></div>
<div id="phone-label" class="formlabel"><label for="phone" class="required">Phone: *</label></div>
<div id="phone-element" class="formcontent">
<input type="text" name="phone" id="phone" value="..."></div>
<div id="city-label" class="formlabel"><label for="city" class="required">City: *</label></div>
<div id="city-element" class="formcontent">
<input type="text" name="city" id="city" value="Los Angeles"></div>
<div id="state-label" class="formlabel"><label for="state" class="required">State (code): *</label></div>
<div id="state-element" class="formcontent">
<input type="text" name="state" id="state" value="CA"></div>
<div id="country-label" class="formlabel"><label for="country" class="optional">Country:</label></div>
<div id="country-element" class="formcontent">
<select name="country" id="country" class="dlg-select">
    <option value="US" label="UNITED STATES" selected="selected">UNITED STATES</option>
    <option value="AF" label="AFGHANISTAN">AFGHANISTAN</option>
    <option value="..." label="...">...</option>
</select></div>
<div id="postal-label" class="formlabel"><label for="postal" class="required">Postal Code: *</label></div>
<div id="postal-element" class="formcontent">
<input type="text" name="postal" id="postal" value="90036"></div></fieldset></div>
<div>
<p><label id="configship-label">&nbsp;</label>
<input type="submit" name="configship" id="configship" value="Save Information"></p></div></div></form></div>
</div>
</article>

    </div>

【问题讨论】:

  • $(e.target).children("input").each(function(){ formData[$(this).name] = $(this).value; });
  • formData 到底是什么?
  • 顺便说一句,$.has() 返回布尔值,如果选择器匹配并在父选择器中找到。您应该改用:$.find()
  • @ZlatanO。没有 has() 方法根据后代和使用的选择器减少匹配的元素集
  • @roasted 好的。但这仍然不能解决问题。

标签: jquery forms each


【解决方案1】:

然后尝试不同的方式

$(e.target).find('input').each();

【讨论】:

  • 您还有其他想法吗?请查看我的表单 html 以获得更好的理解。
【解决方案2】:

为此使用.serialize(),无需重新发明轮子,伙计。

$(e.target).serialize();

编辑:

由于 .load() 使用查询字符串请求 GET,并使用对象请求 POST,因此 .serialize() 不会删除它。解决方法是使用 .ajax() 或调整您的代码,因为您遇到了错误:

var formData = {};
$(e.target).find('input').each(function() {
    formData[$(this).attr('name')] = $(this).val();  // .attr('name') and .val() instead.
});

【讨论】:

  • 不序列化给你一个查询字符串? (a=b&amp;c=d) 认为 op 想要:{a: 'b', c: 'd'}
  • 他想把它传递给load(),因为它已经是一个URL编码的字符串,它可以工作。
  • 取决于操作必须在服务器端做什么...如果值应该在同一个命名空间下,您的示例将起作用:{payload: {a: 'b', c: 'd'}} -> payload[a]=b&amp;payload[c]=d
  • 我不能使用 .serialize()。我需要传递一个对象来触发 POST。
  • @ChrisBarnhill 不,你没有。 AJAX 调用怀疑 URL 编码的字符串或对象。如果传递了一个对象,它首先被序列化。检查documentation for $.ajax(),在data 部分。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2021-12-21
  • 1970-01-01
  • 2012-04-05
  • 2021-05-31
  • 2015-08-08
相关资源
最近更新 更多