动态创建并提交表单

Posted

技术标签:

【中文标题】动态创建并提交表单【英文标题】:Dynamically create and submit form 【发布时间】:2011-12-21 15:09:22 【问题描述】:

jQuery 中有没有一种方法可以即时创建和提交表单?

如下所示:

<html>
    <head>
        <title>Title Text Goes Here</title>
        <script src="http://code.jquery.com/jquery-1.7.js"></script>
        <script>
            $(document).ready(function()alert('hi'));
            $('<form/>').attr('action','form2.html').submit();
        </script>
    </head>
    <body>
        Content Area
    </body>
</html>

这应该有效还是有其他方法可以做到这一点?

【问题讨论】:

你读过API吗? 还可以在这里查看接受的答案:***.com/questions/14836557/… 【参考方案1】:

您的代码有两个问题。第一个是你包含了$(document).ready();,但没有用它来包装创建元素的jQuery对象。

第二个是您使用的方法。 jQuery将在替换您要创建的元素时替换选择器(或通常将选择器)替换为您要创建的元素时创建任何元素。然后,您只需将其附加到正文并提交即可。

$(document).ready(function()
    $('<form action="form2.html"></form>').appendTo('body').submit();
);

Here's 正在运行的代码。在这个例子中,它没有自动提交,只是为了证明它会添加表单元素。

Here's 自动提交的代码。效果很好。 Jsfiddle 将您带到 404 页面,因为显然其服务器上不存在“form2.html”。

【讨论】:

你提到的第一个问题虽然不是问题:) @user42540:不一定,但最好在页面加载完成后触发您的 JS 代码。这将防止不必要的错误。 它可能适用于某些浏览器,但有充分的理由将大多数 DOM 操作代码包含在 $(document).ready() 块中 - 它确保浏览器能够安全地对 DOM 进行任何更改。否则,如果您在整个页面加载之前尝试更改任何内容,IE6/7 等挑剔的浏览器就会吐出假人。【参考方案2】:

是的,这是可能的。解决方案之一如下 (jsfiddle as a proof)。

HTML:

<a id="fire" href="#" title="submit form">Submit form</a>

(看,上面没有表格)

javascript

jQuery('#fire').click(function(event)
    event.preventDefault();
    var newForm = jQuery('<form>', 
        'action': 'http://www.google.com/search',
        'target': '_top'
    ).append(jQuery('<input>', 
        'name': 'q',
        'value': 'stack overflow',
        'type': 'hidden'
    ));
    newForm.submit();
);

上面的示例向您展示了如何创建表单、如何添加输入以及如何提交。有时X-Frame-Options 禁止显示结果,所以我将target 设置为_top,它替换了主窗口的内容。或者,如果您设置_blank,它可以显示在新窗口/标签中。

【讨论】:

很好的解决方案(虽然有点长),但输入没有显示出来。 @Purmou:实际的解决方案是创建表单,然后调用submit()。我特意提供了长表单创建代码来展示如何创建表单及其元素。我相信这还不错。 .appendTo('body') 需要它才能在我的 Firefox (23.0.1) 中工作。否则它只返回一个表单对象但不提交。 newForm.hide().appendTo("body").submit(); // 不显示字段并在 FF 中工作 就像这是一个 GET 并且类似于将查询字符串附加到目标 URI。会假设很多人都想使用表单来发布。如果不明显,请使用'method': post 来完成。【参考方案3】:

它是我的没有jQuery的版本,简单的功能可以在飞行中使用

功能:

function post_to_url(path, params, method) 
    method = method || "post";

    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) 
        if(params.hasOwnProperty(key)) 
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         
    

    document.body.appendChild(form);
    form.submit();

用法:

post_to_url('fullurlpath', 
    field1:'value1',
    field2:'value2'
, 'post');

【讨论】:

【参考方案4】:

与 Purmou 类似,但在提交时会删除表单。

$(function() 
   $('<form action="form2.html"></form>').appendTo('body').submit().remove();
);

【讨论】:

【参考方案5】:

Josepmra 示例非常适合我的需要。 但我必须添加行 form.appendTo(document.body) 才能正常工作。

var form = $(document.createElement('form'));
$(form).attr("action", "reserves.php");
$(form).attr("method", "POST");

var input = $("<input>")
    .attr("type", "hidden")
    .attr("name", "mydata")
    .val("bla" );

$(form).append($(input));

form.appendTo(document.body)

$(form).submit();

【讨论】:

【参考方案6】:

是的,你只是忘记了引号......

