【问题标题】:Looping over elements in jQuery循环遍历jQuery中的元素
【发布时间】:2010-09-15 06:32:06
【问题描述】:

我想遍历 HTML 表单的元素,并将 字段的值存储在一个对象中。但是,以下代码不起作用:

function config() {
    $("#frmMain").children().map(function() {
        var child = $("this");
        if (child.is(":checkbox"))
            this[child.attr("name")] = child.attr("checked");
        if (child.is(":radio, checked"))
            this[child.attr("name")] = child.val();
        if (child.is(":text"))
            this[child.attr("name")] = child.val();
        return null;
    });

以下也不做(受jobscry的回答启发):

function config() {
    $("#frmMain").children().each(function() {
        var child = $("this");
        alert(child.length);
        if (child.is(":checkbox")) {
            this[child.attr("name")] = child.attr("checked");
        }
        if (child.is(":radio, checked"))
            this[child.attr("name")] = child.val();
        if (child.is(":text"))
            this[child.attr("name")] = child.val();
    });
}

警报始终显示child.length == 0。手动选择元素有效:

>>> $("#frmMain").children() 对象长度=42 >>> $("#frmMain").children().filter(":checkbox") 对象长度=3

关于如何正确执行循环的任何提示?

【问题讨论】:

  • 您的线程刚刚为我节省了 20 分钟的多表单逐行输入字段 -_-;。 +1。

标签: javascript jquery


【解决方案1】:

不要认为你需要引用这个:

var child = $("this");

尝试:

var child = $(this);

【讨论】:

    【解决方案2】:

    jQuery 有一个出色的循环遍历一组元素的功能:.each()

    $('#formId').children().each(
        function(){
            //access to form element via $(this)
        }
    );
    

    【讨论】:

    • 对我不起作用,请参阅我对问题的编辑。进一步的想法?
    • 表单可能有一个段落或与其子项类似的内容。您需要确保只选择输入元素。
    • "children()" 获取表单中的所有 DOM 子项,而不是元素。
    【解决方案3】:

    根据您对每个孩子的需求(如果您希望通过 AJAX 将其发布到某个地方),您可以这样做...

    $("#formID").serialize()
    

    它会自动为您创建一个包含所有值的字符串。

    至于循环对象,你也可以这样做。

    $.each($("input, select, textarea"), function(i,v) {
        var theTag = v.tagName;
        var theElement = $(v);
        var theValue = theElement.val();
    });
    

    【讨论】:

      【解决方案4】:

      我以前用过以下:

      var my_form = $('#form-id');
      var data = {};
      
      $('input:not([type=checkbox]), input[type=checkbox]:selected, select, textarea', my_form).each(
          function() {
              var name = $(this).attr('name');
              var val = $(this).val();
      
              if (!data.hasOwnProperty(name)) {
                  data[name] = new Array;
              }
      
              data[name].push(val);
          }
      );
      

      这只是从内存中写入的,因此可能包含错误,但这应该会生成一个名为 data 的对象,其中包含您所有输入的值。

      请注意,您必须以特殊方式处理复选框,以避免获取未选中复选框的值。无线电输入可能也是如此。

      还要注意使用数组来存储值,对于一个输入名称,您可能有来自多个输入的值(特别是复选框)。

      【讨论】:

      • 你投票给我了吗? $(this) 不是查找,您使用 jQuery 对象包装现有对象。只执行一次可能会稍微高效一些,但差异将是微不足道的。
      • 在我见过的众多建议中,这是最容易实施的。谢谢!
      【解决方案5】:

      如果你想使用 each 函数,它应该是这样的:

      $('#formId').children().each( 
        function(){
          //access to form element via $(this)
        }
      );
      

      只需将右花括号切换为右括号即可。感谢您指出这一点,jobscry,您为我节省了一些时间。

      【讨论】:

      • 当您说您只是回复jobscry 时,为什么要将此作为答案发布?这是他发布的相同代码。这就是 cmets 的用途。
      【解决方案6】:

      对我来说,所有这些都不起作用。对我有用的东西非常简单:

      $("#formID input[type=text]").each(function() {
      alert($(this).val());
      });
      

      【讨论】:

        【解决方案7】:

        这是循环访问仅访问表单元素的表单的最简单方法。在每个函数中,您可以检查并构建您想要的任何内容。构建对象时请注意,您需要在每个函数之外声明它。

        编辑 JSFIDDLE

        下面的将起作用

        $('form[name=formName]').find('input, textarea, select').each(function() {
            alert($(this).attr('name'));
        });
        

        【讨论】:

        • $('#formId input, select, textarea') 将返回表单中的所有input 元素,以及页面中的每个选择框和文本区域
        • 它实际上并没有那样的行为......在 JSFiddle 中使用这种确切的格式实际上只导致了 select 和 textarea 回显。在“输入”前面添加一个逗号会产生您所说的结果。
        • 真的吗?因为jsfiddle.net/UDD7E/3 正是我在说什么。两个选择框和两个文本区域都是红色的,即使其中一个在表单之外。
        • 有趣,我得到了不同的结果。也许是因为我在单击按钮时启动了它。很奇怪。我会扔一个小提琴,但不再重要了。
        • 刚刚注意到编辑。新代码应该可以更好地工作,因为您正在获取表单并查询它(这以其他代码没有的方式限制了查询)。它上面的代码仍然有问题,你可能想摆脱它,但至少你现在有一些东西可以工作。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2018-04-13
        • 2018-06-05
        • 2013-07-22
        • 2010-12-20
        • 1970-01-01
        相关资源
        最近更新 更多