【问题标题】:Pass JS function values of multiple input fields after change in one field一个字段改变后传递多个输入字段的JS函数值
【发布时间】:2011-04-13 16:41:35
【问题描述】:

我有一个带有很多选择和输入字段的 HTML 表单,用户可以使用它为每个类别选择他的订单项目(同一类别的项目具有相同的类)。每个项目还具有其他属性的字段,例如数量、颜色等
这是一个示例表单:

<form>
    <!--Category: Cats-->
    <label>Cat:</label>
    <select id="cat" class="cats">
        <option>nice</option>
        <option>ugly</option></select>
    <label>Quantity:</label>
    <input type="text" id="cat_qty" class="cats" />
    <br />
    <!--Category: Dogs-->
    <label>Dog:</label>
    <select id="dog" class="dogs">
        <option>nice</option>
        <option>ugly</option></select>
    <label>Quantity:</label>
    <input type="text" id="dog_qty" class="dogs" />
    <br />
</form>

真正的形式有更多的类别。此外,由于演示的必要性,有些字段属于同一类别,我不能在同一个父标记内组合在一起,这意味着它们位于 HTML 页面中完全不同的位置。

让我们假设用户刚刚对表单中的一个字段进行了更改。我正在寻找每次发生更改时触发 JS 函数的最优雅的方法,并将具有相同类的更改字段的 all 字段的值传递给它,以便我可以创建一个 JSON 字符串,我将使用 Jquery 的 .AJAX 调用发送该字符串,以更新我的数据库中的记录。

例如,如果用户选择'cat' - 'ugly',会调用一个可以创建变量的JS函数:

fields = {  "cat":"ugly",
            "cat_qty" : "6"}

然后

$.ajax({type: "POST",
    url: "ajax/update.php",
    data: { Myfields: fields },
    dataType: "json",
    success: function() {}
       });

你能推荐一个优雅的方式吗?我不确定是否使用 OnChange 调用、Jquery 'Change' 功能(无论哪种方式我都没有找到如何使用它们..)或任何其他方式:)

非常感谢!

【问题讨论】:

    标签: javascript jquery html json


    【解决方案1】:

    首先,您必须为所有输入字段提供名称(以及表单 ID):

    <form id='pickAnimal'>
        <!--Category: Cats-->
        <label>Cat:</label>
        <select id="cat" class="cats" name='cat'>
            <option>nice</option>
            <option>ugly</option></select>
        <label>Quantity:</label>
        <input type="text" id="cat_qty" class="cats" name='cat_qty' />
        <br />
        <!--Category: Dogs-->
        <label>Dog:</label>
        <select id="dog" class="dogs" name='dog'>
            <option>nice</option>
            <option>ugly</option></select>
        <label>Quantity:</label>
        <input type="text" id="dog_qty" class="dogs" name='dog_qty'/>
        <br />
    </form>
    

    然后是js序列化选择:

    $('input, select', $('#pickAnimal')).change(function(){
    
        var theClass = $(this).attr('class');
        var theForm = $('#pickAnimal');
    
        var dataFields = $('.'+theClass, theForm).serialize();
        //gets all data from fields in the form that have the same class
    
        $.ajax({
           type: "POST",
           url: "ajax/update.php",
           data: dataFields,
           dataType: "json",
           success: function() {}
        });
    })
    

    【讨论】:

      【解决方案2】:

      jQuery 更改:http://api.jquery.com/change/

      它的使用方法如下:

      $('#cat, #dog').change(function(e) {
      
          var _this = $(this);
          var value = _this.val();
          var id = _this.attr('id');
          var input = _this.siblings(':input');
          var quantity = input.val();
      
          var data = {};
          data[id] = value;
          data[input.attr('id')] = quantity;
      
          // do ajax stuff
      
      });
      

      【讨论】:

      • 这根本不是很可扩展,您必须为表单中的每个新元素添加一行...
      • 我同意。更好的解决方案是通过为您要使用此代码的每个元素提供相同的类,并将选择器更改为该类来使其通用。此外,如果他的数据需要以与元素名称不匹配的特定方式格式化,则序列化将无济于事。但我认为数据应该与元素一起存储,以便它们可以轻松序列化并让服务器期望它们以这种格式。
      • @Eli 这基本上就是我在回答中所做的,这就是 OP 所拥有的。
      • 我是在举例说明如何使用更改,而不是如何序列化元素。
      • 部分问题是关于使用变更,前一部分是关于序列化变量
      猜你喜欢
      • 2014-10-31
      • 2014-11-24
      • 2021-04-03
      • 2011-03-05
      • 2019-10-18
      • 1970-01-01
      • 2022-12-15
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多