$('<form/>').attr('action','form2.html').submit();

【讨论】:

什么是javascript错误?试着把它放在ready函数中 这不适用于旧 IE,因为它不附加在 HTML DOM 上。它需要在开始工作之前附加到&lt;body&gt;【参考方案7】:

试试这段代码,这是一个完全动态的解决方案:

var form = $(document.createElement('form'));
$(form).attr("action", "reserves.php");
$(form).attr("method", "POST");

var input = $("<input>").attr("type", "hidden")
                        .attr("name", "mydata")
                        .val("bla");
$(form).append($(input));
$(form).submit();

【讨论】:

【参考方案8】:

你为什么不直接$.post$.get

GET 请求:

$.get(url, data, callback);

POST 请求:

$.post(url, data, callback);

那么你就不需要表单了,只需在你的数据对象中发送数据即可。

$.post("form2.html", myField: "some value", function()
  alert("done!");
);

【讨论】:

因为需要从服务器触发下载并且使用 post/get 它不起作用。 还有这个你不会离开页面。 @a20 缺少的是服务器端标头Content-Disposition: Attachment; 强制下载。 @SparK hmmmm .. 您的评论让我想知道,服务器端是否存在浏览器可以解释(或不解释和强制)下载的任何 mime 类型。例如一个 zip 文件。是否不可能以任何方式指定它是响应用户的下载请求所以触发下载... @a20 是的,Content-Type: application/octet-stream;。锚点中还有 download 属性...客户端的东西 (davidwalsh.name/download-attribute)【参考方案9】:

使用 Jquery

$('<form/>',  action: url, method: 'POST' ).append(
    $('<input>', type: 'hidden', id: 'id_field_1', name: 'name_field_1', value: val_field_1),
    $('<input>', type: 'hidden', id: 'id_field_2', name: 'name_field_2', value: val_field_2),
).appendTo('body').submit();

【讨论】:

【参考方案10】:

采取的步骤:

    首先您需要创建表单元素。 您必须通过表单传递要导航到的 URL。 为表单指定method 类型。 添加表单正文。 最后在表单上调用submit()方法。

代码:

var Form = document.createElement("form");
Form.action = '/DashboardModule/DevicesInfo/RedirectToView?TerminalId='+marker.data;
Form.method = "post";
var formToSubmit = document.body.appendChild(Form);
formToSubmit.submit();

【讨论】:

【参考方案11】:

假设你想创建一个带有一些参数的表单并进行 POST 调用

var param1 = 10;

$('<form action="./your_target.html" method="POST">' +
'<input type="hidden" name="param" value="' + param + '" />' +
'</form>').appendTo('body').submit();

如果您愿意,也可以在一行中完成所有操作 :-)

【讨论】:

【参考方案12】:

您可以在提交时在表单中使用此功能。

但这是在 javascript 中,我想将其更改为 jquery。

我在网上搜索过,但没有一个保留 DOM,所以提交后可以将其删除。

const trimTypes = ['email', 'hidden', 'number', 'password', 'tel', 'text', null, ''];

function submitTrimmedDataForm(event) 
    event.preventDefault();

    let currentForm = event.target;
    var form = document.createElement("form");
    form.style.display = "none";
    form.method = currentForm.getAttribute('method');
    form.action = currentForm.getAttribute('action');

    Array.from(currentForm.getElementsByTagName('input')).forEach(el => 
        console.log("name :" + el.getAttribute('name') + ", value :" + el.value + ", type :" + el.getAttribute('type'));
        var element = document.createElement("input");
        let type = el.getAttribute('type');
        if (trimTypes.includes(type)) 
            element.value = trim(el.value);
        
        element.name = el.getAttribute('name');
        element.type = el.getAttribute('type');
        form.appendChild(element);
    );

    Array.from(currentForm.getElementsByTagName('select')).forEach(el => 
        console.log("select name :" + el.getAttribute('name') + ", value :" + el.value);
        var element = document.createElement("input");
        element.value = el.value;
        element.name = el.getAttribute('name');
        element.type = 'text';
        form.appendChild(element);
    );

    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form); // this is important as well

【讨论】:

以上是关于动态创建并提交表单的主要内容,如果未能解决你的问题,请参考以下文章

提交带有动态创建的表单输入的 json 请求

动态创建的索引字段未与表单一起提交

Javascript未从动态生成的表单提交数据

动态创建的表单将 null 提交给控制器 (MVC)

使用 *ngFor 并从中提交值的动态表单

通过AJAX提交动态表格表单并获取亲属值到PHP中