跟踪大型输入表单中的更改的最快(Javascript/jQuery)方法

跟踪大型输入表单中的更改的最快(Javascript/jQuery)方法,javascript,jquery,asp.net-mvc,performance,Javascript,Jquery,Asp.net Mvc,Performance,由于Javascript性能在大型输入表单上可能会变得很高,那么跟踪和标记输入字段更改的最干净、最快速的方法是什么 该项目使用.NET(MVC),输入绑定到ViewModels,但这可能(至少是半)不相关。我主要关心的是,如果可能有几千个字段和一些隐藏的输入字段(通常数量较少,但在某些情况下可能有几千个),则避免性能问题。有下拉列表、文本字段、复选框等 具有各种输入类型的长表单 <input type="... textbox/select..." class="trackMe" ...

由于Javascript性能在大型输入表单上可能会变得很高,那么跟踪和标记输入字段更改的最干净、最快速的方法是什么

该项目使用.NET(MVC),输入绑定到ViewModels,但这可能(至少是半)不相关。我主要关心的是,如果可能有几千个字段和一些隐藏的输入字段(通常数量较少,但在某些情况下可能有几千个),则避免性能问题。有下拉列表、文本字段、复选框等

具有各种输入类型的长表单

<input type="... textbox/select..." class="trackMe" ... />
<input type="hidden" class="hiddenInputIsDirty" ... />

或者在输入上使用
onClick=“Observe.MarkChanged();”

(function( Observe, $, undefined ) {        
    //Public Method
    Observe.MarkChanged = function() {
        $(this).sibling("#hiddenInputIsDirty").val("true")
    };        
}( window.Observe= window.Observe|| {}, jQuery ));
澄清:每个可见输入字段将有一个隐藏的输入字段进行标记。当用户更改输入字段的值时,它将触发某些操作,将隐藏字段标记为已更改。我认为这是跟踪变化的最快、最可靠的方法。这些方法中有一种是已知的更快的方法,还是有更快的替代方法

您可以使用

我推荐。

您可以使用


我推荐。

一个简单的方法,你可以立即使用,就是使用一个对象来保持你的跟踪,而不是多个隐藏的输入。多个隐藏输入只会使表单元素加倍并降低速度。稍后,你可以学习并转到图书馆,图书馆将为你提供现成的一切

大概是这样的:

// initialize at the start
var tracker = new Object;

$('input.formfield').each(function() {
    tracker[$(this).attr('id')] = false;
});

// and then later on

$(".track").on("change", function() {
    tracker[$(this).attr('id')] = true;
});
首先使用与表单输入
id
s相同的属性名初始化对象,并将其设为false。然后在进行任何更改时,只需翻转相应的属性即可。完成后,您只需将此对象传递给服务器端代码或在提交之前进行检查

检查这把小提琴:


是的,无论您使用什么库,数千个表单字段可能都不是一个好主意。实现类似于分页的向导。

一种可以立即使用的简单方法是使用一个对象来保存跟踪,而不是使用多个隐藏输入。多个隐藏输入只会使表单元素加倍并降低速度。稍后,你可以学习并转到图书馆,图书馆将为你提供现成的一切

大概是这样的:

// initialize at the start
var tracker = new Object;

$('input.formfield').each(function() {
    tracker[$(this).attr('id')] = false;
});

// and then later on

$(".track").on("change", function() {
    tracker[$(this).attr('id')] = true;
});
首先使用与表单输入
id
s相同的属性名初始化对象,并将其设为false。然后在进行任何更改时,只需翻转相应的属性即可。完成后,您只需将此对象传递给服务器端代码或在提交之前进行检查

检查这把小提琴:


是的,无论您使用什么库,数千个表单字段可能都不是一个好主意。实现类似于分页的向导。

您可以看到以下jquery库来跟踪更改。

您可以看到以下jquery库来跟踪更改。

何必麻烦呢?在考虑JS的性能之前,我想问一下为什么一个页面上需要“数千”个输入。您不能将输入拆分为多个集合并在它们之间分页吗?您可以使用MVVM模式impl。比如击倒或者你可以使用谷歌的angularjs。据我所知,angularjs在没有jquery的情况下也提供了很多功能。最终它将被重构(并分解成更小的部分),但它的使用方式在实现时是“不可预见的”,需要一直工作到那时。如果值没有改变,我不希望不必要地访问数据库,可能会有上千次或更多的更新。我会检查淘汰赛和安格拉斯。为什么要麻烦呢?在考虑JS的性能之前,我想问一下为什么一个页面上需要“数千”个输入。您不能将输入拆分为多个集合并在它们之间分页吗?您可以使用MVVM模式impl。比如击倒或者你可以使用谷歌的angularjs。据我所知,angularjs在没有jquery的情况下也提供了很多功能。最终它将被重构(并分解成更小的部分),但它的使用方式在实现时是“不可预见的”,需要一直工作到那时。如果值没有改变,我不希望不必要地访问数据库,可能会有上千次或更多的更新。我会检查knockout和angularjs。我怎么能只发布更改后的表单输入?@Hriju:发布表单时,整个表单都会被发布。为了实现您想要的,您可以实现自定义Ajax回调。或者使用一个为你做这件事的图书馆。谢谢你的回复。我正在使用序列化函数。我想发布id='true'的输入表单字段。有没有办法将id为true的字段传递给序列化函数。我如何才能只发布已更改的表单输入?@Hriju:发布表单时,将发布整个表单。为了实现您想要的,您可以实现自定义Ajax回调。或者使用一个为你做这件事的图书馆。谢谢你的回复。我正在使用序列化函数。我想发布id='true'的输入表单字段。是否有方法将id为true的字段传递给序列化函数。