【问题标题】:Error occurs when jQuery processing a form is inside another form当 jQuery 处理表单在另一个表单内时发生错误
【发布时间】:2009-07-02 03:45:16
【问题描述】:

我正在使用 jQuery 编写表单,遇到了一些困难。

我的表单在静态页面 (html) 中运行良好。
但是,当我在动态页面(aspx)中使用表单时,表单的行为不正确。 我无法将项目附加到表单并调用 form.serialize 函数。

我认为当一个表单在另一个表单中时会发生错误(.aspx 代码需要用表单标签括起来)。

我该怎么办?

让我给出我的代码的简化版本:

<form name="Form1" method="post" id="Form1">
some content
<form name="form_inside">
<input name="fname" type="text" />
</form>
</form>

jQuery 代码:

$("#form_inside").append($("<input type='text' name='lname'>"));

当用户提交时,

$("#form_inside").serialize(); 
// it should return fname=inputfname&lname=inputlname

我想将元素附加到“form_inside”并序列化表单“form_inside”。
aspx 需要表单“Form1”,我无法删除它。

【问题讨论】:

  • 如果你发布一些代码并给出一些关于它做什么或产生什么错误的指示,这将是有帮助的。具体来说,如果您可以提供一些演示问题的 ASPX/HTML 和 jQuery 代码的非常简单的示例...
  • 请注意,您不能在 HTML 页面中嵌套
    元素。
  • 问题中添加了一个示例。谢谢。
  • 我知道我不应该嵌套
    元素。但是在我的情况下,当 aspx 需要在页面的最开始有一个
    元素时,我该怎么办?
  • 那么我认为你必须使用 that 表单元素。然后选择其他方式来协调您感兴趣的表单元素,例如使用标记 css 类或其他方式标记它们以使它们易于选择。

标签: asp.net javascript jquery forms


【解决方案1】:

你能序列化Form1里面的字段吗?

我对 ASP 一无所知,但您似乎并没有直接进行“提交” - 那么字段是否不在它们自己的单独表单中真的很重要吗?

您可以将您感兴趣的字段分组到 &lt;div&gt; 或其他名称中,例如:

<div id="my-interesting-fields">
    ...
</div>

然后在适当的地方将#form-inside 替换为#my-interesting-fields - 这有帮助吗?

编辑

好的,快速浏览一下 jQuery 代码表明 serialize() 取决于表单的 elements 成员。

我想你可以通过几种不同的方式破解它:

  • #my-interesting-fields 中的所有元素复制到您在Form1 外部动态创建的临时&lt;form&gt;,然后调用serialize()。比如:

    $("#Form1").after("<form id='tmp-form'></form>").
                append("#my-interesting-fields input");
    $("tmp-form").serialize();
    
  • 或者,在#my-interesting-fields 上创建一个elements 成员,例如

    $("#my-interesting-fields").elements = $("#my-interesting-fields input");
    $("#my-interesting-fields").serialize();
    

我没有尝试过这两种方法,但这可能会给你一些想法。并不是说我一定会推荐其中任何一个:)

【讨论】:

  • 我无法序列化“my-interesting-fields”中的表单元素。
  • 我尝试通过 $("#my-interesting-fields > input").serialize() 对其进行序列化。它不起作用。
  • 嗯。似乎 serialize() 可能只适用于表单元素。您可以尝试将这些字段复制到“临时”表单中吗?
  • 第一种方法有效。我一般是下面的代码: $("
    ").append($("#my-interesting-fields *")).serialize() 第二种方法我不太明白。跨度>
  • 第二种方法是一个丑陋的 hack,它依赖于 serialize() 的内部实现——我会避免它。该代码基本上使 div 看起来像一个表单(愚弄 jQuery)。很高兴第一种方法适合你。
【解决方案2】:

因为你不能有嵌套的

标签,你需要像下面这样关闭标准的 dotnet 表单标签:
<script type="text/javascript">
    $(document).ready(function() {
        $("#form_inside").append($("<input type='text' name='lname'>"));
        $("#submitBtn").click(function() {function() {
            var obj = $("#form_inside *");
            var values = new Array();
            obj.each(function(i,obj1) {
                if (obj1.name && !obj1.disabled && obj1.value) {
                    values.push(obj1);
                }; 
                });
                alert(jQuery.param(values));
        }); });
    });

</script>
<form id="form1" runat="server">
<div>
<div id="form_inside" name="form_inside"> <input name="fname" type="text" /><input type="button" id="submitBtn" /></div>

</div>
</form>

jQuery.param 在表单元素数组上的结果与 .serialize() 相同

所以你得到 div $("#form_inside *) 中的所有元素,然后过滤元素,然后在结果上 jQuery.param 将为你提供你所需要的

【讨论】:

  • 由于网页的结构和代码,我无法将其从dotnet表单标签中移出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多