使用 javascript 函数调用模拟 post 表单提交

Posted

技术标签:

【中文标题】使用 javascript 函数调用模拟 post 表单提交【英文标题】:Simulate post form submit with a function call with javascript 【发布时间】:2015-08-05 23:02:21 【问题描述】:

使用jQuery,我们可以模拟提交表单:

<form id="form1" method="post">
    <input name="key1" value="value1" />
    <input name="key2" value="value2" />
</form>

使用 AJAX 函数调用:

$.post('',  key1: 'value1', key2: 'value2' , function() 
   // do call back
);

如果我们使用jquery.form.js

$('#form1').ajaxSubmit(
    success: function() 
        // do call back
    
);

好的,现在我的问题来了:

我在标记中没有表单,我想使用“POST”方法提交包含一些动态内容的表单。

我想做一个函数调用来模拟这个过程,可能是这样的:

utils.post('/url', key1: 'value1', key2: 'value2');

调用之后,效果和我上面的表格一样,我提交了,自然同步的方式。

有什么好的方法吗?


如果问题不清楚,我可以做一个丑陋的例子来解释我想要什么:

util.post = function(url, fields) 
    var $form = $('<form action="'+url+'" method="post"></form>');
    var key, val;
    for(key in fields) 
        if(fields.hasOwnProperty(key)) 
            val = fields[key];
            $form.append('<input type="hidden" name="'+key+'" value="'+val+'" />');
        
    
    $form.submit();

上述方法有效,但我认为它不够好。当字段包含特殊字符或其他内容时,可能会导致错误。

【问题讨论】:

我不明白这个问题。只需使用该 URL 和数据调用 $.post() @Barmar 我只想以自然的方式提交表单,而不是使用 xhr。 “以自然的方式”是什么意思? @TylerH 效果和我提交普通表单一样,点击提交按钮。 那是POST方法。 XMLHttpRequest 也是一样的。 【参考方案1】:

您可以使用 jQuery 功能性地构造表单,而不是通过连接字符串,因此特殊字符不会成为问题。

在提交之前,您需要将此表单附加到 html body;最新版本的 Chrome now require this。

var util = ;
util.post = function(url, fields) 
    var $form = $('<form>', 
        action: url,
        method: 'post'
    );
    $.each(fields, function(key, val) 
         $('<input>').attr(
             type: "hidden",
             name: key,
             value: val
         ).appendTo($form);
    );
    $form.appendTo('body').submit();

【讨论】:

谢谢楼主。顺便说一句,您认为这样做是一个好习惯吗?我想将此功能添加到我的工具包功能中并广泛使用。 我看不出有什么理由不使用这样的东西。我强烈推荐这种创建 DOM 元素的方法,而不是构造 HTML 字符串。 代码有问题。在append函数中,应该有$('&lt;input&gt;', ...) 现在在谷歌浏览器中失败,Form submission canceled because the form is not connected 将表单附加到正文中。 $form.appendTo('body').submit()【参考方案2】:

由于接受的答案可能不再适用于例如Chromium based browsers 在某些情况下,这里有一个解决方法:

util.post = function(url, fields) 
  var $form = $('<form>', 
    action: url,
    method: 'post'
  ).append(
    $.map(fields, function(key, val) 
      return $('<input>').attr(
         type: "hidden",
         name: key,
         value: val
      ).appendTo($form);
    )
  )
  var w = window.open("about:blank")
  w.document.write($form[0].outerHTML)
  w.document.forms[0].submit()

【讨论】:

【参考方案3】:

您唯一的问题是,由于您没有可以从中获取数据的表单字段,因此无法使用 .serialize 来构建数组。您只需要手动构建数组。

Key1...Keyn 可以是您指定的名称,而不是表单字段名称属性(这实际上是序列化所做的),并且值可以是您想要的任何值:

来自 div 的 html; 您计算的值; javascript 变量; 来自 db 的值;

关键是在任何情况下您都不是在模拟发布表单。使用 ajax,您只是使其异步,这对您有帮助,因为您无需更改/重新加载页面来详细说明表单结果。

【讨论】:

以上是关于使用 javascript 函数调用模拟 post 表单提交的主要内容,如果未能解决你的问题,请参考以下文章

从 p:remoteCommand 的 oncomplete 处理程序调用 JavaScript 函数 - 使用一些 JavaScript 代码模拟相同的函数

原生Javascript使用fetch发起请求_模拟get|post|文件流下载等

我们可以从 JavaScript Post 方法调用 aspx.cs 中的非静态函数吗

JavaScript 模拟JQuery的连续调用函数

理解javascript中bind的使用和模拟实现

Javascript:调用阻塞的 HTTP POST [重复]