【问题标题】:Onchange submit of a form with ajax and without the form idOnchange 提交带有 ajax 且没有表单 ID 的表单
【发布时间】:2015-01-10 09:09:34
【问题描述】:

我的页面由一个表格组成,其中每个单元格都是一个表格。 我希望在更改输入值 (onchange) 时提交这些表单,但我不希望在执行此操作时刷新整个页面。

例如,我希望用户能够在一个单元格中输入一个值,然后在提交第一个表单(他们填写的第一个单元格)时,TAB 到下一个单元格而不失去焦点。

我已经在网上阅读了很多关于此的页面,但没有一个符合我的需求,因为我还有一个限制。我的表格构成的表格是通过 Django 生成的,因此它们都具有相同的 ID。 所以我不能使用 id 从 (java) 脚本中选择表单。

我一直在尝试使用 this.form 或 event.form 或 $(this).form 但无济于事。

这些表格是这样的:

<form action="" method="POST" id="progress_form">
{% csrf_token %}
<input type="number" id="percent_cell" name="percentdone" min="0" max="100" onchange="progressChange(event)" placeholder={{ d|prog:task.id }}>%&nbsp;
<input type="hidden" id="percent_cell2" name="task" value={{ task.id }}>
<input type="hidden" id="percent_cell3" name="date" value={{ d|date:"d/m/Y" }}>
<input type="hidden" id="percent_cell4" name="update_progress" value=True>
<input type="hidden" id="percent_cell5" name="tab" value="track">
</form>

这是我的脚本的样子:

function progressChange(e) {
        var form = e.form;
        var dataString = form.serialize();
        alert(dataString);
        $.ajax({
            type: "POST",
            url: $(form).attr( 'action' ),
            data: dataString,
            success: function() {
                alert("prout");
            },
        });
    }

【问题讨论】:

  • 为什么会有多个输入具有相同的id 属性?
  • 也许是$(this).closest('form')api.jquery.com/closest
  • 使用类而不是 Id 或更改 id。
  • 更改 ID 是不够的。单元格的数量可以根据用户的输入而改变。不可能为每个可能的 ID 创建脚本,因为该数字是动态的。
  • 在许多对象上具有相同的 id 不是 HTML 有效的!

标签: javascript jquery ajax django forms


【解决方案1】:

更改多个字段的相同 ID 并将 this 对象传递给函数 progressChange()

<form action="" method="POST" id="progress_form">
{% csrf_token %}
<input type="number" id="percent_cell0" name="percentdone" min="0" max="100" onchange="progressChange(this)" placeholder={{ d|prog:task.id }}>%&nbsp;
<input type="hidden" id="percent_cell1" name="task" value={{ task.id }}>
<input type="hidden" id="percent_cell2" name="date" value={{ d|date:"d/m/Y" }}>
<input type="hidden" id="percent_cell3" name="update_progress" value=True>
<input type="hidden" id="percent_cell4" name="tab" value="track">
</form>

获取当前对象的父元素即表单并序列化:

function progressChange(obj) {
        var $form = $(obj).closest('form'); // OR var form = obj.from;
        var dataString = $form.serialize();
        alert(dataString);
        $.ajax({
            type: "POST",
            url: $(form).attr( 'action' ),
            data: dataString,
            success: function() {
                alert("prout");
            },
        });
    }

【讨论】:

  • 我已经更改了输入 ID,因为每个人都被这个事实所困扰。这只是复制和粘贴的结果。我已尝试按照您的建议传递“this”并通过“obj.parent”获取表单,但我在控制台中收到以下错误:'Uncaught TypeError: undefined is not a function'
  • 为什么要在第二行添加“元素”?
  • 其实我是复制粘贴的,抱歉,请检查更新的代码
  • 很高兴帮助享受:)
  • 是的,你是对的。我责怪告诉我“这个”和“事件”是一回事的网站:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多