如何从表单序列化中排除按钮和标签?

时间:2019-03-19 03:48:39

标签: javascript jquery forms serialization

我想使用表格序列化,但是从序列化中排除按钮和标签。

这是我拥有的javascript版本:

var saveBtn = document.getElementById("btnSaveButton");
var saveLbl = document.getElementById("lblSaveLabel");
var originalFormData = $("#MasterForm").not(saveBtn, saveLbl).serialize();
$("form :input").on('change keyup paste mouseup', function () {
    var newFormData = $("#MasterForm").serialize();
    if (originalFormData != newFormData) {
        //some code
    } else {
        //some other code
    }
});

请参阅:.not(saveBtn,saveLbl)

那不排除按钮或标签。

有人可以帮助我,让我知道如何从序列化中排除按钮和标签吗?

实际上,我会根据用户是否对表单进行任何更改,将显示从按钮切换到标签,然后再切换回标签。

UPDATE UPDATE

谢谢您的回应...似乎有些不对劲...

可能有太多的html不能在此处发布...

使用vb.net。我有一个母版页,其中有一个名为Admin.aspx的页面,其中有一个名为Bundles.ascx的用户控件。

在Bundles.ascx的代码中,我有以下javascript:

    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_pageLoaded(prmRequest);
    prm.add_endRequest(prmRequest);
    function prmRequest(sender, args) {
       setupFormChangeCheck("btnSaveBundle", langId); 
   }

在一个主要的javascript文件中,我具有函数setupFormChangeCheck,它看起来像这样:

function setupFormChangeCheck(txtName, langId) {
    try {
        savebtnFnctn('dis', txtName, langId)
        var originalFormData = $("#MasterForm").serialize();
        $("form :input").on('change keyup paste mouseup', function () {
            var newFormData = $("#MasterForm").serialize();
            if (originalFormData != newFormData) {
                savebtnFnctn('en', txtName, langId)
            } else {
                savebtnFnctn('dis', txtName, langId)
            }
        });
    } catch (err) { }
}

在同一主javascript文件中,我具有函数savebtnFunction,它看起来像这样:

function savebtnFnctn(event, txtName, langId) {
    var saveBtn = document.getElementById(txtName);
    var saveLbl = document.getElementById(txtName.replace("btn", "lbl"));
    if (event == 'en') {
        saveBtn.style.display = "inline";
        saveLbl.style.display = "none";
    } else if (event == 'dis') {
        saveBtn.style.display = "none";
        saveLbl.style.display = "inline";
    }
}

用户控件是动态加载的,因为同一页面上有多个使用控件,并且除非我动态加载一个控件,否则所有加载...都会使速度减慢。

动态加载用户控件会导致严重的回发挑战。因此,绝大多数用户控件交互都是通过jquery在客户端进行处理的。对于Bundle.ascx,这是在Bundle.js中完成的

SOOOOO ....

加载用户控件后,将触发setupFormChangeCheck,它在功能savebtnFnctn中运行'dis'(禁用)事件。

这是我今天在尝试上述建议中的代码时注意到的问题。

当我在Bundle uc中进行交互时,setupFormChangeCheck从一开始就不会触发。首先触发的是这行$(“ form:input”)。on('change keyup paste mouseup',function()

无论我做什么,即使没有更改也单击文本框会导致以下结果:originalFormData!= newFormData为true,并且“保存”按钮保持启用状态...

我应该补充说,捆绑用户控件中的所有控件都在一个updatepanel中:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">

长解释,我知道,对不起...如果有人有解决这个问题的想法,我将永远感激不已。

谢谢。埃里克

1 个答案:

答案 0 :(得分:0)

jQuery的.not()方法使用选择器,而不是元素。 另外,您要匹配表单本身,而不是表单的输入。

由于您确实知道要排除的元素的ID,因此请改用它:

var data = $("#MasterForm").find("input, textarea, select").not("#btnSaveButton, #lblSaveLabel").serialize();
  1. 您选择表格。
  2. 然后选择下面的表单元素。
  3. 然后您从集合中排除具体元素。
  4. 最后一次序列化结果。

注意:您应该使用严格比较!==而不是!=