【问题标题】:How do I modify serialized form data in jQuery?如何在 jQuery 中修改序列化的表单数据?
【发布时间】:2022-01-29 15:13:03
【问题描述】:

我试图在 AJAX 中提交我的表单,所以我必须序列化()数据。但是我使用的是fckEditor,而jQuery不知道如何处理它,所以在序列化之后,我试图手动修改该值,但到目前为止还没有运气......任何想法

if(content_val!=""){
    var values = $("#frmblog").serialize();
    values.content = content_val; //content_val is the manually fetched data which I am trying to insert into the serialized content.
    alert(content_val); alert(values);
}

【问题讨论】:

  • 序列化前为什么不插入呢?
  • 问题是,在序列化过程中,'content'键中设置了一些默认值,所以我不能只附加一个新值,我必须更新已经在其中的值
  • 啊,这改变了事情;查看我的更新答案。

标签: jquery serialization fckeditor


【解决方案1】:

serialize 返回包含表单字段的 URL 编码字符串。如果您需要附加到它,您可以使用标准的 URL 编码字符串规则,例如:

var values = $("#frmblog").serialize();
values += "&content=" + encodeURIComponent(content_val);

(以上假设valuesserialize调用后总会有一个值;如果不一定如此,则在添加之前根据values是否为空来确定是否使用& .)

或者,如果您愿意,您可以使用serializeArray,然后添加到数组中并使用jQuery.param 将结果转换为查询字符串,但这似乎是一个很长的路要走:

// You can also do this, but it seems a long way 'round
var values = $("#frmblog").serializeArray();
values.push({
    name: "content",
    value: content_val
});
values = jQuery.param(values);

更新:在稍后添加的评论中,您说:

问题是,在序列化过程中,'content'键中设置了一些默认值,所以我不能只附加一个新值,我必须更新其中已有的值”

这改变了一切。在 URL 编码的字符串中查找 content 很痛苦,所以我会使用数组:

var values, index;

// Get the parameters as an array
values = $("#frmblog").serializeArray();

// Find and replace `content` if there
for (index = 0; index < values.length; ++index) {
    if (values[index].name == "content") {
        values[index].value = content_val;
        break;
    }
}

// Add it if it wasn't there
if (index >= values.length) {
    values.push({
        name: "content",
        value: content_val
    });
}

// Convert to URL-encoded string
values = jQuery.param(values);

您可能希望将其设为可重用函数。

【讨论】:

    【解决方案2】:

    现在使用 ES15。 您可以使用它来代替编辑当前提交的值(最短的)

    var values = $("#frmblog").serializeArray();
    values.find(input => input.name == 'content').value = content_val;
    console.log(values);
    

    或原生函数

    var values = $("#frmblog").serializeArray();
    values.find(function(input) { 
        return input.name == 'content';
    }).value = content_val;
    console.log(values);
    

    【讨论】:

      【解决方案3】:

      这是一个基于@T.J 答案的完整 jquery 插件。你可以打电话

      $('form#myForm').awesomeFormSerializer({
          foo: 'bar',
      })
      

      它将用值“bar”(或您在对象中添加的任何其他参数)替换或添加参数“foo”

      jQuery 插件:

      // Not builtin http://stackoverflow.com/a/5075798/2832282
      (function ( $ ) {
          // Pass an object of key/vals to override
          $.fn.awesomeFormSerializer = function(overrides) {
              // Get the parameters as an array
              var newParams = this.serializeArray();
      
              for(var key in overrides) {
                  var newVal = overrides[key]
                  // Find and replace `content` if there
                  for (index = 0; index < newParams.length; ++index) {
                      if (newParams[index].name == key) {
                          newParams[index].value = newVal;
                          break;
                      }
                  }
      
                  // Add it if it wasn't there
                  if (index >= newParams.length) {
                      newParams.push({
                          name: key,
                          value: newVal
                      });
                  }
              }
      
              // Convert to URL-encoded string
              return $.param(newParams);
          }
      }( jQuery ));
      

      【讨论】:

        【解决方案4】:

        使用以下对我有用的功能

        function(elementName,newVal)
        {
            var postData = $("#formID").serialize();
        
        var res = postData.split("&");
        var str = "";
        
        for(i=0;i<res.length;i++)
          {
            if(elementName == res[i].split("=")[0])
              {
                str += elementName + "=" + newVal+ "&";
              }
              else
              {
                str += res[i] + "&";
              }
          }
        return str;
        }
        

        【讨论】:

          【解决方案5】:

          这就是我将如何完成你所需要的

          formData = $('#'+formID).find(":input")
                                      .filter(function (i, item) {
                                          if (item.name.includes('nameToBeChanged'))
                                          {
                                              item.name = item.name.replace('nameToBeChanged', 'toChangedName');
                                              return true;
                                          } else {
                                              return false;
                                          }
                                      }).serialize();
          

          请注意,这将永久更改表单元素名称

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-20
            • 1970-01-01
            • 1970-01-01
            • 2017-05-31
            • 1970-01-01
            • 2021-05-15
            • 2013-01-02
            相关资源
            最近更新 更多