1

我有一个包含 2 个表单的页面和一个位于两个表单之外的隐藏字段。

隐藏字段如何与任何一种形式一起提交?

我想过用 jQuery 做这样的事情:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            // do something to move or copy the
            // hidden field to the submitting form
        });
    });
</script>

这行得通吗?还有其他想法吗?

编辑

隐藏字段存储了一个不会改变的序列化对象图。两种服务器方法都需要该对象。序列化的对象字符串可能会变得非常庞大,所以我不希望这个东西从服务器发送 2 次。

4

5 回答 5

4

您可以在提交之前将元素的副本简单地注入到每个表单中。这样,您可以选择为每个隐藏的表单字段提供不同的信息,而不会影响另一个。


像这样的东西:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            $("#hidden_element").clone().appendTo(this);
        });
    });
</script>

如果您想在不创建新副本的情况下对两个表单使用完全相同的元素,请不要使用clone()


请参阅clone()appendTo()的文档

编辑:

如果您不想在表单发送的每个请求中都发送隐藏元素。考虑将其存储在该用户的数据库中。您可以提交其内容一次,并且仅在每次重新加载页面时提交一次,然后只需在每个表单帖子中发送隐藏元素的数据库 ID。

在页面加载时,如下所示:

$.post("page.php", { reallyBigObject : $("#hiddenfield").val() }, function(insertedID){
  $("#hiddenfield").val(insertedID);
});

然后,在服务器端代码中:

//insert $_POST["reallyBigObject"] into databse
//get the just inserted id (in php it's done with mysql_insert_id())
//echo, or print the just inserted id, and exit

这样你的 js 就会得到回调。

现在,您可以按照自己的方式提交表单,但是这一次,您只是将 id(整数)发送到服务器。然后,您可以简单地从服务器中删除该对象(在 X 时间后运行一个 cron 来执行此操作,或者发送另一个请求来删除它。

不过,老实说,除非您的对象是 HUGE(!!),否则我认为通过仅提交一次来存储它比简单地向服务器发送两个请求要复杂得多。

如果您还有其他问题,请告诉我...

于 2009-07-31T17:38:43.100 回答
4

在 HTML5 中,您可以在 input 元素中包含“form”属性。form 属性的值是该字段所属的表单的 id。要在多个表单中包含该字段,请将所有表单 ID 包含在以空格分隔的列表中。不幸的是,IE 根本不支持 form 属性(从 IE 9 开始)。FF 和 Chrome 支持分别从版本 4 和 10 开始。

于 2011-10-24T22:12:54.490 回答
2

在页面加载时将字段附加到两个表单:

$(function() {
    $('#form1, #form2').append($('input[name=fieldName]'));
});
于 2009-07-31T17:34:33.530 回答
1

假设您正在执行非 ajax 提交,您可以将字段附加到正在提交的表单中。但是,如果您需要这两种形式的信息,最好将此值服务器端存储在会话存储中。这样任何非 js 客户端也可以工作!

 $(function() {
        $('form').submit(function() {
             $('input.yourhiddenSubmit').appendTo(this);
        });
    });
于 2009-07-31T17:35:21.890 回答
1

将变量传递给下一个表单的唯一方法是在提交表单时传递的数据中包含该变量(GET 或 POST),除非您想使用 AJAX。假设您出于“充分的理由”想要在实际表单之外使用隐藏变量,我建议您在提交之前使用 jQuery 将隐藏的输入字段包含到表单中,如下所示:

<script type="text/javascript">
    $(function() {
        $('form').submit(function() {
            $(this).append("<input type='hidden' name='hiddenField' value='"+$("#hiddenField").val()+"' />");
            return true;
        });
    });
</script>

将“hiddenField”的所有实例替换为表单外隐藏字段的 ID。这将在表单提交之前在表单内部创建一个新输入,其中包含页面其他位置的隐藏字段的值。

除此之外,您必须更具体地说明您的确切问题是什么(以及为什么该字段未包含在表单中),以便我提供帮助。

请注意,上面的代码理论上应该可以工作,但我没有机会亲自进行实际测试。

于 2009-07-31T17:39:10.587 回答