jquery提交会因递归而导致错误

时间:2011-06-29 08:47:18

标签: jquery submit

我有一个带有onsumbit属性的表单。我在onsumbit上调用了一个javascript函数。 我需要在表单实际提交之前在隐藏变量上设置一些值。该位在SaveQuery()函数中完成。我还在页面上有一个链接,它提供与提交表单相同的操作。我添加了onsubmit,以便在某人按下Enter键时提交表单。

问题是当使用jquery v1.4.4库时,表单似乎是递归提交的。我该如何避免这种情况发生。使用jquery v1.3.2,似乎没有问题。

表格:

<form id="savequery" action="savedquery.aspx" method="post" onsubmit="SaveQuery(); return false;">
        <input type="hidden" id="orig_q" name="orig_q" value="" />
        <input type="hidden" id="isFullText" name="isFullText" value="" />
        <input id="queryName" name="queryName" value="New Query" />
        </form>
        <table class="centerButton">
            <tbody>
                <tr>
                    <td>
                        <div id="proceedSave" class="butActive idProceed">
                            <p>
                            </p>
                            <div>
                                <a href="#" onclick="SaveQuery();">Proceed</a></div>
                        </div>
                        <!-- duplicate text item -->
                    </td>
                </tr>
            </tbody>
        </table>

SaveQuery功能:

SaveQuery = function () {
    $("#orig_q").val(document.getElementById("txtQuery").value);
    $("#isFullText").val(document.getElementById("chkFulltext").checked);
    $("#savequery").submit();
}

3 个答案:

答案 0 :(得分:2)

您在 SaveQuery的{​​{1}}处理程序以及onsubmit的点击操作中致电<form>。然后该函数再次调用<a>,这将触发调用submit()的函数,该函数触发函数等等......所以当然它会递归!只需在点击事件上调用submit(),就可以了。

答案 1 :(得分:2)

不是停止提交并触发它,而是让它通过:

onsubmit="SaveQuery();"

var SaveQuery = function () {
  $("#orig_q").val(document.getElementById("txtQuery").value);
  $("#isFullText").val(document.getElementById("chkFulltext").checked);
}

答案 2 :(得分:1)

我无法对这两个库之间的差异发表评论,但我建议您对代码进行简单修改即可解决问题。

在您的表单标记中,您有一个onsubmit="SaveQuery();标签,然后在点击Proceed时调用此功能。在我看来,这应该呈现你看到的行为,无论早期版本的jQuery是否掩盖它。

只需执行此onsubmit声明即可。

随机红利评论

您正在混合JavaScript和jQuery DOM交互方法。为什么不使用jQuery:

$("#orig_q").val($("#txtQuery").val());
$("#isFullText").val($("#chkFulltext").attr("checked"));