【问题标题】:Newbie to Javascript: how to avoid sending data that have not changed?Javascript新手:如何避免发送未更改的数据?
【发布时间】:2015-03-28 20:29:11
【问题描述】:

我是 Javascript 新手,我想发布输入复选框的序列化数据。数据被发送到服务器以更新 SQL 表中的相应字段。稍后,用户可以查看他第一次做出的选择并取消选择一些复选框。如果我理解得很好,只会发送选定的项目,而不是未选择的项目。如何发送更新新选择的项目新未选择的项目所需的所有信息?

我找到的唯一解决方案是进行 2 次更新:第一次将所有行重置为 0,第二次将在序列化数组中发送的选定项目(新选择或未选择)设置为 1。有没有更优化的方法来完成这项工作?理想情况下,我只会更新已更改的数据。有可能吗?

问候, 帕特里克

【问题讨论】:

  • 你不会每次有变化就提交表单,你只需在他们点击提交按钮时提交一次。填写表格时是否有特殊原因需要实时更新数据库?
  • 对不起,如果我不清楚。我只在他们单击提交后才提交表单。但问题仍然存在:如何只更新与已更改(新选中和新取消选中)的复选框对应的行?

标签: javascript post checkbox sql-update


【解决方案1】:

如果我理解正确,您可以过滤复选框,然后您也可以将未选中的框添加到参数中。

我在 SO 找到了代码。见this question

下面的演示和这里的jsfiddle 仅在用户更改数据时才进行 ajax 发布。不确定这是否是您想要的。

(SO 的演示稍作修改,因为需要 JSONP 才能获得没有CORS 错误。)

var data = "";

$('form').submit(function (evt) {
    evt.preventDefault();
    //console.log($(this).serialize());
    var formData = $(this).serialize();

    // source from this SO question https://stackoverflow.com/questions/10147149/how-can-i-override-jquerys-serialize-to-include-unchecked-checkboxes
    // include unchecked checkboxes. use filter to only include unchecked boxes.
    $.each($('form input[type=checkbox]')
        .filter(function (idx) {
        return $(this).prop('checked') === false
    }),

    function (idx, el) {
        // attach matched element names to the formData with a chosen value.
        var emptyVal = "off";
        formData += '&' + $(el).attr('name') + '=' + emptyVal;
    });
    
    console.log(formData);
    if ( data != formData ) { // check if user changed the data.
        $.ajax({
            url: 'http://jsfiddle.net/echo/jsonp/',
            type: 'POST',
            //data: formData, // this will work but for jsfiddle echo the code below is required.
            dataType: "jsonp",
            data: {
                json: JSON.stringify({
                    serialized: formData
                }),
                delay: 1
            },
            success: function(res) {
                console.log('posted: ', res);
            }
        });
    }
    
    data = formData;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
    <label for="first">check1</label>
    <input name="first" id="first" type="checkbox" />
    <label for="second">check2</label>
    <input name="second" id="second" type="checkbox" />
    <label for="third">check3</label>
    <input name="third" id="third" type="checkbox" />
    <label for="fourth">check4</label>
    <input name="fourth" id="fourth" type="checkbox" />
    <input type="submit" value="update" />
</form>

【讨论】:

  • 也许我没有正确理解它,但我不明白为什么发送所有复选框很有用(毕竟可以轻松确定所有未选中的项目:它们不是被选中!)。我的目标是仅发送已更新(选择或未选择)的项目,以便稍后执行单个 SQL UPDATE 而不是两个。我错过了什么吗?
  • 哦,好吧,你说得对。我误解了你在找什么。现在很清楚了。请看一下jsfiddle。我已经更新了它,现在它应该适合你。我稍后会更新我的答案。
  • 感谢您对AWolf的所有帮助。我不确定修改后的版本是否正在做我想要的。例如,如果第一次选择复选框 1,2 和 4 而您取消选择 2,我希望您的控制台中更新的数据为 { second="off"} 但它是 { first="on", Fourth="on "}.
  • 正如您在评论中所写,off 值可以轻松确定。所有不是on 的都是off。所以在你的例子中,服务器可以更新你的数据,所以只有第一个和第四个是on
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2017-07-07
相关资源
最近更新 更多