为什么告诉jQuery单击我的链接按钮减慢我的页面?

我不知道这是更新面板的效果还是什么,但我基本上有一个下拉列表,允许用户选择一个项目作为filter。 选择项目后,它应该只将一个项目带回网格视图。 也就是说,这个特定的filter最多会带回您正在寻找的记录。 如果用户单击“应用”链接以应用filter,则此方法正常。 apply链接的后面是一些服务器端代码(ASP.NET Web窗体应用程序中的C#)。

我们收到了一个用户的请求,其中包含以下内容:

“如果我在这个下拉filter中进行选择,为什么我必须单击”应用“按钮…它应该只是获取我正在搜索的那条记录。这有助于我,因为我没有必要单击”应用“ “按钮。”

我同意他并认为最简单的方法是什么…我想:简单,我将有一个on down的更改事件处理程序,以便在进行选择时我将触发click事件。 这样的效果:

$("#MainContent_ddlCompany").on("change", function() { var companyId = $("#MainContent_ddlCompany").val(); $("#MainContent_hdnCompanyValue").val(companyId); $("#").trigger("chosen:updated"); if (companyId.length > 0) { $(".apply").click(); $(".apply").removeClass("applyButton"); $(".apply").addClass("resetButton"); } else { //cleared selection of a company $(".apply").removeClass("resetButton"); $(".apply").addClass("applyButton"); } }); 

起初这不起作用,我不知道为什么,但经过一些严肃的谷歌搜索,我改变了这一行:

 $(".apply").click(); 

对此:

 $('.apply')[0].click(); 

这很有效……所以我决定再试一次。 当我一个接一个地选择一个过滤值时,我注意到页面开始变慢。 事实上,到了第6或第7次,它几乎无法使用。 我不知道为什么会发生这种情况,但我怀疑它与这个带有类名.apply的链接按钮位于更新面板中的事实有关。

但我仍然想到,在我更改jQuery代码以模拟click事件之前,它位于更新面板内部。 那么为什么页面会因为这段代码而变慢并拖动? 从jQuery代码调用事件是否在HTML中呈现了可能导致此问题的其他内容?

如果我更改了我的代码并强制用户单击“应用”按钮,那么我们将恢复到正常速度。 为什么我告诉jQuery模拟单击按钮我的页面减速? 它正在做同样的事情,点击这个链接按钮的模拟是调用它的服务器端代码方法,无论用户是否点击它或我有jQuery点击它。

现在我不知道为什么会发生这种情况,因为这个按钮在任何一种情况下都在更新面板中,但是当我有jQuery时,通过$('.apply')[0].click(); 几次尝试后页面变慢。 然而,当我让用户只需单击此按钮(没有jQuery点击事件),那么它工作正常吗?

我在这里想念的是什么?

呃,好吧,我发现了我的问题。 因为我使用的是updatepanels,所以我必须包装我的jQuery代码以包含add_endRequest 。 也就是说,你有一些效果:

 $(document).ready(function() { //Some initial event/triggers var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_endRequest(function () { //Copy of some initial event/triggers }); }); 

为什么我要使用你要求的endRequest? 好吧,因为updatepanels在异步回发后基本上丢弃了所有事件,因为此时(再次更新后)的HTML再次呈现,此时所有与更新面板内的任何控件相关联的事件都将被删除。 此时document.ready()当然没有运行,所以我必须重新订阅endRequest这些事件。 输入我的问题……

我有一个巨大的脑屁,我基本上拿走了所有东西,字面上文件准备就绪,并将其复制到endRequest 。 事实上,如果我没记错的话,我会读到所说的文章

无论您在文档准备中拥有什么,只需将粘贴复制到endRequest即可

那没关系,但你必须要小心。 我把没有包含在updatepanel里面的事件扔进了endRequest 。 结果是灾难性的……至少对我而言。

这些事件将被多次附加。或者基于所做的异步回发的数量。 在我的情况下,正如我在第6或第7次性能开始降级后提到的测试。 好吧,到那时我的控件多次附加到事件上。 例如,我的.apply按钮和我的dropdownlist都在我的updatepanel之外。 但是我的jQuery代码在document readyendRequest附加了我的dropdownlist的change事件。

结果最初它非常快,因为它只在document ready 。 但是当我进行异步回发时,每次都会附加这些事件。 对于n次测试,我会有n个附加事件…在我的情况下,7的测试在变更事件处理程序上产生7!

举个例子,不要为任何不在更新面板中的控件放置任何事件处理程序,例如jQuery的on()事件。 否则你会遇到我遇到的事情,因为事件发生时表现不佳。